GitHub上有很多关于微信机器人的实现版本,这里讲一下如何在安卓手机上实现一个微信聊天机器人。思路大致都是一样的,突破口都是调用微信的网页版的接口,进行网页登录,进而获取到微信里的聊天内容,然后调用聊天发送接口将内容发送给微信。
一、网页版的接口大致分为五类:
1.登录相关;接口jslogin、qrcode、webwxnewloginpage、webwxlogout
2.初始化相关;接口:webwxinit
3.获取联系人、群组信息;接口:webwxgetcontact、webwxbatchgetcontact
4.心跳及接收微信新消息;接口:synccheck、webwxsync
5.发送聊天信息;接口:webwxsendmsg、webwxuploadmedia、webwxsendmsgimg、webwxsendappmsg
二、手机上登录网页版接口的实现:
三、遇见的坑及解决方案:
1.以k-v方式保存下所有接口下发下来的cookie值,后续再次发起请求时,将保存的cookie值全部带上,以保证每个接口的所需。
2.webwxnewloginpage接口的Get和Post区别,这个接口的Get和Post请求是有区别的,以Get方式发起请求时,skey、wxsid等信息是在Response的Set-Cookie里保存的;以Post方式发起请求时,这些信息是在Response的body里返回的;
3.webwxinit接口的Ret返回1101错误码,这常见于在已经是网页版登录的情况下发起的二次网页登录;解决办法是,每次登录前,先进行webwxlogout,然后再正式开始登录操作。
4.心跳请求synccheck,错误码是1102时,说明请求时cookie的值有遗漏或者请求参数拼接得不对;错误码是1101时,是说明此刻网页版登录掉线了;错误码是retcode:0,selector:7
时,请检查一下请求参数里”synckey”的值传得是否对,这里要注意,不要对”synckey”的值进行UrlEncode!!!
5.发送文件接口webwxsendappmsg,错误码是1时,除了检查其他请求参数外,请确保content参数的值"<appmsg appid='wxeb7ec651dd0aefa9' sdkver=''><title>%s</title><des></des><action></action><type>6</type><content></content><url></url><lowurl></lowurl><appattach><totallen>%d</totallen><attachid>%s</attachid><fileext>%s</fileext></appattach><extinfo></extinfo></appmsg>",在进行JSON的格式转换时,避免其中的字符'/'被加上转义字符'\'!!!!解决办法就是在放入request body之前,进行一次replace。
6.在进行登录的过程中,需要将获取到的二维码进行二次改造。具体过程如下图:
根据原始二维码生成一张预览图片,二维码缩小尺寸居中放入。其中预览图片的尺寸必须严格是接口onPreviewFrame(Byte[],Camera)中,第二个参数Camera的预览尺寸。在红米手机上得到的camera.getParameters().getPreviewSize()
是w=768,h=432,getPreviewFormat
是17,即NV21格式的编码。
7.其他疑问,可以参考网上的资料。有一点需要强调,遇到有疑问或者调不通的情况,最可靠的办法就是与PC上的网页版登录进行一一比对。每个参数的有无,值的异同、是否Encode,都要比对和确认。不同的地方就是你APP上错误的地方。