APP下载

微信网页版的模拟登录方案

2018-03-21张振扬湖北工业大学

数码世界 2018年2期
关键词:群组列表网页

张振扬 湖北工业大学

1 引言

微信是由腾讯开发的即时通讯软件。截止到2017年,微信的月活跃用户超过9.8亿,日活跃用户也达到了9.02亿。与以往QQ主要面向年轻群体不同,微信赢得了所有年龄层,又因为它功能全面却不失简洁,被誉为世界上最强大的应用程序之一。

现如今,通过微信开展的事务越来越多,除了同事间交流、通知、请示、汇报,员工还被要求利用微信维系客户关系、提供咨询服务以及产品的营销推广。以咨询服务为例,传统的现场咨询、电话咨询都是即时、一对一服务,而微信上时常会有多人同时咨询,又由于“最晚到的消息排列在最前”的设计,回复时效无法保证。

越来越多人希望能将重复、琐碎的工作交给一些辅助工具去做。本文以微信网页版为研究对象,分析并模拟微信网页版的登录、运行过程,为开发基于微信的辅助工具提供思路。

2 微信网页版的会话流程

作为一款即时通讯软件,我们可以将微信网页版的整个会话流程划分为“登录”-“初始化”-“消息更新”-“发送消息”四个部分。其中登录部分分为“获取UUID”-“获取二维码”-“等到扫描二维码”-“获取登录参数”四个步骤;初始化部分分为“获取初始化信息”-“开启微信状态通知”-“获取好友列表”-“获取群组列表”四个步骤;消息更新部分分为“检查消息”-“获取最新消息”。

3 模拟登录

微信网页版只能通过手机APP扫描二维码这一种方式登录。用户打开网页版微信地址(https://wx.qq.com)时,网页首先向服务器(https://login.wx.qq.com/jslogin)发送一个Get请求,具体请求参数如表1:

表1

微信服务器随之返回如下报文:window.QRLogin.code= 200; window.QRLogin.uuid = "xxx";其中,uuid是通用唯一识别码(Universally Unique Identifier)的缩写,用于区分每一次登录,而uuid的值还被用于显示二维码,二维码的URL格式为https://login.weixin.qq.com/qrcode/xxx。

在用户使用扫描二维码并点击确认登录之前,微信网页版每间隔一段时间,都会向服务器发送一个get请求,URL为https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login,具体参数如表2:

表2 请求二维码

如果服务器返回:window.code=201;代表用户已经扫描二维码,但尚未在手机上确认登录,如果返回:window.code=408;代表用户长时间没有扫描。一旦用户在手机客户端上点击确认登录,服务器端将返回如下数据:

window.code=200;window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpa ge?ticket=xxx&uuid=xxx&lang=zh_CN&scan=xxx";

此时,客户端会继续请求刚才服务端返回的URL,并得到如下返回结果:xxx。我们可以从中取得skey、wxsid、wxuin和pass_ticket四个参数的值。

4 微信初始化

前面的步骤仅仅完成了登录这一个过程,还需要继续获取用户的基本信息、好友、群组乃至公众号。客户端将继续访问如下URL:https://wx.qq.com/cgi-bin/mmwebwxbin/webwxinit?r=xxx&pass_ticket=xxx,其 中 r是 时 间戳,pass_ticket是前面获取到的值。在访问该URL时,还需要Post以下数据:{"BaseRequest":{"Uin":"xxx","Sid":"x xx","Skey":"xxx","DeviceID":"xxx"}}。Uin 即为 wxuin,Sid即为wxsid,DeviceID为e+15位随机数。服务器随即返回一个JSON串,其中ContactList是联系人列表,但并不完整,User是当前用户的信息。

然后,就要开启消息状态通知。访问如下URL:https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?pass_ticket=xxx, 并 Post如 下 数据:{"BaseRequest":{"Uin":0000000,"Sid":"xxx","Sk ey":"xxx","DeviceID":"xxx"},"Code":3,"FromUserN ame":"xxx","ToUserName":"xxx","ClientMsgId":x xx}。其中FromUserName和 ToUserName是自己的 id,而ClientMsgId是时间戳。服务器随即返回如下数据:{BaseResponse: {Ret: 0, ErrMsg: ""}, MsgID: "xxx"}

接着,需要继续获取好友列表和群列表。向https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact发送如表3中的参数的Get请求:

表3

服务端将返回一个列表,该列表即包括好友,也包括公众号,还包括群组,它们之间通过ContactFlag参数区分,1为好友,2为群组,3为公众号。

5 消息更新

要想保持消息的同步,就需要不断的向服务器发送Get请求检查最新消息,具体的URL为https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck,参数如表4:

表4

服务器将返回如下数据:window.synccheck={retcode:"0",selector:"0"},其中,retcode=0代表正常,retcode-1100代表失败或微信已登出,selector=0代表正常,selcector=2代表新的消息,selcector=7代表进入或退出聊天窗口。

当发现有新的消息时,客户端会向服务器post一个请求,URL为https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xxx&skey=xxx&pass_ticket=xxx, 同时提交下列数据:{"BaseRequest":{"Uin":xxx,"Sid":"xxx","Skey":"xxx","DeviceID":"xxx"},"SyncKey":{"Count":8,"List":[{"Key":1,"Val":701532377},{"Key":2,"Val":701533-243},{"Key":3,"Val":701533081},{"Key":11,"Val":701533192},{"Key":201,"Val":1514991006},{"Key":203,"Val":1514988765},{"Key":1000,"Val":1514973002},{"Key":1001,"Val":151497 3074}]},"rr":1132416953}。需要说明的是,rr为时间戳取反。

需要说明的是,Ret=0代表返回成功,AddMsgCount后的数值代表新消息个数,AddMsgList为新消息的列表。

6 发送消息

发送一条消息,实质上就是提交了一个post请求,URL为https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket=xxx,提交的数据为:{"BaseR equest":{"Uin":xxx,"Sid":"xxx","Skey":"xxx","DeviceID":"xxx"},"Msg":{"Type":1,"Content":"xxx","FromUserNa me":"xxx","ToUserName":"filehelper","LocalID":"xxx","ClientMsgId":"xxx"},"Scene":0}。其中,type为消息类型,1为文字消息,3为图片消息,Content为消息内容,LocalID为13位时间戳加上4位随机数。

7 总结

移动互联网时代带来了更多机遇,它令人们更便捷、更快速的发送消息,但实际上也导致很多人疲于回复消息。通过对微信网页版整个会话流程的分析,可以根据实际需求,开发出各种实用的微信辅助工具,将有需要的人从繁琐、重复的工作中解放出来。

猜你喜欢

群组列表网页
群组推荐系统:现状与展望
学习运用列表法
基于HTML5与CSS3的网页设计技术研究
扩列吧
基于HTML语言的网页制作方法
基于HTML5静态网页设计
搜索引擎怎样对网页排序
列表画树状图各有所长
2011年《小说月刊》转载列表