276 lines
6.2 KiB
Go
276 lines
6.2 KiB
Go
package lib
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
|
|
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
|
|
"github.com/google/uuid"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var (
|
|
handles sync.Map
|
|
datas sync.Map
|
|
)
|
|
|
|
func init() {
|
|
newPlugin("/login", login)
|
|
newPlugin("/get_users", getAllUser)
|
|
newPlugin("/study", study)
|
|
newPlugin("/get_scores", getScores)
|
|
newPlugin("/quit", quit)
|
|
}
|
|
|
|
//Telegram
|
|
// @Description:
|
|
//
|
|
type Telegram struct {
|
|
Token string
|
|
ChatId int64
|
|
bot *tgbotapi.BotAPI
|
|
Proxy string
|
|
}
|
|
|
|
type Handle interface {
|
|
getCommand() string
|
|
execute(bot *Telegram, args []string)
|
|
}
|
|
|
|
type Mather struct {
|
|
command string
|
|
handle func(bot *Telegram, args []string)
|
|
}
|
|
|
|
func (m Mather) getCommand() string {
|
|
return m.command
|
|
}
|
|
|
|
func (m Mather) execute(bot *Telegram, args []string) {
|
|
m.handle(bot, args)
|
|
}
|
|
|
|
func newPlugin(command string, handle func(bot *Telegram, args []string)) {
|
|
handles.Store(command, handle)
|
|
}
|
|
|
|
//Init
|
|
/**
|
|
* @Description:
|
|
* @receiver t
|
|
* @return func(kind string, message string)
|
|
*/
|
|
func (t *Telegram) Init() {
|
|
uri, err := url.Parse(t.Proxy)
|
|
t.bot, err = tgbotapi.NewBotAPIWithClient(t.Token, tgbotapi.APIEndpoint, &http.Client{Transport: &http.Transport{
|
|
// 设置代理
|
|
Proxy: http.ProxyURL(uri),
|
|
}})
|
|
|
|
if err != nil {
|
|
log.Errorln("telegram token鉴权失败或代理使用失败")
|
|
log.Errorln(err.Error())
|
|
}
|
|
|
|
channel := t.bot.GetUpdatesChan(tgbotapi.NewUpdate(1))
|
|
|
|
go func() {
|
|
for {
|
|
update := <-channel
|
|
handles.Range(func(key, value interface{}) bool {
|
|
if strings.Split(update.Message.Text, " ")[0] == key.(string) {
|
|
go func() {
|
|
defer func() {
|
|
err := recover()
|
|
if err != nil {
|
|
|
|
}
|
|
}()
|
|
(value.(func(bot *Telegram, args []string)))(t, strings.Split(update.Message.Text, " ")[1:])
|
|
}()
|
|
}
|
|
return true
|
|
})
|
|
}
|
|
}()
|
|
|
|
_, err = t.bot.Request(tgbotapi.NewSetMyCommands(
|
|
tgbotapi.BotCommand{Command: "login", Description: "登录一个账号"},
|
|
tgbotapi.BotCommand{Command: "get_users", Description: "获取所有cookie有效的用户"},
|
|
tgbotapi.BotCommand{Command: "study", Description: "对一个账户进行学习"},
|
|
tgbotapi.BotCommand{Command: "get_scores", Description: "获取用户成绩"},
|
|
tgbotapi.BotCommand{Command: "quit", Description: "退出所有正在学习的实例"},
|
|
))
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
func (t *Telegram) SendPhoto(image []byte) {
|
|
photo := tgbotapi.NewPhoto(t.ChatId, tgbotapi.FileBytes{
|
|
Name: "login code",
|
|
Bytes: image,
|
|
})
|
|
_, err := t.bot.Send(photo)
|
|
if err != nil {
|
|
log.Errorln("发送图片信息失败")
|
|
log.Errorln(err.Error())
|
|
return
|
|
}
|
|
}
|
|
|
|
func (t *Telegram) SendMsg(message string) {
|
|
msg := tgbotapi.NewMessage(t.ChatId, message)
|
|
t.bot.Send(msg)
|
|
}
|
|
|
|
func login(bot *Telegram, args []string) {
|
|
log.Infoln(args)
|
|
go func() {
|
|
defer func() {
|
|
err := recover()
|
|
if err != nil {
|
|
log.Errorln(err)
|
|
}
|
|
}()
|
|
core := Core{
|
|
pw: nil,
|
|
browser: nil,
|
|
context: nil,
|
|
ShowBrowser: false,
|
|
Push: func(kind string, message string) {
|
|
if kind == "image" {
|
|
bytes, _ := base64.StdEncoding.DecodeString(message)
|
|
bot.SendPhoto(bytes)
|
|
} else if kind == "markdown" {
|
|
newMessage := tgbotapi.NewMessage(bot.ChatId, message)
|
|
newMessage.ParseMode = tgbotapi.ModeMarkdownV2
|
|
bot.bot.Send(newMessage)
|
|
} else {
|
|
bot.SendMsg(message)
|
|
}
|
|
},
|
|
}
|
|
core.Init()
|
|
defer core.Quit()
|
|
_, err := core.Login()
|
|
if err != nil {
|
|
bot.SendMsg(err.Error())
|
|
return
|
|
}
|
|
bot.SendMsg("登录成功")
|
|
}()
|
|
}
|
|
|
|
func getAllUser(bot *Telegram, args []string) {
|
|
users, err := GetUsers()
|
|
if err != nil {
|
|
bot.SendMsg("获取用户失败" + err.Error())
|
|
return
|
|
}
|
|
message := fmt.Sprintf("共获取到%v个有效用户信息\n", len(users))
|
|
for i, user := range users {
|
|
message += fmt.Sprintf("%v %v", i, user.Nick)
|
|
message += "\n"
|
|
}
|
|
bot.SendMsg(message)
|
|
}
|
|
|
|
func study(bot *Telegram, args []string) {
|
|
users, err := GetUsers()
|
|
if err != nil {
|
|
bot.SendMsg(err.Error())
|
|
return
|
|
}
|
|
var cookies []Cookie
|
|
if len(users) == 1 {
|
|
bot.SendMsg("仅存在一名用户信息,自动进行学习")
|
|
cookies = users[0].Cookies
|
|
} else if len(users) == 0 {
|
|
bot.SendMsg("未发现用户信息,请输入/login进行用户登录")
|
|
return
|
|
} else {
|
|
if len(args) < 0 {
|
|
bot.SendMsg("存在多名用户,未输入用户序号")
|
|
return
|
|
} else {
|
|
i, err := strconv.Atoi(args[0])
|
|
if err != nil {
|
|
bot.SendMsg(err.Error())
|
|
return
|
|
}
|
|
cookies = users[i].Cookies
|
|
}
|
|
}
|
|
core := Core{
|
|
pw: nil,
|
|
browser: nil,
|
|
context: nil,
|
|
ShowBrowser: false,
|
|
Push: func(kind string, message string) {
|
|
switch {
|
|
case kind == "image":
|
|
bytes, _ := base64.StdEncoding.DecodeString(message)
|
|
bot.SendPhoto(bytes)
|
|
case kind == "markdown":
|
|
newMessage := tgbotapi.NewMessage(bot.ChatId, message)
|
|
newMessage.ParseMode = tgbotapi.ModeMarkdownV2
|
|
_, _ = bot.bot.Send(newMessage)
|
|
|
|
default:
|
|
bot.SendMsg(message)
|
|
}
|
|
},
|
|
}
|
|
|
|
u := uuid.New().String()
|
|
bot.SendMsg("已创建运行实例:" + u)
|
|
datas.Store(u, &core)
|
|
defer datas.Delete(u)
|
|
core.Init()
|
|
defer core.Quit()
|
|
core.LearnArticle(cookies)
|
|
core.LearnVideo(cookies)
|
|
core.RespondDaily(cookies, "daily")
|
|
core.RespondDaily(cookies, "daily")
|
|
core.RespondDaily(cookies, "weekly")
|
|
core.RespondDaily(cookies, "special")
|
|
score, _ := GetUserScore(cookies)
|
|
bot.SendMsg(fmt.Sprintf("当前学习总积分:%v,今日得分:%v", score.TotalScore, score.TodayScore))
|
|
}
|
|
|
|
func getScores(bot *Telegram, args []string) {
|
|
users, err := GetUsers()
|
|
if err != nil {
|
|
log.Errorln(err.Error())
|
|
bot.SendMsg("获取用户信息失败" + err.Error())
|
|
return
|
|
}
|
|
message := fmt.Sprintf("共获取到%v个有效用户信息\n", len(users))
|
|
for _, user := range users {
|
|
message += user.Nick + "\n"
|
|
score, err := GetUserScore(user.Cookies)
|
|
if err != nil {
|
|
message += err.Error() + "\n"
|
|
}
|
|
message += foramet_score(score) + "\n"
|
|
}
|
|
bot.SendMsg(message)
|
|
}
|
|
|
|
func quit(bot *Telegram, args []string) {
|
|
if len(args) < 1 {
|
|
datas.Range(func(key, value interface{}) bool {
|
|
bot.SendMsg("已退出运行实例" + key.(string))
|
|
core := value.(*Core)
|
|
core.Quit()
|
|
return true
|
|
})
|
|
}
|
|
}
|