#开源项目#wechat-go 微信机器人/web 协议

2017-04-21 13:34:41 +08:00
 spice630

wechat-go

https://github.com/songtianyi/wechat-go

go 版本 wechat web api , 十分欢迎 gopher 参与开发更多有趣实用的插件。同时求一个前端,写两个页面给普通用户使用。

Install

go get -u -v github.com/songtianyi/wechat-go

golang.org/x dep install

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

Demo project

go-aida

Example code

Create your own chatbot
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)
	}
}

Plugins

switcher

一个管理插件的插件

#关闭某个插件, 在微信聊天窗口输入
disable faceplusplus
#开启某个插件, 在微信聊天窗口输入
enable faceplusplus
#查看所有插件信息, 在微信聊天窗口输入
dump
faceplusplus

对收到的图片做面部识别,返回性别和年龄

gifer

以收到的文字消息为关键字做 gif 搜索,返回 gif 图, 注意返回的 gif 可能尺度较大,比如文字消息中包含“污”等关键词。

replier

对收到的文字 /图片消息,做自动应答,回复固定文字消息

laosj

随机获取一张美女图片, 在聊天窗口输入

美女
joker

获取一则笑话, 在聊天窗口输入

笑话
revoker

消息撤回插件, 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

}

Show

13179 次点击
所在节点    分享创造
94 条回复
missdeer
2017-04-21 13:56:56 +08:00
终于有 go 版本的来了
spice630
2017-04-21 14:00:40 +08:00
@missdeer 好久了,但是一直不完善,最近几天完善了很多,主要是支持多开,然后插件化管理了,方便二次开发。
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
出来一堆不知道什么东西

然后就没有然后了,楼主你确定没闹?
ob
2017-04-21 19:09:29 +08:00
想知道防掉线是怎么实现的?
心跳包检测地址那么多个,发现一直只有一个能用,如何第一个检测失败,后面的也一定失败。
然后只能重新登录。
spice630
2017-04-21 21:22:49 +08:00
@ob
你说的是 synccheck 地址?每次会遍历所有(任何一个能用就 ok )。
防掉线其实就是有异常 用历史 cookie 等信息重新登录。
spice630
2017-04-21 21:23:55 +08:00
@cccssss
很抱歉, example code 没及时更新,以后我会注意。
demo project 可以直接编译运行,因为每次更新我都会重编它,有时候会忘记更新 README
spice630
2017-04-21 21:32:45 +08:00
@cccssss
已 APPEND 正确代码, github 已同步更新。
spice630
2017-04-21 22:30:10 +08:00
已加入 travis 持续集成工具,不会再出现编译问题了,不过依赖包确实有点多,网络不通畅可能会比较烦。。
buf1024
2017-04-21 22:56:59 +08:00
微信的通讯协议自己破解的?
spice630
2017-04-21 23:46:43 +08:00
@buf1024
web 协议,人人都能看到的,模拟网页版。
zhaolion
2017-04-21 23:53:05 +08:00
使用一点基本的依赖管理吧, go vendor 已经有一些能用的了,至少不会让开发一开始就一脸蒙蔽的去 go get
blackFool
2017-04-21 23:55:13 +08:00
最多多少钱不掉线,是可以一直不掉线吗?
yangxuan8282
2017-04-22 00:00:04 +08:00
好像类似 itchat? 能不能把二维码发送到邮箱,然后在邮箱那边扫码登录
spice630
2017-04-22 00:01:08 +08:00
@zhaolion
嗯,有时间加上。我个人一直不喜欢加这些东西,强迫自己保证所有软件兼容,哈哈。
spice630
2017-04-22 00:02:38 +08:00
@yangxuan8282
嗯,是 go 版本的 itchat 。可以做到,在什么情况下需要这样?目前想做个网页版扫码。
spice630
2017-04-22 00:04:23 +08:00
@blackFool
我自己运行过几个小时吧,具体的没测试过,手机版网络掉线会影响到 bot 。而且腾讯的反 robot 机制也很厉害,可能会强制重登。
spice630
2017-04-22 00:07:11 +08:00
@yangxuan8282
目前只有我一个 commiter 所以会优先考虑必要的功能,有需求可以提 issue/pr 。
ob
2017-04-22 00:14:01 +08:00
@spice630 对, synccheck 。
我知道有好多地址可以遍历,但是我发现如果第一个失败,你接下来遍历的结果都是失败(遍历的地址我也是抓最新的那几个)
所以感觉地址加那么多个没啥用,就
wx2.push.qq.com 一个就够了。
不知道地址有没有记对。
ob
2017-04-22 00:14:19 +08:00
@blackFool 试过几天没掉。
junred
2017-04-22 00:17:54 +08:00
👍 我现在一直在琢磨着 py 版本的~

网页版接口限制比较多,掉线比较正常~

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

https://www.v2ex.com/t/356399

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

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

© 2021 V2EX