This commit is contained in:
2025-09-12 16:42:10 +08:00
commit 0878cef03b
10 changed files with 512 additions and 0 deletions

69
lib/redis.go Normal file
View File

@ -0,0 +1,69 @@
package lib
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
"sync/atomic"
)
var (
rdb *redis.Client
ctx = context.Background()
counter uint64
)
// 初始化 Redis 客户端
func init() {
rdb = redis.NewClient(&redis.Options{
Addr: "127.0.0.1:6379",
Password: "WKJXXmPchENCYK7x",
DB: 2,
})
}
func GetAllLinks() ([]string, error) {
// 使用 LRange 获取整个列表,范围为 0 到 -1表示获取所有元素
links, err := rdb.LRange(ctx, "links", 0, -1).Result()
if err != nil {
return nil, err
}
return links, nil
}
// 添加链接到 Redis List
func AddLink(link string) error {
return rdb.LPush(ctx, "links", link).Err()
}
// 删除指定的链接
func DeleteLink(link string) error {
// LREM count 参数为 0 表示删除所有匹配的元素
return rdb.LRem(ctx, "links", 0, link).Err()
}
// 修改指定索引位置的链接
func UpdateLink(index int64, newLink string) error {
return rdb.LSet(ctx, "links", index, newLink).Err()
}
func GetLink() (string, error) {
length, err := rdb.LLen(ctx, "links").Result()
if err != nil || length == 0 {
return "", fmt.Errorf("no available links")
}
index := atomic.AddUint64(&counter, 1) % uint64(length)
return rdb.LIndex(ctx, "links", int64(index)).Result()
}
func ClearRedis() string {
// 清空当前数据库中的所有数据
err := rdb.FlushDB(ctx).Err()
if err != nil {
mes := fmt.Sprintf("无法清空链接: %v", err)
return mes
} else {
return "成功清空链接,请即使新增链接"
}
}

257
lib/tg.go Normal file
View File

@ -0,0 +1,257 @@
package lib
import (
"fmt"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"log"
"math/rand"
"net/url"
"strconv"
"time"
)
var (
bot *tgbotapi.BotAPI
err error
)
var userState = make(map[string]int)
var linkState = make(map[int]string)
func init() {
// 7632434434:AAG-Ac9RlLTKHnGtOSUe8_SUD8j_nDWz_AU
// bot, err = tgbotapi.NewBotAPI("7322066653:AAG3qYWH5jzAW8ZtdFEWg0Fjy0Il5FLOsg8")
bot, err = tgbotapi.NewBotAPI("7455883553:AAEwoqr6EAUZehhpJUWkhPiu4r3W-fngelE")
if err != nil {
log.Panic(err)
}
bot.Debug = true
log.Printf("Authorized on account %s", bot.Self.UserName)
//db.Test()
}
func number1() int {
rand.Seed(time.Now().UnixNano())
// 生成一个0到100之间的随机整数
randomNumber := rand.Intn(100) // 生成一个 [0, 100) 范围内的随机数
return randomNumber
}
func number2() int {
rand.Seed(time.Now().UnixNano())
// 生成一个0到100之间的随机整数
randomNumber := rand.Intn(10) // 生成一个 [0, 10) 范围内的随机数
return randomNumber
}
func Start() {
u := tgbotapi.NewUpdate(0)
u.Timeout = 60
updates := bot.GetUpdatesChan(u)
for update := range updates {
if update.Message != nil { // If we got a message7227826365
//if update.Message
if update.Message.Chat.ID == 6918349523 || update.Message.Chat.ID == 7227826365 {
//if update.Message.Chat.ID == 6918349523 {
chatID := update.Message.Chat.ID
userInput := update.Message.Text
chatIDString := strconv.FormatInt(chatID, 10)
// 定义底部菜单
menu := tgbotapi.NewReplyKeyboard(
tgbotapi.NewKeyboardButtonRow(
tgbotapi.NewKeyboardButton("链接列表"),
tgbotapi.NewKeyboardButton("增加链接"),
),
tgbotapi.NewKeyboardButtonRow(
tgbotapi.NewKeyboardButton("删除链接"),
tgbotapi.NewKeyboardButton("清空链接"),
),
)
var responseText string
switch userInput {
case "链接列表":
linkList, _ := GetAllLinks()
if len(linkList) == 0 {
responseText = "No links available"
} else {
for v, link := range linkList {
vs := strconv.Itoa(v + 1)
responseText += "链接" + vs + ":\t" + link + "\n"
}
}
case "增加链接":
responseText = "请输入你要增加的链接(例: https://google.com),如果需要取消,请发送任意数字"
str := strconv.FormatInt(chatID, 10)
userState[str] = 60224466
userState[str+"_a"] = 0
userState[str+"_b"] = 0
// 隐藏键盘
removeKeyboard := tgbotapi.NewRemoveKeyboard(true)
msg := tgbotapi.NewMessage(update.Message.Chat.ID, responseText)
msg.ReplyMarkup = removeKeyboard
if _, err := bot.Send(msg); err != nil {
log.Println("Error sending message:", err)
}
continue
case "删除链接":
linkList, _ := GetAllLinks()
if len(linkList) == 0 {
responseText = "No links available"
} else {
responseText = "请发送你要删除链接的序号,如果需要取消,请发送任意数字\t()\n"
for v, link := range linkList {
vs := strconv.Itoa(v)
responseText += vs + ".\t" + link + "\n"
linkState[v] = link
}
}
str := strconv.FormatInt(chatID, 10)
userState[str] = 60224467
userState[str+"_a"] = 0
userState[str+"_b"] = 0
case "清空链接":
a := number1()
b := number2()
msgLink := fmt.Sprintf("为了您的安全输入验证: %d+%d=?", a, b)
responseText = msgLink
str := strconv.FormatInt(chatID, 10)
userState[str] = 60224465
userState[str+"_a"] = a
userState[str+"_b"] = b
default:
responseText = "请选择接下来的操作"
}
// 发送响应消息
msg := tgbotapi.NewMessage(update.Message.Chat.ID, responseText)
msg.ReplyMarkup = menu // 保持底部菜单
if _, err := bot.Send(msg); err != nil {
log.Println("Error sending message:", err)
}
// 检查用户状态
if state, exists := userState[chatIDString]; exists && state == 60224465 {
a := userState[chatIDString+"_a"] // 获取存储的 a 和 b
b := userState[chatIDString+"_b"]
// 验证用户输入
expectedAnswer := a + b
userAnswer, err := strconv.Atoi(userInput)
if err != nil {
msg := tgbotapi.NewMessage(chatID, "请输入计算结果")
inlineKeyboard := tgbotapi.NewInlineKeyboardMarkup(
tgbotapi.NewInlineKeyboardRow(
tgbotapi.NewInlineKeyboardButtonData("取消清空", "Cancel"),
),
)
msg.ReplyMarkup = inlineKeyboard
bot.Send(msg)
continue
}
if userAnswer == expectedAnswer {
msg := tgbotapi.NewMessage(chatID, "验证通过!开始删除操作...")
bot.Send(msg)
msgs := tgbotapi.NewMessage(chatID, ClearRedis())
bot.Send(msgs)
delete(userState, chatIDString) // 删除状态
delete(userState, chatIDString+"_a")
delete(userState, chatIDString+"_b")
} else {
delete(userState, chatIDString) // 删除状态
delete(userState, chatIDString+"_a")
delete(userState, chatIDString+"_b")
}
} else if state, exists := userState[chatIDString]; exists && state == 60224466 {
// 增加链接
if _, err := url.ParseRequestURI(userInput); err != nil {
delete(userState, chatIDString) // 删除状态
delete(userState, chatIDString+"_a")
delete(userState, chatIDString+"_b")
} else {
AddLink(userInput)
msg := tgbotapi.NewMessage(chatID, "链接增加成功")
bot.Send(msg)
delete(userState, chatIDString) // 删除状态
delete(userState, chatIDString+"_a")
delete(userState, chatIDString+"_b")
}
} else if state, exists := userState[chatIDString]; exists && state == 60224467 {
//删除链接
num, err := strconv.Atoi(userInput)
fmt.Println(len(linkState))
if err != nil {
//msg := tgbotapi.NewMessage(chatID, "请输入序号")
//inlineKeyboard := tgbotapi.NewInlineKeyboardMarkup(
// tgbotapi.NewInlineKeyboardRow(
// tgbotapi.NewInlineKeyboardButtonData("取消删除", "Cancel"),
// ),
//)
//msg.ReplyMarkup = inlineKeyboard
//bot.Send(msg)
} else {
if len(linkState) > num && num >= 0 {
DeleteLink(linkState[num])
delete(userState, chatIDString) // 删除状态
delete(userState, chatIDString+"_a")
delete(userState, chatIDString+"_b")
for key := range linkState {
delete(linkState, key)
}
msg := tgbotapi.NewMessage(chatID, "删除成功")
bot.Send(msg)
} else {
delete(userState, chatIDString) // 删除状态
delete(userState, chatIDString+"_a")
delete(userState, chatIDString+"_b")
for key := range linkState {
delete(linkState, key)
}
}
}
} else {
//Menus(&update, "请选择你要操作的内容")
}
}
} else if update.CallbackQuery != nil { // 按钮点击事件
callback := update.CallbackQuery
log.Printf("Button clicked: %s", callback.Data)
switch callback.Data {
case "Cancel":
str := strconv.FormatInt(callback.Message.Chat.ID, 10)
delete(userState, str) // 删除状态
delete(userState, str+"_a")
delete(userState, str+"_b")
if len(linkState) > 0 {
for key := range linkState {
delete(linkState, key)
}
}
msg := tgbotapi.NewMessage(update.CallbackQuery.Message.Chat.ID, "已取消")
if _, err := bot.Send(msg); err != nil {
log.Println("Failed to send message:", err)
}
}
}
}
}