itchat网页版微信二维码登陆原理

网页版微信公众号监听机器人 v-1.0.0
在这里插入图片描述


登陆的过程按顺序为:

  • 获取二维码uuid

  • 获取二维码

  • 判断是否已经登陆成功

  • 获取初始化数据

  • 更新微信相关信息(通讯录、手机登陆状态)

  • 循环扫描新信息(开启心跳)

    • -

登陆方法简介:

方法名 简介 文件位置: itchat/core.py
get_QRuuid 获取生成二维码所需的uuid,并返回。
check_login 判断是否已经登陆成功,返回扫描的状态码。
process_login_info 登陆成功,获取 skey, wxsid, wxuin, pass_ticket
show_mobile_login 在手机上显示登录状态。
web_init 获取微信用户信息以及心跳所需要的数据。
start_receiving 循环扫描是否有新的消息,开启心跳包。

core.py文件中的Core类定义了itchat的所有接口。但是只定义了接口,方法全部在component包中实现重构。
文件位置: itchat/components/login.py


登陆接口介绍:

  • 1.通过抓包,获取appid和fun并通过get请求
    对https://login.weixin.qq.com/进行访问,可获得uuid
    在这里插入图片描述
    uuid如下图所示:
    在这里插入图片描述

  • 2.通过uuid- 获取二维码图片。(并保存,此处省略)
    请求接口:https://login.weixin.qq.com/1/ + uuid

    终端中显示登陆二维码,需要安装 pillow 模块。
    获取二维码链接、下载图片、保存到内存中(登陆成功后删除)。
    
    将二维码以PNG图像的形式保存、计算生成的PNG图像的实际像素大小。
    
    把PNG图像编码为base64字符串重新输出
    
    通过pyqrcode的QRCode方法
    
    qrText => QRCode.text(base64字符串)
    
    该方法返回一个基于字符串的二维码表示。数据模块由1、0表示。
    
    然后把 1、0 替换成 unicode编码的 黑/白 字符,最后用sys输出到控制台
    
    import sys
    b = u'\u2588'
    sys.stdout.write(b + '\r')
    sys.stdout.flush()
  • 3.判断是否已经登陆成功
    Request URL: https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=oYdNqgD3wQ==&tip=0&r=251883138&_=1567410890538

    接口参数:uuid = uuid 。r = int(时间戳) / 1579 。 _ = int(时间戳)

在这里插入图片描述
返回200.说明登陆成功。

4.获取登陆url信息
完成登录时(扫描qrcode),获取 loginInfo_url
syncUrl和fileUploadingUrl将被获取
将生成deviceid和msgid
获取skey, wxsid, wxuin, pass_ticket
在这里插入图片描述
在这里插入图片描述

  • 5.初始化信息
    接口: url = '%s/webwxinit?r=%s' % (loginInfo['url'], int(时间戳))
    在这里插入图片描述
    通过dic即可提取基础信息。

  • 6.更新微信相关信息(登陆状态)
    在这里插入图片描述

  • 7.循环扫描新信息(开启心跳监听)
    在这里插入图片描述

多线程的事件监听器模式。
1, 创建线程并启动,在创建线程的位置设置一个标记
2,创建队列保存线程
3,遍历队列中的线程 ,并得到标记

在这里插入图片描述

代码部分来源于wxpy。这里主要的是分析下二维码登陆的逻辑和接口。


09/05 更新:开启 smtp 服务,登出邮件通知。
在这里插入图片描述


监控设置:

开启 smtp 服务,登出时邮件通知。
开启 @自动回复,可自行查询监听状况。


代理ip:

提取类型: 每次请求提取一个https隧道IP。
使用时间: 每天早9点晚12点,自动开启代理ip。
代理规则: 代理ip存活时间15分钟。
消耗预算: 每日大约需要消耗60个IP。


注意事项:


Send_email = True   # 开启 登出邮件通知
文件位置: itchat/components/config/config_smtp.py
config_smtp中设置 收发邮件对象

邮件发出后,使用sheel命令关闭阻塞的py进程   -> embed(shell='p')
本地: os.system('ps -e|grep run_wxbot.py |grep -v grep|cut -c 1-5|xargs kill -9')
linux: ps -ef|grep run_wxbot.py |grep -v grep|cut -c 9-15|xargs kill -9 

文件位置: python3.X/site-packages/itchat/components/login.py
在这里插入图片描述


linux下参数设置:
bot = Bot(console_qr=True  # 终端显示二维码 )  
# console_qr 在大部分Linux 系统中可设为`True`或 2,
# MacOS Terminal 的默认白底配色中,应设为 -2。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - 

linux下itchat 源码修改事项:
路径:/usr/local/lib/python3.5/site-packages/
注释了 group.py 106行 用户初始化 log 信息
创建了 itchat/components/config 文件 config_smtp.py
增加了 itchat/components/login.py 中 SMTP 服务

本地 itchat 源码修改事项:(同上)
路径: /Users/liwei/venv/lib/python3.5/site-packages/itchat/components/login.py
from ..components.config.config_smtp import Send_email,config_smtp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - 

linux启动事项:  
启动报错:lOG OUT。 解决方法:删除 wx.pkl 关闭缓存

使用 screen命令 实现当前窗口与任务分离:
新建窗口        screen -S wxbot
会话分离        Ctrl+A D(即按住Ctrl,依次再按A,D)
恢复会话窗口     screen -r wxbot
杀死会话窗口     screen -X -S 10289 quit 

ps:(监听公众号推送消息,未完待续)


github: https://github.com/lixi5338619/weixinbot (代码维护,暂未上传)

点赞

发表回复