企业微信自动化打卡

企业微信自动化打卡

1、POST 请求抓包

Fiddler 抓包教程

  1. Fiddler抓包详细教程
  2. fiddler 抓包详细教程

为什么我要编写企业微信打卡的自动化脚本?

说实话,我本不想浪费这个时间,但无奈每天都要自己重新输入一遍一些重复、本不会变的信息,就显得很傻逼。关键是我记得之前的一个版本有表单回显,现在这个版本居然取消了???忍不了。。。

企业微信自动化打卡

开启 Fiddler 等待抓包

你只需要开启 Fiddler,接着去企业微信里面提交你的表单,然后静静等待你的 POST 请求出现即可。呜呜呜,Fiddler 真的太好用了~~~

企业微信自动化打卡

企业微信提交表单

企业微信自动化打卡

请求格式分析

提交表单后,抓到如下两个 HTTP 请求:第一条是真正执行表单提交的 HTTP 请求;第二条是请求成功(或失败)之后的跳转,因此我们的重点是第一条提交表单的 HTTP 请求

企业微信自动化打卡

接下来我们仔细来分析一下第一条请求,在该条请求上右击,选择【Copy】–>【Session】

企业微信自动化打卡

将整个 Session 的文本复制到 SublimeText 中,可以很清晰地看出:

  1. 请求地址包含两对 QueryString,wid 表示企业微信 id,userId 表示学生学号
  2. 图中一大片马赛克的地方就是我们表单提交的内容,也就是请求体(经过 URL 编码之后的内容)
  3. 如果表单提交成功,则返回一个 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 测试

参考资料

  1. httpclient raw请求

  2. 使用httpclient需要的maven依赖

引入依赖

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_95834TEXTAREA_773431 这样的控件谁能分得清是个

上一篇:java反射学习


下一篇:什么是Throwable