关键词:微信通信协议,用自己的程序收发微信,微信网页web版分析

这几天因为项目需要用自己的程序发送微信,研究了一下微信网页版的通信协议,自己写了个程序,实现微信的登录、初始化、读取联系人列表、发送微信、接收微信等功能,网上看了一下也有不少人做过这方面的内容。主要用的工具是HTTPAnalyzer,我认为这个是目前分析http/https协议最好用的工具了,比wireshark和fiddler都清晰明确,推荐大家分析http/https协议内容使用这个工具。其实分析了协议自己再写代码就很容易了。

自己开发程序来收发微信,整个流程基本如下:

1、获取会话UUID

微信Web版本不使用用户名和密码登录,而是采用扫描二维码登录,所以服务器需要首先分配一个唯一的会话ID,用来标识当前的一次登录。

使用get方法,通过请求地址:https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&fun=new&lang=zh_CN&_=时间戳

其中,时间戳这个值是当前距离林威治标准时间的毫秒。

get成功,则返回:window.QRLogin.code = 200; window.QRLogin.uuid = "XXXXXXX"

其中的XXXXXXX就是我们需要的uuid

2、获取登录二维码

访问网址:https://login.weixin.qq.com/qrcode/XXXXXX

这里的XXXXXXX就是我们刚才获取的uuid,这个网址直接显示的就是二维码

3、查询是否扫描二维码登录

显示了二维码以后,用户必须用手机微信扫描这个二维码才能登录。(微信为啥要这么设计?很奇怪的思维。。。我用电脑很多情况不就是因为手机没在旁边吗。。。)

使用get方法,查询地址:https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=XXXXXX&tip=1&_=时间戳

这里的XXXXXX是我们刚才获取的uuid,时间戳同上。tip在第一次获取时应为1,这个数是每次查询要变的。

如果服务器返回:window.code=201,则说明此时用户在手机端已经完成扫描,但还没有点击确认,继续使用上面的地址查询,但tip要变成0;

如果服务器返回:

window.code=200
window.redirect_uri="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

则说明此时用户在手机端已经确认登录,window.redirect_uri=后面的这个网址要记下来,接着要访问这个地址。

如果服务器返回:window.code=408,则说明等待超时,继续使用上面的地址查询,但tip=1

4、访问登录地址,获得uin、sid、pass_ticket、skey

用get方法,访问在上一步骤获得访问地址,并在参数后面加上:&fun=new,会返回一个xml格式的文本,类似这样:

<error>
    <ret>0</ret>
    <message>OK</message>
    <skey>xxx</skey>
    <wxsid>xxx</wxsid>
    <wxuin>xxx</wxuin>
    <pass_ticket>xxx</pass_ticket>
    <isgrayscale>1</isgrayscale>
</error>

把这里的wxuin,wxsid,skey,pass_ticket都记下来,这是重要数据。

5、微信初始化

这个是很重要的一步,我在这个步骤折腾了很久。。。

要使用POST方法,访问地址:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=时间戳&lang=ch_ZN&pass_ticket=XXXXXX

其中,时间戳不用解释,pass_ticket是我们在上面获取的一长串字符。

POST的内容是个json串,{"BaseRequest":{"Uin":"XXXXXXXX","Sid":"XXXXXXXX","Skey":XXXXXXXXXXXXX","DeviceID":"e123456789012345"}}

uin、sid、skey分别对应上面步骤4获取的字符串,DeviceID是e后面跟着一个15字节的随机数。

程序里面要注意使用UTF8编码方式。

POST成功,则服务器返回一个很长的JSON串,格式是这样:

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "Count": 8,
    "ContactList": [...],
    "SyncKey": {
        "Count": 4,
        "List": [
            {
                "Key": 1,
                "Val": 635705559
            },
            ...
        ]
    },
    "User": {
        "Uin": xxx,
        "UserName": xxx,
        "NickName": xxx,
        "HeadImgUrl": xxx,
        "RemarkName": "",
        "PYInitial": "",
        "PYQuanPin": "",
        "RemarkPYInitial": "",
        "RemarkPYQuanPin": "",
        "HideInputBarFlag": 0,
        "StarFriend": 0,
        "Sex": 1,
        "Signature": "Apt-get install B",
        "AppAccountFlag": 0,
        "VerifyFlag": 0,
        "ContactFlag": 0,
        "WebWxPluginSwitch": 0,
        "HeadImgFlag": 1,
        "SnsFlag": 17
    },
    "ChatSet": xxx,
    "SKey": xxx,
    "ClientVersion": 369297683,
    "SystemTime": 1453124908,
    "GrayScale": 1,
    "InviteStartCount": 40,
    "MPSubscribeMsgCount": 2,
    "MPSubscribeMsgList": [...],
    "ClickReportInterval": 600000
}

这其中,User里面是自己的信息,UserName是用户名,NickName是昵称。要注意UserName是每次都会变的。。。也就是说,获取不到唯一的不变标识表示身份,无语。。。SyncKey一般是4个,要记下这里的Key和val,后面每次收信息都要用。至于count和contactList先不用管。

6、获取好友列表

使用POST方法,访问:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?r=时间戳

POST的内容为空。成功则以JSON格式返回所有联系人的信息。格式类似:

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "MemberCount": 21,
    "MemberList": [
        {
            "Uin": 0,
            "UserName": xxx,
            "NickName": "Urinx",
            "HeadImgUrl": xxx,
            "ContactFlag": 3,
            "MemberCount": 0,
            "MemberList": [],
            "RemarkName": "",
            "HideInputBarFlag": 0,
            "Sex": 0,
            "Signature": "xxxx",
            "VerifyFlag": 8,
            "OwnerUin": 0,
            "PYInitial": "URINX",
            "PYQuanPin": "Urinx",
            "RemarkPYInitial": "",
            "RemarkPYQuanPin": "",
            "StarFriend": 0,
            "AppAccountFlag": 0,
            "Statues": 0,
            "AttrStatus": 0,
            "Province": "",
            "City": "",
            "Alias": "Urinxs",
            "SnsFlag": 0,
            "UniFriend": 0,
            "DisplayName": "",
            "ChatRoomId": 0,
            "KeyWord": "gh_",
            "EncryChatRoomId": ""
        },
        ...
    ],
    "Seq": 0
}

其中,MemberCount表示总共有多少联系人,里面的内容都比较清晰。

7、开启微信状态通知

用POST方法,访问:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify

POST的内容是JSON串,格式:


     BaseRequest: { Uin: xxx, Sid: xxx, Skey: xxx, DeviceID: xxx }, 
     Code: 3, 
     FromUserName: 自己ID, 
     ToUserName: 自己ID, 
     ClientMsgId: 时间戳 
}

8、心跳包,与服务器同步并获取状态

以上步骤完成以后,就可以进入收发微信的循环了,可以用线程方式发送心跳包。

使用get方法,设置超时为60秒,访问:https://webpush.wx2.qq.com/cgi-bin/mmwebwx-bin/synccheck?sid=XXXXXX&uin=XXXXXX&synckey=XXXXXX&r=时间戳&skey=XXXXXX&deviceid=XXXXXX&_=时间戳

其他几个参数不用解释,这里的synckey需要说一下,前面的步骤获取的json串中有多个key信息,需要把这些信息拼起来,key_val,中间用|分割,类似这样:

1_652651920|2_652651939|3_652651904|1000_0

服务器返回:window.synccheck={retcode:”0”,selector:”0”}

retcode为0表示成功,selector为2和6表示有新信息。4表示公众号新信息。

9、读取新信息

检测到有信息以后,用POST方法,访问:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=XXXXXX&skey=XXXXXX

POST的内容:

{"BaseRequest" : {"DeviceID":"XXXXXX,"Sid":"XXXXXX", "Skey":"XXXXXX", "Uin":"XXXXXX"},"SyncKey" : {"Count":4,"List":[{"Key":1,"Val":652653204},{"Key":2,"Val":652653674},{"Key":3,"Val":652653544},{"Key":1000,"Val":0}]},"rr" :时间戳}

注意这里的SyncKey格式,参考前面的说明。

请求成功之后服务器会返回一个JSON串,其中AddMsgCount表示有多少信息,AddMsgList中是一个数组,包含了所有新消息,里面的MsgType表示信息类型,Content就是信息内容。

注意again,返回的信息中,会有新的synckey,要更新这个内容,下次获取信息访问要用这个新的key。

10、发送信息

这个比较简单,用POST方法,访问:https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg

POST的还是json格式,类似这样:

{"Msg":{"Type":1,"Content":"测试信息","FromUserName":"XXXXXX","ToUserName":"XXXXXX","LocalID":"时间戳","ClientMsgId":"时间戳"},"BaseRequest":{"Uin":"XXXXXX","Sid":"XXXXXX","Skey":"XXXXXX","DeviceID":"XXXXXX"}}

这里的Content是信息内容,LocalID和ClientMsgId都用当前时间戳。

以上就是基本的微信收发流程了。参考这个,可以自己去开发其他相关内容,比如群发消息之类的。欢迎讨论。

微信通信协议,用自己的程序收发微信,微信网页web版分析相关推荐

  1. 脱离微信运行环境,小程序如何实现微信授权登录

    据微信 2021 年财报披露,微信小程序 DAU 已经突破 5 亿,微信生态从业者超过 3000 万.阿拉丁研究院基于小程序数据库和公开资料测算,2022 年 H1 期间,微信.支付宝.抖音.快手等多 ...

  2. 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...

    参考官方Demo 1.进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的AppID即可. 2.腾讯地图+小程序appID:wx7643d5f831302ab0 3. ...

  3. android微信下拉出现小程序,仿新版微信的小程序下拉栏

    原标题:仿新版微信的小程序下拉栏 本项目会对金融交易软件中存在的各种View进行模仿绘制,提供详细的实现思路,收集整理相关算法.文档以及专业资料. https://github.com/scsfwgy ...

  4. 微信公众号发送小程序卡片_微信公众号群发文章支持添加小程序卡片

    2017年4月20日微信发布公告称,微信公众平号群发文章支持添加小程序功能,这对于推广小程序来说,无疑是不错的途径.那么微信公众号群发文章怎么添加小程序?下面爱站技术频道的小编带来的详细教程. 微信公 ...

  5. 微信群打卡小程序_用微信小程序“小打卡”,打造免费的阅读平台!

    小归 一直和微信小程序--"小打卡"的创始人保持着微信通讯,也写了<快捷|以"小打卡"为例带你玩转微信小程序!>,这篇文章主要是真对如何打卡来写的, ...

  6. 微信公众号发送小程序卡片_微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力...

    公众号或能在对话框中直接给粉丝推送小程序卡片了,这个功能似乎正在灰度测试中. 微信公众号将能够直接给用户推送小程序卡片,社交电商开始发力 一直以来,微信公众号和微信小程序一直是腾讯基于微信生态的两款明 ...

  7. 微信搜索不到小程序名字?微信小程序搜索不到应用怎么办?微信小程序怎么搜索?

    背景: 最近在玩微信小程序 梦想贩卖机1.088,我的小程序叫做"源码当铺",已经成功通过审核,但是在后台怎么搜索都搜不到这个小程序. 原因 排查了很多问题,包括搜索了很多前人的问 ...

  8. Vue.extend( options )微信单位食堂统计用餐小程序,微信食堂报餐小程序,单位食堂微信小程序

    参数: {Object} options 用法: 使用基础 Vue 构造器,创建一个"子类".参数是一个包含组件选项的对象. data 选项是特例,需要注意 - 在 Vue.ext ...

  9. android微信下拉出现小程序,Android仿微信首页下拉显示小程序列表

    花点时间重新熟悉一下AndroidUI方面的东西,把古董PullToRefreshView又撸了一遍,技术这种东西真是忘得快啊...在基础上新增一点东西,粗糙地实现了仿微信首页下拉显示小程序列表的样式 ...

最新文章

  1. Qt中文手册 之 QTreeWidget
  2. bdm导入mysql_vs 2010下使用水晶报表Crystal Reports
  3. vue如何sleep_Java常见面试题 非常实用【个人经验】
  4. 解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题(一般出现在win7 旗舰版)
  5. python 条件语句漫画解析_【Python】解析Python中的条件语句和循环语句
  6. 2018年国内就业薪资高的7大编程语言排行
  7. 360首席安全官谭晓生宣布离职
  8. 笔记-项目整体管理-变更管理-变更管理的原则
  9. 【NLP】自然语言处理 完整流程
  10. ibatis与spring的整合
  11. 1.8 编程基础之多维数组 09 矩阵乘法 6分 python
  12. mysql主从复制、读写分离到数据库水平拆分及库表散列
  13. 《IT项目管理那些事儿》——新浪微博抽奖活动
  14. 虚拟现实建模语言VRML
  15. macOS 应用程序dmg 已损坏无法打开解决办法
  16. java 后端,Java后端岗位职责描述
  17. 均匀裁剪图片(3000X3000到1000X1000)
  18. 计算机组成原理 全加器实验
  19. Barefoot:可编程交换在5G中的潜力
  20. 九个小妙方缩小毛孔立竿见影! - 生活至上,美容至尚!

热门文章

  1. 干货!360全景拍摄中相机设置的标准程序
  2. 浅谈相机<2>实际相机选型
  3. 面试时最经常被问到的问题II
  4. 解析word公式的解决方案(office插入和wps插入不同的解决方案)
  5. 毕设 美食论坛系统论文
  6. 开户行查询 API数据接口
  7. 终于实现了使用Java代码实现处理图片成圆角或圆形并抗锯齿有效的代码了
  8. 兆欧表测量电容器和电缆绝缘电阻值方法和步骤
  9. BACnet 工具 VTS的用法 总结
  10. 考勤助手——教务安排课程用例图