
https://github.com/songtianyi/wechat-go
go 版本 wechat web api , 十分欢迎 gopher 参与开发更多有趣实用的插件。同时求一个前端,写两个页面给普通用户使用。
go get -u -v github.com/songtianyi/wechat-go mkdir $GOPATH/src/golang.org/x cd $GOPATH/src/golang.org/x git clone https://github.com/golang/net.git git clone https://github.com/golang/text.git package main import ( "github.com/songtianyi/rrframework/logs" "github.com/songtianyi/wechat-go/plugins/faceplusplus" "github.com/songtianyi/wechat-go/wxweb" "github.com/songtianyi/wechat-go/plugins/wxweb/gifer" "github.com/songtianyi/wechat-go/plugins/wxweb/replier" "github.com/songtianyi/wechat-go/plugins/wxweb/switcher" ) func main() { // create session session, err := wxweb.CreateSession(nil, nil, wxweb.TERMINAL_MODE) if err != nil { logs.Error(err) return } // add plugins for this session, they are disabled by default faceplusplus.Register(session) replier.Register(session) switcher.Register(session) gifer.Register(session) // enable plugin session.HandlerRegister.EnableByName("switcher") session.HandlerRegister.EnableByName("faceplusplus") if err := session.LoginAndServe(); err != nil { logs.Error("session exit, %s", err) } } 一个管理插件的插件
#关闭某个插件, 在微信聊天窗口输入 disable faceplusplus #开启某个插件, 在微信聊天窗口输入 enable faceplusplus #查看所有插件信息, 在微信聊天窗口输入 dump 对收到的图片做面部识别,返回性别和年龄
以收到的文字消息为关键字做 gif 搜索,返回 gif 图, 注意返回的 gif 可能尺度较大,比如文字消息中包含“污”等关键词。
对收到的文字 /图片消息,做自动应答,回复固定文字消息
随机获取一张美女图片, 在聊天窗口输入
美女 获取一则笑话, 在聊天窗口输入
笑话 消息撤回插件, 3s 后自动撤回手机端所发的文本消息. 机器人发出的消息需要自己在插件里写撤回逻辑.
package demo // 以插件名命令包名 import ( "github.com/songtianyi/rrframework/logs" // 导入日志包 "github.com/songtianyi/wechat-go/wxweb" // 导入协议包 ) // 必须有的插件注册函数 // 指定 session, 可以对不同用户注册不同插件 func Register(session *wxweb.Session) { // 将插件注册到 session // 第一个参数: 指定消息类型, 所有该类型的消息都会被转发到此插件 // 第二个参数: 指定消息处理函数, 消息会进入此函数 // 第三个参数: 自定义插件名,不能重名, switcher 插件会用到此名称 session.HandlerRegister.Add(wxweb.MSG_TEXT, wxweb.Handler(demo), "textdemo") // 可以多个个消息类型使用同一个处理函数,也可以分开 session.HandlerRegister.Add(wxweb.MSG_IMG, wxweb.Handler(demo), "imgdemo") } // 消息处理函数 func demo(session *wxweb.Session, msg *wxweb.ReceivedMessage) { // 可选:避免此插件对所有群 /联系人生效 可以用 contact manager 来过滤 contact := session.Cm.GetContactByUserName(msg.FromUserName) if cOntact== nil { logs.Error("ignore the messages from", msg.FromUserName) return } // 可选: 过滤消息类型 if msg.MsgType == wxweb.MSG_IMG { return } // 可选: 根据 wxweb.User 数据结构中的数据来过滤 if contact.PYQuanPin != "songtianyi" { // 根据用户昵称的拼音全拼来过滤 return } // 可选:过滤和自己无关的群组消息 if msg.IsGroup && msg.Who != session.Bot.UserName { return } // 取出收到的内容 // 取 text logs.Info(msg.Content) //// 取 img //if b, err := session.GetImg(msg.MsgId); err == nil { // logs.Debug(string(b)) //} // anything // 回复消息 // 第一个参数: 回复的内容 // 第二个参数: 机器人 ID // 第三个参数: 联系人 /群组 /特殊账号 ID session.SendText("plugin demo", session.Bot.UserName, wxweb.RealTargetUserName(session, msg)) // 回复图片和 gif 参见 wxweb/session.go } 
抱歉,上面的example code 没及时更新,有编译错误,更正为:
package main import ( "github.com/songtianyi/rrframework/logs" "github.com/songtianyi/wechat-go/plugins/wxweb/faceplusplus" "github.com/songtianyi/wechat-go/plugins/wxweb/gifer" "github.com/songtianyi/wechat-go/plugins/wxweb/replier" "github.com/songtianyi/wechat-go/plugins/wxweb/switcher" "github.com/songtianyi/wechat-go/wxweb" ) func main() { // create session session, err := wxweb.CreateSession(nil, nil, wxweb.TERMINAL_MODE) if err != nil { logs.Error(err) return } // add plugins for this session, they are disabled by default faceplusplus.Register(session) replier.Register(session) switcher.Register(session) gifer.Register(session) // enable plugin session.HandlerRegister.EnableByName("switcher") session.HandlerRegister.EnableByName("faceplusplus") if err := session.LoginAndServe(false); err != nil { logs.Error("session exit, %s", err) } } 更多代码参见 demo project:https://github.com/songtianyi/go-aida/tree/master/demo
1 missdeer 2017 年 4 月 21 日 终于有 go 版本的来了 |
3 cccssss 2017 年 4 月 21 日 恕我愚钝, go get 一溜遍,然后复制粘贴 demo 到 main.go 然后 go run ,出来一个 "github.com/songtianyi/wechat-go/plugins/faceplusplus" 找不到 好先屏蔽,然后再运行 .\main.go:31: not enough arguments in call to session.LoginAndServe have () want (bool) 好吧,加个 false 出来一堆不知道什么东西 然后就没有然后了,楼主你确定没闹? |
4 ob 2017 年 4 月 21 日 via Android 想知道防掉线是怎么实现的? 心跳包检测地址那么多个,发现一直只有一个能用,如何第一个检测失败,后面的也一定失败。 然后只能重新登录。 |
5 spice630 OP |
6 spice630 OP |
8 spice630 OP 已加入 travis 持续集成工具,不会再出现编译问题了,不过依赖包确实有点多,网络不通畅可能会比较烦。。 |
9 buf1024 2017 年 4 月 21 日 微信的通讯协议自己破解的? |
11 zhaolion 2017 年 4 月 21 日 使用一点基本的依赖管理吧, go vendor 已经有一些能用的了,至少不会让开发一开始就一脸蒙蔽的去 go get |
12 blackFool 2017 年 4 月 21 日 最多多少钱不掉线,是可以一直不掉线吗? |
13 yangxuan8282 2017 年 4 月 22 日 好像类似 itchat? 能不能把二维码发送到邮箱,然后在邮箱那边扫码登录 |
15 spice630 OP @yangxuan8282 嗯,是 go 版本的 itchat 。可以做到,在什么情况下需要这样?目前想做个网页版扫码。 |
16 spice630 OP @blackFool 我自己运行过几个小时吧,具体的没测试过,手机版网络掉线会影响到 bot 。而且腾讯的反 robot 机制也很厉害,可能会强制重登。 |
17 spice630 OP @yangxuan8282 目前只有我一个 commiter 所以会优先考虑必要的功能,有需求可以提 issue/pr 。 |
18 ob 2017 年 4 月 22 日 via Android @spice630 对, synccheck 。 我知道有好多地址可以遍历,但是我发现如果第一个失败,你接下来遍历的结果都是失败(遍历的地址我也是抓最新的那几个) 所以感觉地址加那么多个没啥用,就 wx2.push.qq.com 一个就够了。 不知道地址有没有记对。 |
20 junred 2017 年 4 月 22 日 我现在一直在琢磨着 py 版本的~ 网页版接口限制比较多,掉线比较正常~ |
21 yangxuan8282 2017 年 4 月 22 日 @spice630 用途类似这个 drone ci 的插件: https://github.com/appleboy/drone-line ,.drone.yml 里填写邮箱,然后发二维码到邮箱扫码登录,等 build 完 docker 镜像给微信号发个通知,不过这样可能每次都要扫码,如果能扫一次然后就保存登录状态就好了 |
22 spice630 OP |
24 spice630 OP @yangxuan8282 只用扫一次,至于掉不掉要看代码是否有问题和腾讯的反 robot 机制了。 |
25 spice630 OP @yangxuan8282 line 不错 啊,还专门把 api 开放了。 |
26 yangxuan8282 2017 年 4 月 22 日 @spice630 嗯, telegram 好像也有官方的 api ,微信比较封闭 |
27 HanSonJ 2017 年 4 月 22 日 |
29 buf1024 2017 年 4 月 22 日 @spice630 web 协议的相关代码可能需要更新一下哦,我测试一下,在 WebNewLoginPage 的请求中,应答报文,并非是易<error>为根节点的 xml 数据,而是“<script>window.location.href="https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?fun=old&lang=zh_CN&scan=1492832403&ticket=A8tgH5hhPC2NuYYHLo8AapBB%40qrticket_0&uuid=wZKWg0iSWg%3D%3D"</script>”类似这样的页面刷新哦。 |
30 welsmann 2017 年 4 月 22 日 aida.... |
32 Orlion 2017 年 4 月 22 日 via Android 用 golang 快写完了突然发现还不如用 java 写,方便在安卓上跑。 |
33 ob 2017 年 4 月 23 日 |
39 spice630 OP @buf1024 并非如此。您的请求参数是什么?这个问题我一开始也遇到过 忘记是什么原因了,目前的代码是没有这个问题的。 |
43 jiumingmao 2017 年 4 月 24 日 @ob 设置备注 |
44 ob 2017 年 4 月 24 日 via Android @jiumingmao 非好友,微信群,全部一个一个备注就太麻烦了。 |
46 a308057848 2017 年 4 月 25 日 本地已跑通 log 模块死活加载不上,后面看代码用了:github.com/astaxie/beego/logs |
47 trys1 2017 年 4 月 26 日 via Android 已星 |
48 spice630 OP |
49 spice630 OP @a308057848 具体是什么错误呢 |
50 spice630 OP 已改用 vendor 来管理依赖 |
51 spice630 OP 移除了 vendor,真心不喜欢这种依赖管理方式,代码后续会提供 release。 |
52 spice630 OP |
53 buf1024 2017 年 5 月 10 日 @spice630 这个回答不成立。原因如下: 1. 用 web 浏览器可以登录 -- 这个没有完全模拟浏览器行为? 2. 用这个可以登录使用 https://github.com/Urinx/WeixinBot 3. 自己用浏览器开发者工具查看微信交互过程,设置好 user-agent,refer,cookie 等信息,可能登录。 |
55 spice630 OP update 20-17-05-11 fix issue #3 修复了一个在树莓派上运行出错的 bug |
56 spice630 OP |
57 spice630 OP update 2017-05-12 添加 消息跨群转发 插件 forwarder |
58 guotie 2017 年 5 月 13 日 怒赞! |
59 spice630 OP update 2017-05-17 可以在 gitter 上讨论吹水了!!! https://gitter.im/wechat-go/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_cOntent=badge |
60 spice630 OP update 2017-05-18 新增中英互译插件,基于有道翻译 API:)可以撩外国妹纸撩撩撩。。 |
61 only0jac 2017 年 5 月 22 日 via Android 试了一下,一小时内必掉线,且无法自动登录,楼主有这种情况吗? |
65 spice630 OP @only0jac 需要自己加这个逻辑 ``` for { if err := session.LoginAndServe(false); err != nil { logs.Error("session exit, %s", err) for i := 0; i < 3; i++ { logs.Info("trying re-login with cache") if err := session.LoginAndServe(true); err != nil { logs.Error("re-login error, %s", err) } time.Sleep(3 * time.Second) } if session, err = wxweb.CreateSession(nil, session.HandlerRegister, wxweb.TERMINAL_MODE); err != nil { logs.Error("create new sesion failed, %s", err) break } } else { logs.Info("closed by user") break } } ``` 我抽空在 windows 测试下 |
67 only0jac 2017 年 5 月 23 日 @spice630 谢谢,刚发现一个 bug,挂了有五六个小时,前一段时间正常,最后虽然后台显示没掉线,但已经收不到消息了,并且登陆手机微信也没显示网页在线 |
69 spice630 OP @only0jac 1102 没有做处理, 之前并没有遇到过这个值。拉下最新的代码,已经把所有的异常 ret 都当错误抛出去了,这样会进入重登逻辑。 目前还不清楚 1102 的意思。 挂机期间 网络有波动不? |
71 only0jac 2017 年 5 月 23 日 @spice630 vps 挂机,国内 Windows 阿里云和国外 centos 都试过,无网络波动,在线不会超过半天,必掉线,截图的%s,是我把你的 logs 替换成了 fmt.println,不过我又换回来了,用的你原先的代码,然后错误却不输出了 |
78 leopku 2017 年 5 月 24 日 via Android 之前星了,支持一下 |
80 spice630 OP @only0jac windows 端的,请在 mac 或者 linux 下使用交叉编译。 GOOS=windows GOARCH=amd64 go build travis/windows/windows_bot.go 二维码在 ../public/qrcode 下 |
85 spice630 OP https://www.zhihu.com/lives/846360223609413632 https://github.com/rixingyike/goeve-wechat-robot 都有人拿我的项目去变现了,感谢认可,也很鼓励大家这么做,这样这个项目也更有意义。但是源码中的 license 请保留,不单单是为了我自己,也为后续的贡献者。 |
86 spice630 OP wechat-go 的示例项目,目标是可以方便用户在页面上扫码登录并管理插件 https://github.com/songtianyi/go-aida |
87 myself659 2017 年 6 月 9 日 大赞 |
88 spice630 OP go-aida restful api 开发完成,这周页面应该可以好。 |
89 spice630 OP |
90 spice630 OP 新增插件 share 资源自动分发示例,纸牌屋第五季! |
91 spice630 OP |
92 spice630 OP |
94 useben 2019 年 6 月 19 日 之前用给一个 py 的做过,重构到 go 也不错 |