WEB微信

网页登录的猜想:

a. 访问页面出现二维码

b. 长轮询监听是否已经扫码并且点击确认

c. 如何进行会话保持

d. 如何获取用户列表

e. 如何发送消息(接收消息)

过程:访问微信官网[https://wx.qq.com/]  --> 打开微信[已登录]扫一扫  -->  扫描网页图片

App内获取数据都是通过RUL进行获取的

长轮询: 发送一次请求后,就一直在等待消息的返回,如果超过规定时间后,就结束该请求,发送下次的请求。

轮 询: 定时的不停的交替的发送请求到服务器,不等待消息的返回

注:pending:表示一直在进行中的请求


二维码分析

获取二维码:

二维码的URL:       

   https://login.weixin.qq.com/qrcode/{0} 

生成二维码的URL:

https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1523003695511 

长轮询的URL【监听是否扫码的URL】:

https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AY0FL0UZwA==&tip=1&r=1700853510&_=1523012536082 

二维码组成:

生成二维码的URL

监听后台是否扫描二维码的URL:

长轮询的URL【Ajax请求】:

https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=AY0FL0UZwA==&tip=1&r=1700853510&_=1523012536082 

状态码分析

状态码 # 201: 扫码,未确认

# 200: 扫码,确认

# 408: pengding请求结束

# 400:  pending中

消息接收分析

获取pass_ticket请求URL:

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ATsWUC3qlrRteYUWzz_8hBMH@qrticket_0&uuid=QY2NxTcDcw==&lang=zh_CN&scan=1523018755&fun=new&version=v2&lang=zh_CN 

获取一个票据【内有pass_ticket凭据】

 <error>
<ret>0</ret>
<message></message>
<skey>@crypt_317889ae_68dfe71ead4387706d86b05e68a8c467</skey>
<wxsid>/QEleZmXf4vzAkHb</wxsid>
<wxuin>1466456560</wxuin>
<pass_ticket>cDQsACmeE%2FDaGGJHEHywz</pass_ticket>
<isgrayscale>1</isgrayscale>
</error>

用户初始化:登录并且获取最近联系人以及公众号

用户初始化URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1687552055&lang=zh_CN&pass_ticket=eSd509Kzdhcw4%252BDOYB7s0iV8ik2D%252FxYdOL5fwTSm9cvAaa7sLxZoz3mE88unS4sT 

获取联系人列表【Ajax请求】:每个人的用户唯一ID,用户名

获取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&skey=@crypt_29c62c055f8ff7e6d66c2fa05fb7 

发送或接受消息:

获取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=WGuxtLFLPXUiXteMkgmTmSeq5BPUJlEdXk92%252FtnYEGnj3fnB8K3%252ByODprlQBNC9u 

Pass_ticket

用户初始化:

用户初始化URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=1687552055&lang=zh_CN&pass_ticket=eSd509Kzdhcw4%252BDOYB7s0iOL5fwTSm9cvAaaE88unS4sT 

   注意:这里的请求Request_payload代表的就是JSON请求

获取联系人列表:

获取URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iH0mJhfpq1FrP44X18ovjrVFJfYqEszXSXGuuknxYJ4MATxoaFuPys&r=152302957&seq=0&skey=@crypt_29c62c055f8ff7e6d66c2fa05fb7 

接受消息的状态码:

消息接收:

发送消息:

解决发送消息中文乱码问题:

【辅助学习】Python学习---Django的request.post源码分析

中文乱码问题解决:方案一:

form_data = {
'BaseRequest': {
'DeviceID': 'e531777446530354',
'Sid': TICKET_DICT['wxsid'],
'Skey': TICKET_DICT['skey'],
'Uin': TICKET_DICT['wxuin']
},
'Msg': {
"ClientMsgId": str(time.time()),
# "Content": '%(content)s', # 方案二用
"Content": msg, # 方案一直接传递内容
"FromUserName": from_user_id,
"LocalID": str(time.time()),
"ToUserName": to_user_id,
"Type": 1
},
'Scene': 0
}
import json
form_data_str = json.dumps(form_data, ensure_ascii=False)
form_data_bytes = bytes(form_data_str, encoding='utf-8')
all_cookie_dict = {}
all_cookie_dict.update(LOGIN_COOKIE_DICT)
all_cookie_dict.update(TICKET_COOKIE_DICT)
# 因为我们data发送的字符串,但是微信用的是JSON格式,所以我们需要自己添加请求头
# 告诉服务器,我发送的是data数据,且是以JSON格式发送 ==》 等价于发送了JSON格式数据
# requests.post(url, json={'key':'value"}) ==> requests.post(url, data={'key':'value"} ,headers={'Content-Type': 'application/json'})
response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={
'Content-Type': 'application/json'})

中文乱码问题解决:方案二:

form_data = {
'BaseRequest': {
'DeviceID': 'e531777446530354',
'Sid': TICKET_DICT['wxsid'],
'Skey': TICKET_DICT['skey'],
'Uin': TICKET_DICT['wxuin']
},
'Msg': {
"ClientMsgId": str(time.time()),
"Content": '%(content)s', # 方案二用
# "Content": msg, # 方案一用
"FromUserName": from_user_id,
"LocalID": str(time.time()),
"ToUserName": to_user_id,
"Type": 1
},
'Scene': 0
}
import json
# form_data_str是字符串
form_data_str = json.dumps(form_data)
# 字符串进行格式化
form_data_str = form_data_str % {'content': msg} # content是上面字典中的占位符号
# 字符串转换成字节
form_data_bytes = bytes(form_data_str, encoding='utf-8')
all_cookie_dict = {}
all_cookie_dict.update(LOGIN_COOKIE_DICT)
all_cookie_dict.update(TICKET_COOKIE_DICT)
# 因为我们data发送的字符串,但是微信用的是JSON格式,所以我们需要自己添加请求头
# 告诉服务器,我发送的是data数据,且是以JSON格式发送 ==》 等价于发送了JSON格式数据
# requests.post(url, json={'key':'value"}) ==> requests.post(url, data={'key':'value"} ,headers={'Content-Type': 'application/json'})
response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={
'Content-Type': 'application/json'})

【辅助学习】Python学习---JSON补充内容[中文编码 + dumps解析]

微信接收消息

接收消息的URL:

https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=PdtuiorPozsWH4r3&skey=@crypt_29bab75e_c405fdf274568e5d5cb96e945449d5bc&pass_ticket=FqGrU0jBkvsmxIRa%252BtbaI8eUWScVv3DKAIAQrHoVLOYJ73AInLYuzs097cDgr4iR

检查接收消息类型URL:

https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=1523357524934&skey=%40crypt_29bab75e_c405fdf274568e5d5cb96e945449d5bc&sid=PdtuiorPozsWH4r3&uin=1600696821&deviceid=e262718862528046&synckey=1_683967369%7C2_683969564%7C3_683969533%7C11_683969510%7C201_1523357498%7C1000_1523351282%7C1001_1523351354%7C2001_1523351252%7C2002_1523332191&_=1523355846860

无法获取用户列表问题解决:

Web微信二维码的实现

更多参考

Python学习---模拟微信网页登录180410的更多相关文章

  1. Python实例---模拟微信网页登录(day5)

    第六步: 实现发送/接受消息---day5代码 settings.py """ Django settings for weixin project. Generated ...

  2. Python实例---模拟微信网页登录(day4)

    第五步: 获取联系人信息---day4代码 settings.py """ Django settings for weixin project. Generated b ...

  3. Python实例---模拟微信网页登录(day3)

    第四步: 扫码成功后获取最近联系人信息---day3代码 settings.py """ Django settings for weixin project. Gene ...

  4. Python实例---模拟微信网页登录(day2)

    第三步: 实现长轮询访问服务器---day2代码 settings.py """ Django settings for weixin project. Generate ...

  5. Python实例---模拟微信网页登录(day1)

    第一步:创建Django项目 创建Django项目,添加App 创建静态文件夹static 修改settings.py文件 1. 取消csrf注释 2. 添加静态文件路径 # 添加静态文件路径 STA ...

  6. JustAuth 1.15.9 版发布,支持飞书、喜马拉雅、企业微信网页登录

    新增 修复并正式启用 飞书 平台的第三方登录 AuthToken 类中新增 refreshTokenExpireIn 记录 refresh token 的有效期 PR 合并 Github #101:支 ...

  7. VC显示网页验证码、模拟CSDN网页登录

    摘要:by:koma 这两天,本来想花点时间研究一下QQ空间.农场外挂,于是抓包分析一了下,只可惜,在QQ网页登录时进行了加密处理,可惜我对网页编程一窍不通.有些朋友曾讲过那些是通过JS代码进行加密, ...

  8. 基于ASP.NET MVC 微信网页登录授权(scope为snsapi_base) 流程 上 获取OPENID

    流程图 我们需要判断是否存在OPENID  首先我们得先定义一个全局的OPENID 类似于普通账号密码登录系统的 当前登录用户ID  因为我是MVC 框架  我这里定义一个控制器基类 BaseCont ...

  9. 微信开发+百度AI学习:微信网页开发环境搭建

    参考微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 两步即可获取微信网页开发能力 STEP1: ...

随机推荐

  1. 1-hadoop中遇到的各种异常

    本贴记录学习hadoop中遇到的各种异常, 包括推荐系统分类下的和本分类下的, 持续更新 1, 搭建ha时, active和standy之间不能自由切换 经检查, 配置文件错误, 私钥配置 root ...

  2. java的if语句,少于一行可以省略大括号

    我们认识的 if 语句,大概是这样的: if(条件){ 语句1; }else{ 语句2; } 如果要执行的语句少于1行,大括号是可以省略的 可以让程序更简洁和美观 if(条件){ 语句1; 语句2; ...

  3. gitlab+jenkins+hook代码自动构建发布上线

    Gitlab+Jenkins+Hook 1.gitlab和jenkins的安装见: http://www.cnblogs.com/cuishuai/p/7544663.html http://www. ...

  4. nodejs zip压缩版安装与配置

    Node.js 1.下载 下载地址:https://nodejs.org/zh-cn/download/ 选择相应的版本下载 2.解压缩 将文件解压到要安装的位置,并新建两个目录 node-globa ...

  5. MJRefresh源码框架分析

    MJRefresh是一款非常优秀的刷新控件.代码简洁,优雅.今天有时间对源代码阅读了一下.对MJRefresh的宏观设计非常赞叹.所谓大道至简就是这样吧.   MJRefresh所采用的主要设计模式非 ...

  6. 本地开启https的nginx配置

    下载证书和key放置在nginx配置文件同级目录下,然后添加配置内容,监听443端口,如果本地443端口被占用,可以使用其他端口测试. server { listen 443; server_name ...

  7. Linux进程间通信 -- 管道(pipe)

    前言    进程是一个独立的资源管理单元,不同进程间的资源是独立的,不能在一个进程中访问另一个进程的用户空间和内存空间.但是,进程不是孤立的,不同进程之间需要信息的交互和状态的传递,因此需要进程间数据 ...

  8. .NET创建WebService服务简单的例子

    Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...

  9. oracle数据库逐步学习总结【基础一】

    原创作品,转载请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10059955.html 一.oracle的基本命令 1.连接命令 用法:c ...

  10. react组件里阻事件冒泡

    e.nativeEvent.stopImmediatePropagation();