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-04-21 13:56:56 +08:00
终于有 go 版本的来了
|
3
cccssss 2017-04-21 14:35:35 +08:00
恕我愚钝, 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-04-21 19:09:29 +08:00 via Android
想知道防掉线是怎么实现的?
心跳包检测地址那么多个,发现一直只有一个能用,如何第一个检测失败,后面的也一定失败。 然后只能重新登录。 |
5
spice630 OP |
6
spice630 OP |
8
spice630 OP 已加入 travis 持续集成工具,不会再出现编译问题了,不过依赖包确实有点多,网络不通畅可能会比较烦。。
|
9
buf1024 2017-04-21 22:56:59 +08:00
微信的通讯协议自己破解的?
|
11
zhaolion 2017-04-21 23:53:05 +08:00
使用一点基本的依赖管理吧, go vendor 已经有一些能用的了,至少不会让开发一开始就一脸蒙蔽的去 go get
|
12
blackFool 2017-04-21 23:55:13 +08:00
最多多少钱不掉线,是可以一直不掉线吗?
|
13
yangxuan8282 2017-04-22 00:00:04 +08:00
好像类似 itchat? 能不能把二维码发送到邮箱,然后在邮箱那边扫码登录
|
15
spice630 OP @yangxuan8282
嗯,是 go 版本的 itchat 。可以做到,在什么情况下需要这样?目前想做个网页版扫码。 |
16
spice630 OP @blackFool
我自己运行过几个小时吧,具体的没测试过,手机版网络掉线会影响到 bot 。而且腾讯的反 robot 机制也很厉害,可能会强制重登。 |
17
spice630 OP @yangxuan8282
目前只有我一个 commiter 所以会优先考虑必要的功能,有需求可以提 issue/pr 。 |
18
ob 2017-04-22 00:14:01 +08:00 via Android
@spice630 对, synccheck 。
我知道有好多地址可以遍历,但是我发现如果第一个失败,你接下来遍历的结果都是失败(遍历的地址我也是抓最新的那几个) 所以感觉地址加那么多个没啥用,就 wx2.push.qq.com 一个就够了。 不知道地址有没有记对。 |
20
junred 2017-04-22 00:17:54 +08:00
👍 我现在一直在琢磨着 py 版本的~
网页版接口限制比较多,掉线比较正常~ |
21
yangxuan8282 2017-04-22 00:23:47 +08:00
@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-04-22 00:47:27 +08:00
@spice630 嗯, telegram 好像也有官方的 api ,微信比较封闭
|
27
HanSonJ 2017-04-22 01:11:26 +08:00
|
29
buf1024 2017-04-22 11:45:29 +08:00
@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-04-22 13:33:29 +08:00
aida....
|
32
Orlion 2017-04-22 19:38:02 +08:00 via Android
用 golang 快写完了突然发现还不如用 java 写,方便在安卓上跑😏。
|
33
ob 2017-04-23 21:23:51 +08:00
|
39
spice630 OP @buf1024
并非如此。您的请求参数是什么?这个问题我一开始也遇到过 忘记是什么原因了,目前的代码是没有这个问题的。 |
43
jiumingmao 2017-04-24 13:29:44 +08:00
@ob 设置备注
|
44
ob 2017-04-24 13:37:54 +08:00 via Android
@jiumingmao 非好友,微信群,全部一个一个备注就太麻烦了。
|
46
a308057848 2017-04-25 16:32:20 +08:00
本地已跑通 log 模块死活加载不上,后面看代码用了:github.com/astaxie/beego/logs
|
47
trys1 2017-04-26 09:42:35 +08:00 via Android
已星
|
48
spice630 OP |
49
spice630 OP @a308057848
具体是什么错误呢 |
50
spice630 OP 已改用 vendor 来管理依赖
|
51
spice630 OP 移除了 vendor,真心不喜欢这种依赖管理方式,代码后续会提供 release。
|
52
spice630 OP |
53
buf1024 2017-05-10 09:20:18 +08:00
@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-05-13 13:49:41 +08:00
怒赞!
|
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-05-22 10:48:28 +08:00 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-05-23 13:30:23 +08:00
@spice630 谢谢,刚发现一个 bug,挂了有五六个小时,前一段时间正常,最后虽然后台显示没掉线,但已经收不到消息了,并且登陆手机微信也没显示网页在线
|
69
spice630 OP @only0jac
1102 没有做处理, 之前并没有遇到过这个值。拉下最新的代码,已经把所有的异常 ret 都当错误抛出去了,这样会进入重登逻辑。 目前还不清楚 1102 的意思。 挂机期间 网络有波动不? |
71
only0jac 2017-05-23 18:21:36 +08:00
@spice630 vps 挂机,国内 Windows 阿里云和国外 centos 都试过,无网络波动,在线不会超过半天,必掉线,截图的%s,是我把你的 logs 替换成了 fmt.println,不过我又换回来了,用的你原先的代码,然后错误却不输出了
|
78
leopku 2017-05-24 01:58:17 +08:00 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-06-09 13:13:19 +08:00
大赞
|
88
spice630 OP go-aida restful api 开发完成,这周页面应该可以好。
|
89
spice630 OP |
90
spice630 OP 新增插件 share
资源自动分发示例,纸牌屋第五季! |
91
spice630 OP |
92
spice630 OP |
94
useben 2019-06-19 17:32:07 +08:00
之前用给一个 py 的做过,重构到 go 也不错
|