分享
  1. 首页
  2. 文章

golang实现微信聊天机器人

qianlnk · · 4869 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

主要模块

  • 获取UUID
  • 根据UUID获取二维码
  • 显示二维码
  • 扫码登陆
  • 初始化微信信息
  • 打开状态同步通知
  • 获取通讯录
  • 发送信息
  • 同步信息
  • 获取自动回复内容

源码地址

https://github.com/qianlnk/gobot

网页版微信API

获取UUID

  • 接口地址
    https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new&lang=zh_CN&_={Timestamp}

  • 方法
    GET

  • 结果

window.QRLogin.code = 200; window.QRLogin.uuid = "xxx";
  • 实现
    参考GetUUID方法

获取二维码

  • 接口地址
    https://login.weixin.qq.com/qrcode/{UUID}?t=webwx&_={Timestamp}

  • 方法
    GET

  • 实现
    参考GenQrcode方法

  • 将二维码输出到终端
    https://github.com/qianlnk/qrcode

登录

  • 接口地址
    https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?tip={1,0}&uuid=(UUID}&_={Timestamp}

tip: 1 未扫码 0 已扫码

  • 方法
    GET

  • 结果

window.code=xxx;
xxx:
 408 登陆超时
 201 扫描成功
 200 确认登录
当返回200时,还会有
window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=xxx&uuid=xxx&lang=xxx&scan=xxx";

通过正则获取后面需要的URL, 后面统一用BASE_URL表示。

BASE_URL = https://wx.qq.com
  • 实现
    参考Login方法

  • 跳转
    获取用户的登录信息

 Skey string `xml:"skey"`
 Wxsid string `xml:"wxsid"`
 Wxuin string `xml:"wxuin"`
 PassTicket string `xml:"pass_ticket"`

微信初始化

  • 接口地址
    BASE_URL/webwxinit?pass_ticket={PassTicket}&skey={Skey}&r={Timestamp}

  • 方法
    POST

  • 结果

type InitResult struct {
 BaseResponse BaseResponse `json:"BaseResponse"`
 Count int `json:"Count"`
 ContactList []Contact `json:"ContactList"`
 SyncKey SyncKey `json:"SyncKey"`
 User User `json:"User"`
 ChatSet string `json:"ChatSet"`
 SKey string `json:"SKey"`
 ClientVersion int `json:"ClientVersion"`
 SystemTime int `json:"SystemTime"`
 GrayScale int `json:"GrayScale"`
 InviteStartCount int `json:"InviteStartCount"`
 MPSubscribeMsgCount int `json:"MPSubscribeMsgCount"`
 MPSubscribeMsgList []MPSubscribeMsg `json:"MPSubscribeMsgList"`
 ClickReportInterval int `json:"ClickReportInterval"`
}
  • 实现
    参考Init方法

状态通知

  • 接口地址
    BASE_URL/webwxstatusnotify?lang=zh_CN&pass_ticket={PassTicket}

  • 参数

 params := make(map[string]interface{})
 params["BaseRequest"] = w.baseRequest
 params["Code"] = 3
 params["FromUserName"] = w.user.UserName
 params["ToUserName"] = w.user.UserName
 params["ClientMsgId"] = int(time.Now().Unix())
  • 方法
    POST

-实现
参考StatusNotify方法

获取通讯录

  • 接口地址
    BASE_URL/webwxgetcontact?sid={Wxsid}&skey={Skey}&pass_ticket={PassTicket}

  • 参数

 params := make(map[string]interface{})
 params["BaseRequest"] = w.baseRequest

-方法
POST

  • 实现
    参考GetContact方法

同步信息

  • 接口地址
    https://host/cgi-bin/mmwebwx-bin/synccheck

host:

 Hosts = []string{
 "webpush.wx.qq.com",
 "webpush2.wx.qq.com",
 "webpush.wechat.com",
 "webpush1.wechat.com",
 "webpush2.wechat.com",
 "webpush1.wechatapp.com",
 }

-参数

 v := url.Values{}
 v.Add("r", w.timestamp())
 v.Add("sid", w.loginRes.Wxsid)
 v.Add("uin", w.loginRes.Wxuin)
 v.Add("skey", w.loginRes.Skey)
 v.Add("deviceid", w.deviceID)
 v.Add("synckey", w.strSyncKey())
 v.Add("_", w.timestamp())
  • 方法
    GET

  • 结果

window.synccheck={retcode:"xxx",selector:"xxx"}
retcode:
 0 正常
 1100 手机上退出网页版微信
 1101在其他地方登录网页版微信
selector:
 0 正常
 2 新的消息
 7 进入/离开聊天界面
  • 实现
    参考SyncCheck方法

selector=2时读取新的信息

  • 接口地址
    BASE_URL/webwxsync?sid={Wxsid}&skey={Skey}&pass_ticket={PassTicket}

  • 参数

 params := make(map[string]interface{})
 params["BaseRequest"] = w.baseRequest
 params["SyncKey"] = w.syncKey
 params["rr"] = ^int(time.Now().Unix())
  • 方法
    POST

  • 注意

修改synckey,重要

 if msg.BaseResponse.Ret == 0 {
 w.syncKey = msg.SyncKey
 }
  • 实现
    参考WxSync方法

发送信息

  • 接口地址
    BASE_URL/webwxsendmsg?pass_ticket={PassTicket}

  • 参数

 params := make(map[string]interface{})
 params["BaseRequest"] = w.baseRequest
 msg := make(map[string]interface{})
 msg["Type"] = 1
 msg["Content"] = message
 msg["FromUserName"] = w.user.UserName
 msg["ToUserName"] = to
 msg["LocalID"] = clientMsgID
 msg["ClientMsgId"] = clientMsgID
 params["Msg"] = msg
  • 方法
    POST

  • 实现
    参考SendMessage方法

图灵API

获取自动回复内容

 params := make(map[string]interface{})
 params["userid"] = uid
 params["key"] = w.cfg.Tuling.Keys[w.user.NickName].Key
 params["info"] = msg
  • 方法
    POST

  • 结果

 Code int `json:"code"`
 Text string `json:"text"` //100000
 URL string `json:"url"` //200000
 List interface{} `json:"list"` //302000 []News 308000 []Menu
  • 实现
    参考getReply方法

效果图

run.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:qianlnk

查看原文:golang实现微信聊天机器人

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4869 次点击
下一篇:golang 继承
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏