This repository has been archived by the owner on Sep 8, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
233 lines (196 loc) · 6.74 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
package main
import (
"fmt"
"log"
"os"
"strconv"
"strings"
"time"
"github.com/eatmoreapple/openwechat"
"github.com/joho/godotenv"
"github.com/skip2/go-qrcode"
)
// 跪拜赛博神佛事件
func Pray() {
Announcement := `
gocq-wechat client,Powered by barryblueice。
本项目遵循GPLv3协议开源,不鼓励、不支持一切商业使用。
该项目仅供学习交流,严禁用于商业用途,请于24小时内删除。
`
_pray := `
_oo0oo_
o8888888o
88" . "88
(| -_- |)
0\ = /0
___/'---'\___
.' \\| |// '.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' |_/ |
\ .-\__ '-' ___/-. /
___'. .' /--.--\ '. .'___
."" '< '.___\_<|>_/___.' >' "".
| | : '- \'.;'\ _ /';.'/ - ' : | |
\ \ '_. \_ __\ /__ _/ .-' / /
====='-.____'.___ \_____/___.-'___.-'=====
'=---='
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
佛祖保佑 永不宕机 永无BUG
`
log.Println(Announcement)
time.Sleep(1 * time.Second)
log.Println(_pray)
time.Sleep(1 * time.Second)
}
// 控制台二维码事件
func ConsoleQrCode(uuid string) {
q, _ := qrcode.New("https://login.weixin.qq.com/l/"+uuid, qrcode.Low)
fmt.Println(q.ToString(true))
}
// 登录处理事件
func login_requests(bot *openwechat.Bot, reloadStorage openwechat.HotReloadStorage) error {
var err error // 在函数内部定义err变量
if _, err = os.Stat("login_token.json"); err == nil {
log.Println("已检测到鉴权文件,client将根据该鉴权文件执行登录事件……")
err = bot.HotLogin(reloadStorage)
if err != nil {
log.Println("登录失败!鉴权文件可能已过期。正在启动扫码登录事件……")
time.Sleep(1 * time.Second)
log.Println("请扫描二维码登录:")
err = bot.HotLogin(reloadStorage, openwechat.NewRetryLoginOption())
if err != nil {
log.Fatalf("登录失败!错误:%s!", err)
}
} else {
log.Println("登录成功")
err = nil
}
} else if os.IsNotExist(err) {
log.Println("登录失败!未检测到鉴权文件!正在启动扫码登录事件……")
time.Sleep(1 * time.Second)
log.Println("请扫描二维码登录:")
err = bot.HotLogin(reloadStorage, openwechat.NewRetryLoginOption())
if err != nil {
log.Fatalf("登录失败!错误:%s!", err)
}
}
return err
}
func isEmpty(s string) bool {
return len(s) == 0
}
// 环境参数处理事件
func EnvHandle() (string, string, string) {
if _, err := os.Stat(".env"); err != nil {
// envContent := []byte("# LOGIN_MODE登录模式:确认登录模式\n# 默认可选两种登录模式:1.WEB(网站模式);2.DESKTOP(桌面模式)\nLOGIN_MODE = \"\"\n\n# PORT:登录端口\nPORT = \n\n# 反向连接地址(暂时仅支持反向连接)\nURL = \"\"")
envContent := []byte(`
# LOGIN_MODE登录模式:确认登录模式
# 默认可选两种登录模式:1.WEB(网站模式);2.DESKTOP(桌面模式)
LOGIN_MODE = ""
# PORT:登录端口
PORT =
# 反向连接地址(暂时仅支持反向连接)
URL = ""
`)
err := os.WriteFile(".env", envContent, 0644)
log.Println("环境文件已成功创建并写入默认值,请修改环境文件默认值后重新启动client")
if err != nil {
log.Fatalf("无法创建环境文件文件: %v", err)
}
os.Exit(1)
}
err := godotenv.Load(".env")
if err != nil {
log.Fatalf("无法加载环境文件文件: %v", err)
}
LOGIN_MODE := os.Getenv("LOGIN_MODE")
PORT := os.Getenv("PORT")
URL := os.Getenv("URL")
if isEmpty(strings.TrimSpace(LOGIN_MODE)) {
log.Fatalf("LOGIN_MODE不能为空,请检查参数!")
} else if isEmpty(strings.TrimSpace(PORT)) {
log.Fatalf("PORT不能为空,请检查参数!")
} else if isEmpty(strings.TrimSpace(URL)) {
log.Fatalf("URL不能为空,请检查参数!")
}
return LOGIN_MODE, PORT, URL
}
func main() {
Pray()
LOGIN_MODE, PORT, URL := EnvHandle()
log.Println("开始执行登录事件")
// 登录情况判断:网页 & 桌面端
var bot *openwechat.Bot
if LOGIN_MODE == "DESKTOP" {
bot = openwechat.DefaultBot(openwechat.Desktop)
} else if LOGIN_MODE == "WEB" {
bot = openwechat.DefaultBot()
} else {
log.Fatalf("LOGIN_MODE参数不合法,请检查参数!")
}
log.Printf("登录模式:%s", LOGIN_MODE)
// 端口判断:只是判断端口在不在可用范围内
TargetPort, err := strconv.Atoi(PORT)
if err != nil {
log.Fatalf("端口参数不合法,请检查参数!")
}
if TargetPort < 0 && TargetPort > 65535 {
log.Fatalf("端口参数不合法,请检查参数!")
}
log.Printf("端口号:%s", PORT)
// 连接事件预留,这里暂且只留反向连接
log.Printf("连接地址:%s", URL)
// 登录事件处理
reloadStorage := openwechat.NewFileHotReloadStorage("login_token.json")
bot.UUIDCallback = ConsoleQrCode
defer reloadStorage.Close()
err = login_requests(bot, reloadStorage)
if err != nil {
log.Fatalf("登录失败!错误:%s!", err)
}
self, err := bot.GetCurrentUser()
if err != nil {
log.Fatalf("登录信息获取失败!错误:%s!", err)
}
// 登录成功后
// SelfID := self.ID()
SelfID := strconv.Itoa(int(self.ID()))
SelfNickname := self.NickName
log.Printf("欢迎回来!用户:%s,wxid:%s", SelfNickname, SelfID)
go WebsocketReverseInit(URL, SelfID, self)
// 主进程,处理消息
bot.MessageHandler = func(msg *openwechat.Message) {
MsgDetail := msg.Content
if !isEmpty(MsgDetail) {
if msg.IsSendByFriend() {
sender, _ := msg.Sender()
log.Printf("用户 %s(%s)发送私聊消息:%s", sender.NickName, sender.ID(), MsgDetail)
if conn != nil {
RecievePrivateText(self, 0, sender.ID(), MsgDetail)
}
} else if msg.IsSendByGroup() {
IsAt := false
group, _ := msg.Sender()
sender, _ := msg.SenderInGroup()
if msg.IsAt() {
IsAt = true
}
if sender == nil {
log.Printf("sender is nil")
return
}
if group == nil {
log.Printf("group is nil")
return
}
log.Printf("用户 %s 于群聊 %s(%s)发送消息:%s", sender.NickName, group.NickName, group.ID(), MsgDetail)
if conn != nil {
RecieveGroupText(self, 0, sender.ID(), MsgDetail, group.ID(), IsAt)
}
}
}
}
bot.Block()
}