1.准备工作
首先我们先从Botfather机器人之父那里创建一个 bot,然后保存好token。
把创建好的bot 拉进去群组,并把bot 设置成管理员。
2.开始Go代码
首先我们在go.mod 里 引用包:
github.com/go-telegram-bot-api/telegram-bot-api
这个 telegram-bot-api 是集成好的 telegram 的接口API,方便我们调用。
初始化接口
func start(botToken string) {
var err error
bot, err = api.NewBotAPI(botToken)
if err != nil {
log.Panic(err)
}
bot.Debug = debug
log.Printf("Authorized on account: %s ID: %d", bot.Self.UserName, bot.Self.ID)
u := api.NewUpdate(0)
u.Timeout = 60
updates, err := bot.GetUpdatesChan(u)
if err != nil {
panic("Can't get Updates")
}
for update := range updates {
if update.Message == nil { // ignore any non-Message updates
continue
}
go processUpdate(&update)
}
}
定时检测是否有消息更新 每60秒检测一次
/**
* 对于每一个update的单独处理
*/
func processUpdate(update *api.Update) {
upmsg := update.Message
gid := upmsg.Chat.ID
uid := upmsg.From.ID
text := upmsg.Text
//检查是不是新加的群或者新开的人
log.Printf("用户gid:%d", gid)
log.Printf("用户uid:%d", uid)
log.Printf("用户回text:%s", text)
in := checkInGroup(gid)
if !in { //不在就需要加入, 内存中加一份, 数据库中添加一条空规则记录
common.AddNewGroup(gid)
db.AddNewGroup(gid)
log.Printf("1")
}
if upmsg.IsCommand() {
go processCommond(update)
log.Printf("2")
} else {
go processReplyCommond(update)
go processReply(update)
//新用户通过用户名检查是否是清真
if upmsg.NewChatMembers != nil {
log.Printf("3")
for _, auser := range *(upmsg.NewChatMembers) {
if checkQingzhen(auser.UserName) ||
checkQingzhen(auser.FirstName) ||
checkQingzhen(auser.LastName) {
banMember(gid, uid, -1)
}
}
}
//检查清真并剔除
if checkQingzhen(upmsg.Text) {
log.Printf("4")
_, _ = bot.DeleteMessage(api.NewDeleteMessage(gid, upmsg.MessageID))
banMember(gid, uid, -1)
}
}
}
检测消息列表 根据设置的规则回复不同的消息
func processReply(update *api.Update) {
log.Printf("5")
var msg api.MessageConfig
upmsg := update.Message
gid := upmsg.Chat.ID
uid := upmsg.From.ID
replyText := findKey(gid, upmsg.Text) //查询是否包含相应的自动回复规则
log.Printf("自动回复规则replyText:%s", replyText)
if replyText == "delete" {
log.Printf("6")
_, _ = bot.DeleteMessage(api.NewDeleteMessage(gid, upmsg.MessageID))
} else if strings.HasPrefix(replyText, "ban") {
log.Printf("7")
_, _ = bot.DeleteMessage(api.NewDeleteMessage(gid, upmsg.MessageID))
banMember(gid, uid, -1)
} else if strings.HasPrefix(replyText, "kick") {
log.Printf("8")
_, _ = bot.DeleteMessage(api.NewDeleteMessage(gid, upmsg.MessageID))
kickMember(gid, uid)
} else if strings.HasPrefix(replyText, "photo:") {
log.Printf("9")
sendPhoto(gid, replyText[6:])
} else if strings.HasPrefix(replyText, "gif:") {
log.Printf("10")
sendGif(gid, replyText[4:])
} else if strings.HasPrefix(replyText, "video:") {
log.Printf("11")
sendVideo(gid, replyText[6:])
} else if strings.HasPrefix(replyText, "file:") {
log.Printf("12")
sendFile(gid, replyText[5:])
} else if replyText != "" {
log.Printf("13")
msg = api.NewMessage(gid, replyText)
msg.DisableWebPagePreview = true
msg.ReplyToMessageID = upmsg.MessageID
sendMessage(msg)
}else if replyText == "" {
log.Printf("14")
msg = api.NewMessage(gid, "自动回复:"+upmsg.Text)
msg.DisableWebPagePreview = true
msg.ReplyToMessageID = upmsg.MessageID
sendMessage(msg)
}
}
发送文字消息
/**
* 发送文字消息
*/
func sendMessage(msg api.MessageConfig) api.Message {
if msg.Text == "" {
return api.Message{}
}
mmsg, err := bot.Send(msg)
if err != nil {
log.Println(err)
}
go deleteMessage(msg.ChatID, mmsg.MessageID)
return mmsg
}
验证:
如图我们已经实现了一个自动回复的机器人,使用Tg bot 可以做很多事情如自动推送邮箱,推送新闻,搜索爬虫,还可以支付,充满无限遐想。