go-weixin-ilink:用 Go 给微信 iLink 机器人写业务,就像写 HTTP 路由一样简单

3 月 30 日
 yhtbiy

🤖 go-weixin-ilink:用 Go 给微信 iLink 机器人写业务,就像写 HTTP 路由一样简单

开源地址: https://github.com/dobest1024/go-weixin-ilink


背景

微信 iLink 开放了机器人接入能力,但官方只有 TypeScript SDK ,没有 Go 版本。

如果你的后端是 Go ,想接入 iLink 机器人,就需要自己摸索协议——AES 加解密、长轮询、context_token 管理、CDN 媒体上传……踩坑成本不低。

于是我写了这个 SDK ,把协议细节全部封装掉,对外只暴露一套简单的 Handler API 。


最快上手:30 行跑起来一个 Echo Bot

bot := ilink.NewBot(
    ilink.WithTokenFile(".bot-token.json"),
    ilink.WithSyncBufFile(".bot-syncbuf"), // 重启不重放历史消息
)

bot.OnText(func(ctx *ilink.Context) {
    ctx.ReplyText("收到:" + ctx.Text())
})

bot.Login(context.Background(), ilink.TerminalQR) // 终端打印二维码,扫一下
bot.Run(context.Background())

扫码后 token 自动写文件,下次重启不需要再扫。


消息路由——告别 if/else 大山

参考 gin 的设计,用声明式路由分发消息:

bot.OnTextPrefix("/help", showHelp)         // 前缀匹配
bot.OnTextContains("关键词", handleKeyword) // 包含匹配
bot.OnTextMatch(`^\d{6}$`, handleCode)      // 正则匹配
bot.OnImage(handleImage)
bot.OnVoice(handleVoice)
bot.OnFile(handleFile)
bot.OnPrivateText(handlePrivate)            // 仅私聊文本
bot.OnGroupText(handleGroup)               // 仅群内文本

中间件——洋葱模型,和 gin 一样用

// 日志
bot.Use(func(ctx *ilink.Context) {
    log.Printf("from=%s text=%q", ctx.UserID(), ctx.Text())
    ctx.Next()
})

// 限流:每人每 3 秒 1 条
bot.Use(rateLimiter(3 * time.Second))

// 白名单
bot.Use(func(ctx *ilink.Context) {
    if !whitelist[ctx.UserID()] {
        ctx.ReplyText("无权限")
        ctx.Abort()
        return
    }
    ctx.Next()
})

引用消息支持

用户长按消息引用后发送,可以直接读取被引用的内容:

bot.OnText(func(ctx *ilink.Context) {
    if ctx.HasQuote() {
        ctx.ReplyText("你引用了:" + ctx.QuotedText())
        return
    }
    ctx.ReplyText(ctx.Text())
})

媒体收发:图片、语音、文件、视频

下载和发送各一行,加解密全在 SDK 内部:

bot.OnImage(func(ctx *ilink.Context) {
    data, _ := ctx.DownloadImage(ctx.Message.GetImageItem())
    result, _ := ctx.Upload(data, "image")
    ctx.ReplyItems([]ilink.MessageItem{ilink.BuildImageItem(result)})
})

打字状态

接 AI 接口时,让用户看到"对方正在输入"的体验:

bot.OnText(func(ctx *ilink.Context) {
    ctx.Typing()
    defer ctx.StopTyping()
    ctx.ReplyText(callAI(ctx.Text()))
})

typing_ticket 按用户自动缓存 24 小时,无需手动管理。


生产可用的细节


存储可替换

内置文件实现,生产环境可以换成 Redis 或数据库:

bot := ilink.NewBot(
    ilink.WithTokenStore(myRedisTokenStore),
    ilink.WithContextTokenStore(myDBCtxStore),
    ilink.WithSyncBufStore(myRedisSyncBuf),
)

安装

go get github.com/dobest1024/go-weixin-ilink

需要 Go 1.21+,零外部依赖。


适合谁用


GitHub: https://github.com/dobest1024/go-weixin-ilink 欢迎 star 、issue 和 PR 。

1110 次点击
所在节点    分享创造
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/1202115

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX