微信协议网页版微信协议解析

news/2024/4/24 18:13:19/文章来源:https://blog.csdn.net/q2243088760/article/details/129167375

最近在做个微信机器人,所以研究了网页版的微信协议及相关接口,在这里简单总结一下。

从表面上看,对于网页版微信我们的使用流程是这样的:

很简单,只有四步,但如果细化到内里细节的话,上面这简单四步的背后其实隐藏很多其他的逻辑。比如说网页微信是怎么知道手机已经扫码了?微信服务器是怎么确定用户此时的登录是有效的?网页微信又是怎么知道新消息过来的?关于这些,我们可以看看下面的流程图:

而在这个流程中,主要涉及以下几个接口:

UUID获取接口

登录二维码下载接口

二维码扫描状态查询接口

登录页面跳转接口(获取登录后的关键参数)

登录初始化接口(获取同步密钥SyncKey)

心跳检测接口(查询是否有新消息)

消息拉取接口

消息发送接口

UUID获取接口:

urlhttps://login.wx.qq.com/jslogin

method:GET

request parameter

response:window.QRLogin.code = 200; window.QRLogin.uuid = "gdl0dOM6cg==“;

window.QRLogin.code为请求响应结果,200表示成功

window.QRLogin.uuid后面为 uuid,这里的 uuid 是 gdl0dOM6cg==

登录二维码下载接口:

二维码扫描状态查询接口:

urlhttps://login.wx.qq.com/cgi-bin/mmwebwx-bin/login

method:GET

request parameter

response:这里的返回值有四种可能

参数校验失败:window.code = 400;

未扫码未登录:window.code = 408;

已扫码未登录:window.code = 201;

已扫码已登录:window.code=200;window.redirect_uri="https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AyTxRevj7IxauFXHBvH_BVIl@qrticket_0&uuid=IeqFbW6eJQ==&lang=zh_CN&scan=1523256945”;

登录页面跳转接口(获取登录后的关键参数):

urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage

method:GET

request parameter

response:0OKxxxxxxxxx

xxx1

登录初始化接口(获取同步密钥SyncKey):

urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=129620808

method:POST

request parameter:JSON格式

{

BaseRequest: {

Uin: 登录关键参数wxuin,

Sid: 登录关键参数wxsid,

Skey: 登录关键参数skey,

DeviceID: 随机数

}

}

response:JSON格式,里面有个SyncKey字段,数据结构是一个List,List 里面的元素 e 是 key-value 的模式,后续心跳请求的时候通过 e1.key_e1.value | e2.key_e2.value 的格式拼装成 synckey

心跳检测接口(查询是否有新消息):

urlhttps://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck

method:GET

request parameter

response:window.synccheck = { retcode: "0", selector: "0" }

retcode:0( 0 表示请求成功)

selector

0: 无消息

2: 有新消息

消息拉取接口:

urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync

method:POST

request parameter:有两部分,url拼接 和 POST 都要

URL 拼接:sid 和 skey

POST:

{

BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx },

SyncKey: xxx,

rr:

}

response:JSON格式。请求成功时有两个关键字段,SyncKey(新的同步密钥)和 AddMsgList(消息列表)

消息发送接口:

urlhttps://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg

method:POST

request parameter:JSON格式{

BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx },

Msg: {

Type: 1 文字消息,

Content: 要发送的消息,

FromUserName: 自己的ID,

ToUserName: 好友的ID,

LocalID: 与clientMsgId相同,

ClientMsgId: 时间戳左移4位随后补上4位随机数

}

}

response:JSON格式

{ "BaseResponse": { "Ret": 0, "ErrMsg": "" }, ... }

以上便是网页版微信的相关协议逻辑和接口解析,主要包含了登录以及消息发送的相关接口。此外,文章部分内容参考了 https://segmentfault.com/a/1190000004471678 这篇文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_72885.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试真题 用 C++ 实现 - 服务依赖

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

ADC模数转换器(基于STM32F407)

简介 Analog-to-digital converters(模拟数字转换器),我的STM32F407中内置3个ADC,每个 ADC 有 12 位、10 位、8 位和 6 位可选,ADC 具有独立模式、双重模式和三重模式,对于不同 AD 转换要求几乎都有合适的…

mysql高级-day03

mysql高级-day03 集群: 主从模式(高可用 读写分离) 主主模式 主从级联 主主级联半同步模式(理解 表达出来)面试异步模式(理解 表达出来)面试搭建主从 搭建主主(docker)数据分片: 水平 垂直(数据库 表)面试策略有哪些(负载均衡策略)4种读写分离 主从切换 1 Mysql复制架构 1.1…

Linux 文件基本属性

Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。 为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。 在 Linux 中我们通常使用以下两个命…

JAVA虚拟机JVM之内存模型

内存模型 java 内存模型 很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模型】是 Java Memory Model(JMM)的意思。 关于它的权威解释,请参考 https://download.oracle.com/otn-pub/jcp/memory_model-1.0…

mysql间隙锁

首先我们这里有一个表t,其中的数据如下图所示 注意哈 update由于操作的最新的值,所以是当前读! 另外一个事务插入 8的时候发生锁 而我对id为10的数据进行更新,却不会被锁住 分析:在执行当前读时,由于id7不存…

斗地主洗牌发牌-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-4】 斗地主洗牌发牌 【案例介绍】 1.任务描述 扑克牌游戏“斗地主”,相信许多人都会玩,本案例要求编写一个斗地主的洗牌发牌程序,要求按照斗地主的规则完成洗牌发牌的过程。一副扑克总共有54张牌,牌面由花色和数字组成…

JAVA-JDBC

文章目录1、什么是JDBC?2、JDBC相关的类库在哪里?3、JDBC本质上是一堆什么呢?4、JDBC开发之前的准备工作?5、JDBC编程六步JDBC课堂笔记1、什么是JDBC? Java DataBase Connectivity 在java语言中编写sql语句&#xff0…

ChatGPT是什么?为何会引爆国内算力需求?

过去十年中,通过“深度学习大算力”从而获得训练模型是实现人工智能的主流技术途径。由于深度学习、数据和算力这三个要素都已具备,全世界掀起了“大炼模型”的热潮,也催生了大批人工智能企业。大模型是人工智能的发展趋势和未来大模型&#…

Docker----------day5---安装redis集群

1.哈希取余分区 2亿条记录就是2亿个k,v,我们单机不行必须要分布式多机,假设有3台机器构成一个集群,用户每次读写操作都是根据公式: hash(key) % N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。…

浏览器用一行JS代码导出cookies.txt,Python的requests库导入cookies格式化为字典格式

在Python进行爬虫时,如果仅使用requests库打开某个网页,requests的session.cookies保存的cookies信息少得可怜,有时cookies甚至是空白!但浏览器里打开同一个网页,cookies信息非常详尽,比如浏览器的cookies保…

孪生生产线:法兰工厂数据驱动的颠覆性创新

2018 年,世界经济论坛(WEF)携手麦肯锡公司共同倡议并正式启动了全球“灯塔工厂网络项目”(Lighthouse Network),共同遴选率先应用工业革命 4.0 技术实现企业盈利和持续发展的创新者与示范者。这就使得工厂系统需要对各流水线及生产运行成本方面进行多角度…

在DDD中建立领域模型

在前文《当我们谈论DDD时我们在谈论什么》中我们讨论了DDD的战略设计和战术设计。在本文中我们将继续探讨领域模型。 用领域模型表达领域概念 在实际项目中,模型设计者往往过早陷入具体构造块类型的识别,比如实体、聚合、领域服务,而忽略了…

Git(分布式版本控制系统)

提到git了,我们先来说一下什么是git? 1、通俗一点,就是一个人工版本控制器 通过人工的复制行为来保存项目的不同阶段的内容,添加适当的一些描述文字加以区分 繁琐、容易出错 产生大量重复数据 2、什么是版本控制? 版本控制是指对…

动作识别、检测、分割、解析相关数据集介绍

文章目录动作识别UCF101(UCF101 Human Actions dataset)Kinetics (Kinetics Human Action Video Dataset)动作检测 / 时序动作定位CharadesActivityNetMulti-THUMOSUCF101-24IKEA ASM动作分割Breakfast (The Breakfast Actions Dataset)GTEA (Georgia Tech Egocentric Activity…

Python base64和hashlib模块

一、base64模块 base64模块提供了在二进制数据和可打印ASCII字符间编解码的功能,包括 RFC3548中定义的Base16, Base32, Base64, Ascii85, Base85等编码。 base64模块属于标准库,无需进行安装,导入即可使用。 base64模块支持两种接口&#xf…

数组还是队列?yocto-queue 源码告诉你

前言 昨天刚学完 omit 的源码,今天趁着学习源码的热度还没结束,来学习一下另一个我之前未接触过的东西 yocto-queue。 yocto-queue 介绍 那么 yocto-queue 是什么呢?它有什么功能呢?查阅资料可得,对于数据比较多的数…

第10天-商品服务(分层领域模型及规格参数编码实现)

1.分层领域模型规约 DO( Data Object): 此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。DTO( Data Transfer Object):数据传输对象, Service 或 Manager 向外传输的…

【Python】PaddleHub图像分类

目录 一、环境配置: 二、问题需求 三、实验内容 1、准备数据集 2、拆分数据集 3、载入数据集 4、生成数据读取器 5、配置策略 6、组建Finetune Task 7、开始Finetune 8、预测 四、总结: 一、环境配置: 线上环境: 飞桨…

JAVA线程入门简介

线程入门简介什么是程序?什么是进程?什么是线程?单线程与多线程并发与并行线程的使用用java查看有多少个cpu创建线程的两种方式继承Thread类,重写run方法实现Runnable接口,重写run方法多线程机制为社么是start?源码解析什么是程序? 是为完…