# wechat_message_monitor **Repository Path**: yinqiuliang/wechat_robot ## Basic Information - **Project Name**: wechat_message_monitor - **Description**: 微信消息监控机器人 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2019-08-23 - **Last Updated**: 2021-10-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## wechat_message_monitor(微信群消息监控机器人) #### 1. 必要拓展 > requests > pyqrcode > pypng > zbar > PIL > MySQLdb > smtplib #### 2. 模块简介 > `index.py` 入口文件 > `controller` 控制器 > `config` 配置文件 > `core` 框架核心文件 > `do` 数据模型 > `lib` 封装的一些库 > `model` 数据表模型 > `service` 业务服务层 > `tmp` 缓存文件存储目录 #### 3.入口文件使用方式 ``` python index.py user_login_in 程序开始运行,监控群消息 python index.py report_share_statistic 统计数据并发送邮件 ``` #### 4. 注意事项 ``` 请确保本地机器安装了msyql服务,如果并非localhost能够访问,请修改config/database.py中的配置 如需启动邮件服务请在config/mail.py中进行配置 ``` #### 5.登录过程详情 ##### (1) 获取登录二维码 > ① 获取uuid(二维码的钥匙) >> a.请求链接 >>> https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new >> >> b.请求方式 >>> get >> >> c. 返回结果 >>> window.QRLogin.code = 200; window.QRLogin.uuid = "AaK5SSIbUw=="; >> >> d. 说明 >>> 返回结果中的 window.QRLogin.uuid后方对应就是我们需要的 uuid 啦 > > ② 获取登录二维码 >> a.请求链接 >>> https://login.weixin.qq.com/jslogin/l/{uuid} >> >> b.说明 >>> 上方的链接就是一个附上之前拿到的uuid就是一个二维码图片 >>> 至于你想将其显示在命令行还是存储下来发送给远端都可以 > ##### (2) 预登陆 > ① 用户扫码状态检测 >> a.请求链接 >>> https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={uuid}&tip=0&r=-{一个五位随机数}&_={当前时间戳} >> >> b.请求方式 >>> get >> >> c.返回结果 >>> window.code=200;window.redirect_uri={url} >> >> d. 说明 >>> ``` >>> window.redirect_uri是用户跳转登录页的真实url,将在下面进行介绍 >>> window.code 有以下几种情况: >>> 200 :用户已扫码确认 >>> 201 :等待用户扫码确认 >>> 400 :二维码无效,重新生成二维码即可 >>> 408 :二维码(uuid)已经过期失效,重新生成二维码即可 >>> 也就是当window.code是200时才可进行后续操作 >>> ``` > > ② 用户预登陆信息获取 >> a.请求链接 >>> 上方的window.redirect_uri后的 url 即请求链接 >> >> b.请求方式 >>> get >> >> c.返回参数 >>> {wxuin:{wxuin}, wxsid:{wxsid}, skey:{skey},pass_ticket:{pass_ticket}} >> >> d.说明 >>> ``` >>> 这一步,我们会获得一些比较关键的信息来用于后续的具体登录,下面会列出一些比较重要的数 >>> wxuin :是用来标识用户,不同的用户都不一样,同一用户多次登录都是一样的,猜测应该和用户的手机号进行了绑定 >>> wxsid :微信用户登录信息的同步以及发送消息都会用到 >>> skey : 微信用户登录信息的同步以及发送消息都会用到 >>> pass_ticket : 微信用户登录信息的同步以及发送消息都会用到 >>> 登录链接 :截取上方的 window.redirect_uri 至最后一个"/"之前,目前第一批注册的用户和第二批注册的用户地址不一样 >>> 文件地址 :用于下载消息中图片等媒体素材的地址 >>> 登录状态同步地址 : 用于用户登录以后检测用户是否登出以及用户消息同步的地址 >>> 登录时间 :保存下当前的时间戳,后续会用到 >>> 另外,文件地址与登录状态同步地址并不是直接获取,但是与登录链接的域名存在映射关系,映射关系如下: >>> "wx2.qq.com" : ["file.wx2.qq.com/cgi-bin/mmwebwx-bin", "webpush.wx2.qq.com/cgi-bin/mmwebwx-bin"], >>> "wx8.qq.com" : ["file.wx8.qq.com/cgi-bin/mmwebwx-bin", "webpush.wx8.qq.com/cgi-bin/mmwebwx-bin"], >>> "qq.com" : ["file.wx.qq.com/cgi-bin/mmwebwx-bin", "webpush.wx.qq.com/cgi-bin/mmwebwx-bin"], >>> "web2.wechat.com" : ["file.web2.wechat.com/cgi-bin/mmwebwx-bin", "webpush.web2.wechat.com/cgi-bin/mmwebwx-bin"], >>> "wechat.com" : ["file.web.wechat.com/cgi-bin/mmwebwx-bin", "webpush.web.wechat.com/cgi-bin/mmwebwx-bin"] >>> ``` ##### (3) 登录 > ① 获取用户登陆信息 >> a.请求地址 >>> {登录链接}/webwxinit?r=-{一个五位随机数}&pass_ticket={pass_ticket} >> >> b.请求方式 >>> post >> >> c.formdata参数 >>> {BaseRequest : {Skey:{skey}, Sid: {wxsid}, DeviceID: {pass_ticket}, Uin: {wxuin}}} >> >> d.说明 >>> 由于返回的信息比较多,这里简要地罗列一下关键信息:用户登录状态信息以及用户消息同步的SyncKey,登录用户的好友以及群列表,登录用户诸如用户编号昵称头像等基本信息 > > ② 开启手机客户端的消息同步 >> a.请求地址 >>> {登录链接}/webwxstatusnotify?lang=zh_CN&pass_ticket={pass_ticket} >> >> b.请求方式 >>> post >> >> c. formdata参数 >>> ``` >>> { >>> BaseRequest : {Skey:{skey}, Sid: {wxsid}, DeviceID: {pass_ticket}, Uin: {wxuin}}, >>> Code :3, >>> FromUserName : 用户编号, >>> ToUserName : 用户编号, >>> ClientMsgId : {当前时间戳,单位为毫秒} >>> } >>> ``` >> >> d.说明 >>> ``` >>> 返回结果中会有一个BaseResponse结构的数据(如果这都没有,检测一下自己的操作步骤是否有误),获取BaseResponse中的Ret的值,Ret的值会出现下方几种情况: >>> 0 :手机端消息同步状态开启成功 >>> 1 :手机端消息同步状态开启失败,检测一下自己的操作步骤是否有误 >>> 1101 :认证过期,重新扫码登录 >>> 这一步非常关键,如果这一步返回的结果中Ret的值不为0,那么你将永远看不到其它人发来的消息 >>> ```