Contents

企业微信自动健康上报脚本小记

Contents

编写企业微信自动健康上报脚本小记

关于

疫情期间学校要求每天都要健康打卡,之前是中午12点之前打卡,现在改成晚上21点到22点之间打卡,有时候事情多总是会忘,再加上周末可能会超过22点才回学校,上报定位也是个问题,因为这些原因,昨晚闲着没事给手机代理然后抓了个包,简单写了个脚本自动提交健康打卡。

简单看了一下,表单页面是通过form_id来请求api获取需要填写的表单内容,我们提交的时候也是需要这个form_id,由于这个form_id每天可能都会变,需要先获取一下,也就是下图这个页面:

8CF7904CAC110B9C3F09D53417FDFCEF

API为:

1
https://doc.weixin.qq.com/form/healthformlist

获取到其中的form_id就可以直接提交了,看了一下定位的流程,发现其实提交时提交的是写死的字符串

在表单点击定位时,会调用手机gps获取当前坐标,然后调用腾讯地图api获取指定坐标的详细信息,如下图

https://leonsec.gitee.io/images/image-20211202214529972-8452737.png

所以其实最后提交的是获取的位置信息静态中文字符串,所以妈妈再也不用担心晚上十点后回学校的定位问题了

提交的http报文如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
POST /form/share?f=json HTTP/1.1
Host: doc.weixin.qq.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarynFnLeYS3a4cZQr7B
Origin: https://doc.weixin.qq.com
Accept-Encoding: gzip, deflate
Cookie: **********************
Connection: close
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko)  Mobile/15E148 wxwork/3.1.18 MicroMessenger/7.0.1 Language/zh ColorScheme/Light
Referer: https://doc.weixin.qq.com/
Content-Length: 1657
Accept-Language: zh-CN,zh-Hans;q=0.9

------WebKitFormBoundarynFnLeYS3a4cZQr7B
Content-Disposition: form-data; name="type"

2
------WebKitFormBoundarynFnLeYS3a4cZQr7B
Content-Disposition: form-data; name="form_id"

AGkA4wfzAA0_AGkA4wfz-A0AH8AtgaFAFoxwj9N5t3Ql1638374400
------WebKitFormBoundarynFnLeYS3a4cZQr7B
Content-Disposition: form-data; name="form_reply"

{"items":[{"question_id":1,"text_reply":"{\"type\":\"\",\"nation\":\"中国\",\"province\":\"江苏省\",\"city\":\"南京市\",\"district\":\"栖霞区\",\"addr\":\"江苏省南京市南京邮电大学(仙林校区)\",\"lat\":32.1126594543457,\"lng\":118.93416595458984,\"module\":\"wework-native\",\"exportText\":\"江苏省南京市南京邮电大学(仙林校区)\"}","option_reply":[]},{"question_id":2,"text_reply":"","option_reply":["1"]},{"question_id":3,"text_reply":"","option_reply":["2"]},{"question_id":4,"text_reply":"","option_reply":["2"]},{"question_id":6,"text_reply":"","option_reply":["2"]},{"question_id":7,"text_reply":"","option_reply":["1"]},{"question_id":8,"text_reply":"","option_reply":["5"]},{"question_id":9,"text_reply":"","option_reply":["2"]},{"question_id":10,"text_reply":"","option_reply":["3"]},{"question_id":11,"text_reply":"","option_reply":["3"]},{"question_id":12,"text_reply":"","option_reply":[]},{"question_id":13,"text_reply":"","option_reply":[]}]}
------WebKitFormBoundarynFnLeYS3a4cZQr7B
Content-Disposition: form-data; name="f"

json
------WebKitFormBoundarynFnLeYS3a4cZQr7B
Content-Disposition: form-data; name="source"


------WebKitFormBoundarynFnLeYS3a4cZQr7B
Content-Disposition: form-data; name="vcode"

null
------WebKitFormBoundarynFnLeYS3a4cZQr7B--

其中form_reply表单是提交的健康打卡表单内容,定位也为南京邮电大学,如果有其他要求可以自己修改

基于此写了个自动化脚本,开源地址:

Github: https://github.com/Le0nsec/qiye_weixin_health_check

环境

Python2

使用

  1. 使用前请先安装hackhttp

    1
    
    pip2 install hackhttp
    
  2. 添加你的企业微信cookie(因为考虑到多人使用,所以使用了dict,可以添加多个cookie,会遍历提交) 先使用浏览器打开新的无痕窗口,访问:https://doc.weixin.qq.com/disklogin/login_page,然后使用你登陆了南京邮电大学的企业微信(不是微信)扫码登陆

    登录后按F12打开开发者工具,或者在网页空白处右键点击“检查”,如下图:

    image

    然后在控制台(console)输入document.cookie查看当前cookie字符串:

    https://leonsec.gitee.io/images/144441988-90e30845-8a31-4c28-9751-1202047df99d.png

    复制后粘贴到脚本中即可

  3. 运行

    1
    
    python2 auto_health_check.py
    

    脚本中使用了server酱进行通知,打卡成功或者失败都将通知到手机,需要自行替换,具体用法参考https://sct.ftqq.com/,如果不需要,可以自行删除这部分代码

    关于自动打卡,可以挂在服务器上设置定时任务运行,或者直接在代码中加sleep 24h。

    由于微文档的cookie只有一天有效期,无法持续自动打卡,因为客户端登录态是持久的,所以去看了一下企业微信的授权认证方式,发现是通过传wwapp_cst、wwapp_deviceid等参数给服务端,服务端确认后才set-cookie

    deviceid和vid是固定不变的,cst是客户端生成的,所以需要逆向企业微信看生成的算法,看能不能自己生成

    逆向ing…

    和逆向大手子一起逆了几天,frida hook来hook去,最后cst是与服务端通信获得的,过于麻烦所以没有继续跟下去了。