-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
152 lines (135 loc) · 4.13 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
package main
import (
"fmt"
"github.com/go-co-op/gocron/v2"
"github.com/tidwall/gjson"
"log"
"os"
"path"
"time"
"ttauto/internal/ttapi"
)
var (
phone string
captchaCode string
SMSCode string
unionID string
token string
unionIDFile string
)
var cronScheduler gocron.Scheduler
func init() {
cronScheduler, _ = gocron.NewScheduler()
}
func main() {
fmt.Println("欢迎使用 TTAuto\n")
programPath, err := os.Getwd()
if err != nil {
log.Panic(err)
}
unionIDFile = path.Join(programPath, "union_id")
_, err = os.Stat(unionIDFile) // 判断 union_id 文件是否存在
if err != nil {
fmt.Println("请登陆甜糖心愿,共3步")
login()
fmt.Println("登陆成功,开始执行后续程序...\n")
}
// 读取本地 union_id,并验证是否可用
fmt.Println("已有 union_id,正在验证是否可用...")
rawFile, err := os.ReadFile(unionIDFile)
if err != nil {
log.Panic("读取 union_id 文件失败:", err)
}
unionID = string(rawFile)
response, err := ttapi.RefreshToken(unionID)
if err != nil {
log.Panic("刷新 token 失败,请重新登陆\n", err)
}
if gjson.Get(response, "errCode").Int() != 0 { // 判断是否刷新 token 成功
log.Panic("无法刷新 token,union_id 无效,可能需要重新登陆\n", response)
}
fmt.Println("union_id 有效,token 刷新成功!")
token = gjson.Get(response, "data.token").String()
// 每40小时定时刷新 token
cronScheduler.NewJob(
gocron.DurationJob(40*time.Hour),
gocron.NewTask(func() {
response, err := ttapi.RefreshToken(unionID)
if err != nil {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "【定时任务】定时刷新 token 失败,请重新登陆\n", err)
}
token = gjson.Get(response, "data.token").String()
fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "【定时任务】定时刷新 token 成功")
}),
)
// 定时任务,每天 3:00 定时执行一次
fmt.Println("【定时任务】已开启定时任务,每天 3:00 定时签到")
cronScheduler.NewJob(
gocron.CronJob(`TZ=Asia/Shanghai 0 3 * * *`, false),
gocron.NewTask(func() {
signInInfo, err := ttapi.SignIn(token)
if err != nil || gjson.Get(signInInfo, "errCode").Int() != 0 {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "【定时签到】签到失败:", signInInfo, err)
} else {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"), "【定时签到】签到成功!")
}
}),
)
cronScheduler.Start()
// 阻塞
select {}
}
// 登陆
func login() {
// 获取手机号
fmt.Println("1.请输入电话号码:")
fmt.Scanln(&phone)
// 获取4位数图形验证码
captchaID, captchaURL, err := ttapi.SendCaptchaRequest()
if err != nil {
log.Panic(err)
}
fmt.Println(captchaURL, "\n2.请访问上面的网址,然后在此输入4位验证码:")
fmt.Scanln(&captchaCode)
// 获取短信验证码
retInfo, err := ttapi.SendSMS(phone, captchaID, captchaCode)
if err != nil {
log.Panic(err)
}
if retInfo != "{}" {
log.Panic("短信发送失败,请检查手机号是否正确\n", retInfo)
} else {
fmt.Println("3.短信发送成功,请稍后输入短信验证码:")
}
reLogin:
fmt.Scanln(&SMSCode)
// 短信验证码登陆
userInfo, err := ttapi.Login(phone, SMSCode)
if gjson.Get(userInfo, "errCode").Int() == 1 {
fmt.Println("验证码错误,请重新输入验证码:")
goto reLogin
} else if gjson.Get(userInfo, "errCode").Int() != 0 {
log.Panic("登陆失败,请检查其他设置是否正确\n", userInfo)
return
}
fmt.Println("登陆成功!")
fmt.Printf(`===================================
用户名:%s
手机号:%s
等级:%s
union_id:%s
token:%s
===================================
`,
gjson.Get(userInfo, "data.nickName"),
gjson.Get(userInfo, "data.phoneNum"),
gjson.Get(userInfo, "data.level"),
gjson.Get(userInfo, "data.union_id"),
gjson.Get(userInfo, "data.token"))
// 保存 union_id
err = os.WriteFile(unionIDFile, []byte(gjson.Get(userInfo, "data.union_id").String()), 0644)
if err != nil {
log.Panic("保存 union_id 失败,请手动保存\n", err)
}
fmt.Println("已将 union_id 保存至以下文件中\n", unionIDFile)
}