1.需求
这两天帮一个同事调研一个需求。他的一个销售朋友想实现这么一个功能,在程序中登录个人的微信号,然后可以对微信好友进行分组,并对每个微信号进行相关的标签标定。比如好友A,是xx公司的研发总监,好友B,是yy公司的产品经理。把好友A和B拉进来后,发一条消息(对于好友A和B来说,还是单独发送的),会自动的把A改成xx公司的研发总监,B改成yy公司的产品经理,然后发送。
需求很简单,功能类似于一个简单的关键字替换。但是涉及到软件如何与微信接口交互的过程。因此主要调研了如何模拟个人微信号登录进行相关操作的过程。
2.调研过程
2.1 如何与微信交互
目前微信客户端包括终端app,电脑客户端和网页版微信。而且微信的开发手册里只提供了公众号的开发规范和流程,并没有对个人微信号开发开放接口。即我们不知道微信客户端与服务器的通信协议和流程。唯一的突破口在于网页版微信,即我们可以通过对浏览器抓包来解析出网页版微信是如何与服务器进行通信的。我们只要在程序中通过httpclient模仿浏览器,登录微信个人号,即可与微信服务器进行交互。目前网上有相关的开源包,包括python的itchat以及java版本的itchat4j。
2.2 网页版微信的登陆过程
只有分析和理解了网页版微信的操作,才能在我们程序中模拟网页版微信的操作。
在网页版微信中,输入https://wx.qq.com/, 返回了一个二维码,然后我们通过手机扫描二维码,手机端完成确认登录操作,网页版微信即登录成功。
那么,其内部的流程是如何呢?
1、通过发送https://login.weixin.qq.com/jslogin 外加参数appid,fun,lang,时间戳等至服务器,获得其返回结果,类似于window.QRLogin.code = 200; window.QRLogin.uuid = “xxx”,然后通过正则表达式获取uuid的值。
2、获得uuid值后,通过uuid值继续向服务器发送,获取二维码图片。此二维码图片包含了uuid的信息。
3、手机通过微信扫一扫,扫取二维码,获得相关的uuid信息,然后手机微信会向微信服务器发送消息,服务器就知道,此uuid是与此人微信账号进行了绑定。
4、此时,再向服务器发送包含了uuid的url,服务器会返回包含了skey,pass_ticket等信息的通关口令。后续我们通过这几个通关口令,即可与微信服务器通过http请求进行交互。