企业微信自动化打卡
1、POST 请求抓包
Fiddler 抓包教程
为什么我要编写企业微信打卡的自动化脚本?
说实话,我本不想浪费这个时间,但无奈每天都要自己重新输入一遍一些重复、本不会变的信息,就显得很傻逼。关键是我记得之前的一个版本有表单回显,现在这个版本居然取消了???忍不了。。。
开启 Fiddler 等待抓包
你只需要开启 Fiddler,接着去企业微信里面提交你的表单,然后静静等待你的 POST 请求出现即可。呜呜呜,Fiddler 真的太好用了~~~
企业微信提交表单
请求格式分析
提交表单后,抓到如下两个 HTTP 请求:第一条是真正执行表单提交的 HTTP 请求;第二条是请求成功(或失败)之后的跳转,因此我们的重点是第一条提交表单的 HTTP 请求
接下来我们仔细来分析一下第一条请求,在该条请求上右击,选择【Copy】–>【Session】
将整个 Session 的文本复制到 SublimeText 中,可以很清晰地看出:
- 请求地址包含两对 QueryString,
wid
表示企业微信 id,userId
表示学生学号 - 图中一大片马赛克的地方就是我们表单提交的内容,也就是请求体(经过 URL 编码之后的内容)
- 如果表单提交成功,则返回一个 json 字符串
{"result":true}
作为响应体内容
随便找一个 URL 编解码工具,将抓包得到的请求体(经过 URL 编码之后的内容)扔进去,点击【UrlDecode 解码】即可得到明文
经 URL 解码后,请求体格式如下,应该是使用了 x-www-from-urlencoded
方式提交 form 表单
DATETIME_CYCLE=2021/01/29&XM_786837=<你的名字>&XGH_757439=<你的学号>&BMMC_211878=<你的学院>
&XB_520918=男&LXDH_176767=<你的电话>&RADIO_639162=否&RADIO_83895=否&RADIO_225560=否
&RADIO_160398=否&RADIO_95834=否&RADIO_403583=国内&TEXTAREA_773431=<你的地址>
&TEXTAREA_45559=&RADIO_187077=良好&TEXT_420290=36.3&RADIO_49500=否
&DATETIME_914682=&PICKER_599937=&RADIO_211767=否&RADIO_907124=否
&TEXTAREA_57709=&RADIO_794775=是
2、Postman 测试
配置 Postman
首先要选择 POST 方式,并填上请求地址(附带上 QueryString),然后设置请求头的 Content-Type
字段为 application/x-www-form-urlencoded;charset=UTF-8
将抓包得到的请求体内容(经过 URL 编码之后的内容)粘贴至 Body 中(选择 raw 方式)
测试请求
点击【Send】按钮发送 Http 请求,响应状态码为 200 OK
,并且响应体内容为 {"result":true}
,这说明请求成功,这就是后面编写代码的思路~
再次抓包进行验证
我们使用 Postman 发送 http 请求,再次抓包验证我们的思路确实没有问题
3、HttpClient 测试
参考资料
引入依赖
HttpClient
需要引入如下两个依赖:
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
</dependencies>
编写发送
raw
请求的方法
使用 HttpClient
客户端发送 raw
请求的方法
/***
* @description: 使用 HttpClient 客户端发送 raw 请求
* @param: url 请求的 url 地址
* @param: param 请求的 raw 参数
* @return: java.lang.String 响应体内容
* @author Oneby
* @date: 21:57 2021/1/29
*/
public static String rawPost(String url,String param) throws UnsupportedEncodingException {
// HttpClients.createDefault() 等价于 HttpClientBuilder.create().build();
CloseableHttpClient closeableHttpClient = HttpClients.createDefault();
// 创建执行 Post 请求的 Http 客户端
HttpPost httpost = new HttpPost(url);
// 设置 Content-type 为 application/x-www-form-urlencoded
httpost.setHeader("Content-type", "application/x-www-form-urlencoded");
// 将请求参数封装为 StringEntity 对象
StringEntity stringEntity = new StringEntity(param);
httpost.setEntity(stringEntity);
String content = null;
CloseableHttpResponse httpResponse = null;
try {
// 执行 Http 请求并获取 Http 响应
httpResponse = closeableHttpClient.execute(httpost);
HttpEntity entity = httpResponse.getEntity();
// 获取响应体信息
content = EntityUtils.toString(entity);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
//关闭连接、释放资源
httpResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
//关闭连接、释放资源
closeableHttpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
return content; // 返回响应体内容
}
测试代码是否能够成功提交打卡信息?
测试代码
public static void main(String[] args) {
String result = null;
try {
result = rawPost(
"<输入请求的 url 地址>",
"<输入请求体内容(复制之前的内容即可)>");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(result);
}
测试结果:看到是 true
我就放心了~
4、编写自动打卡程序
我将最前面的日期部分抽离了出来,后面都是固定不变的打卡信息,我特么真是服了,挂不得学校的系统垃圾,控件都没有一个像样的命名,像 RADIO_95834
、TEXTAREA_773431
这样的控件谁能分得清是个