无聊的吐槽哈,忽略忽略,哈哈

写这篇的起因是要疫情开始之后,各种人群聚集场所都有管制措施了,包括图书馆。拿本人举例吧,一般都是去首都图书馆,可以总是忘记预约,或者临时才想起有时间去,结果呢,就是没名额了,不能去啊。最惨的一次,从早上起床开始刷预约,坐公交车将近俩小时到了图书馆,一直在刷预约,手机都给用没电了,还没预约成功。既然到了哈,就不能放弃,终于又刷了将近一个小时才有名额。想想自己做为一名 N年工作经验的菜鸟程序员,不能只会增删改查啊。于是乎,就找到了Fiddler,这也就是为什么有这篇的文章的原因了。

Fiddler 下载

首先是 Fiddler 经典版(Windows) 网址链接 fiddler-classic ,此链接是专为 Windows 系统设计的,若是需要运行在其它操作系统,可以使用 fiddler-everywhere ,国内(2021-9月)是可以正常访问的。

下载时需要填写使用目的,邮箱及所在地址,随便填写就行。

Fiddler 安装与配置

下载后为exe文件,双击安装即可。安装完毕打开软件,打开选项,如下图:

在弹出的窗口中选择HTTPS设置,如下图:

关于Fiddler证书的使用

切换到Connections选项,设置让本机开始代理,拦截请求,如下图:

这样就设置完毕啦,哦,重启下软件最好

iPhone下载并信任证书

首先确保手机和电脑在同一网络环境且可以通联,如连接的是同一个WIFI路由器。打开设置中的无线局域网,如下图:

点击上图中的图标设置手机代理,如下图:

这里假设电脑IP地址是192.168.10.110。

打开手机浏览器,输出 192.168.10.110:8888 ,会打开一个网页,如下图:

打开iPhone设置,如多出一个选项,如下图:

点击之后弹出如下:

点击右上角安装,弹出下图:

验证密码安装之后如下图:

还需要到   设置-通用-关于本机 中,最下方的 信任证书 中,开户信任 DO_NOT_TRUST_FiddlerRoot 证书,如下图:

开启信任:

至此,手机端已设置完成,可以开始请求拦截工作了

拦截请求

打开Fiddler,手机打开微信首都图书馆小程序,会拦截到如下请求:

从图中可以看到,首都图书馆预约域名是 yy.clcn.net.cn ,可以设置只显示些域名的请求。

分析预约的请求,终于有头绪了,接下来是编码实现。前提是需要有 Authorization 对应的值,这个就是一个 Token 字符串,有一定的有效期。

编码刷预约名额

直接上代码吧,哈哈,简单粗暴

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
import java.util.regex.Pattern;import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;public class MockForLibrary {public static void main(String[] args) throws IOException {int MAX = 32;String date = "2021-09-04";String authorization = "Bearer eyJ0eXAi...";System.out.println("=============================================");System.out.println(date);System.out.println(authorization);System.out.println("=============================================");// 预约的URLString requestUrl = "https://yy.clcn.net.cn/------------";final HttpPost http = new HttpPost(requestUrl);http.setConfig(RequestConfig.custom().setConnectTimeout(3000).setConnectionRequestTimeout(3000).setSocketTimeout(3000).build());// 设置请求头信息,最重要的是 authorization 这条http.setHeader("Connection", "keep-alive");http.setHeader("User-Agent", "Mozilla/5.0 (Linux; Android 6.0; ... MiniProgramEnv/android");http.setHeader("charset", "utf-8");// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!http.setHeader("authorization", authorization);http.setHeader("Accept-Encoding", "gzip,compress,br,deflate");http.setHeader("content-type", "application/json");http.setHeader("Referer", "https://servicewechat.com/...");// 这个地方一开始着实让人头疼了一把,请求体中写JSON格式数据,查了资料才搞定String toj = "{\"appointment_at\":\""+date+" 21:00\","+ "\"library_id\":1,\"appointment_period\":\"09:00-21:00\"}";StringEntity forwrd = new StringEntity(toj);forwrd.setContentType("application/json");forwrd.setContentEncoding("UTF-8");http.setEntity(forwrd);// 记录下所有线程刷的总次数,下面有限制最多执行多少次,总不能无限的刷吧final AtomicLong counter = new AtomicLong(0);// 一个停止的标志位final HaltFlag flag = new HaltFlag();// 记录下开始时间final Date start = new Date();// 要预约的日期final String date2 = date;System.out.println("*********************START");// 使用固定数量的线程池final ExecutorService pool = Executors.newFixedThreadPool(MAX);Runnable r = new Runnable() {public void run() {String responseTxt = null;int responseLen = 0;do {if (!flag.doContinuously) { // 是否继续执行,为false时中断执行break;}long c = counter.incrementAndGet();if (c>1000000) { // 最大执行次数break;}try {// 模拟HTTP请求CloseableHttpClient httpclient = HttpClients.custom().build();CloseableHttpResponse response = httpclient.execute(http);HttpEntity entity = response.getEntity();responseTxt = EntityUtils.toString(entity);EntityUtils.consume(entity);response.close();httpclient.close();//  {"name":"Bad Request","message":"预约状态无效或已约满","code":0,"status":400}//  {"appointment_at":"2021-09-02 09:00-21:00","library_id":1,"appointment_period":"09:00-21:00","expire_at":163...//  {"name":"Unauthorized","message":"Your request was made with invalid credentials.","code":0,"status":401}// 根据返回的结果判断// Unauthorized意味着Token已过期,需要重新捕获if ( (responseLen=responseTxt.length())>200 || responseTxt.contains("Unauthorized")) {System.out.println(responseTxt + "----" + c + "----" + Thread.currentThread().getName());break;}if (c%1000==0) { // 1000次System.out.println("*********************" + c);System.out.println(responseTxt + "----" + c + "----" + Thread.currentThread().getName());}} catch (IOException e) {System.err.println("EEEE"+e.getLocalizedMessage());if (responseTxt==null) { // 有异常的继续下一次循环responseTxt="";responseLen=0;}}} while (responseTxt!=null && responseLen<200);flag.doContinuously = false;pool.shutdown();pool.shutdownNow();System.out.println();System.out.println();System.out.println();System.out.println(responseTxt + "----" + Thread.currentThread().getName());System.out.println();System.out.println();System.out.println();if (responseTxt!=null&&responseTxt.contains("Unauthorized")) {System.out.println("---------------------------------------------------------" + "\r\n"+ responseTxt);} else {SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss");System.out.println("*********************************************************" + "\r\n"+ "*********************************************************" + "\r\n"+ "Date:  " + date2 + "\r\n"+ "Start: " + fmt.format(start) + "\r\n"+ "Get_At:" + fmt.format(new Date()) + "\r\n"+ "*********************************************************" + "\r\n"+ "*********************************************************");}System.exit(0);}};for (int i = 0; i < MAX; i++) {pool.execute(r);}}private static class HaltFlag {boolean doContinuously = true;}}

提示一下,如果要第二天去,今天下午就可以开始运行了,有人取消的话,能第一时间抢到。

Fiddler与iPhone配合拦截首都图书馆微信小程序请求并多线程模拟请求刷预约 Java HttpGet HttpPost相关推荐

  1. 小程序promise封装post请求_微信小程序promise封装get/post请求

    微信小程序promise封装get/post请求 2020-07-04 20:42:49 微信小程序promise封装get/post请求 叶子兔 2018-10-10 08:55:30  1056  ...

  2. 微信小程序开发工具能正常请求后台数据,手机预览请求失败

    微信小程序开发工具能正常请求后台数据,手机预览请求失败 问题描述 微信开发者工具调试完想用手机预览效果,结果发现凡是后台请求都失败. 原因分析 可能的原因有三个: 微信开发者工具详情里的本地设置,没有 ...

  3. 黑科技:轻松实现JS与微信小程序中的多线程

    前言 众所周知,js是单线程的去跑代码,如果使用一个较长时间的循环来执行代码,浏览器就会卡死,直到js执行完毕,用户体验极差:因此对于较长时间的代码块,最好使用多线程去执行,关于这一点网上说可以用De ...

  4. 微信小程序上传图片到服务器总是失败_微信小程序上传图片过大导致请求失败的解决方法...

    很多时候我们都会碰到小程序上传图片时因为图片过大而导致请求失败,同时出现各种各样的问题,那么今天来给大家写一个微信小程序上传图片过大导致请求失败的完美解决办法. 以云开发小程序图片检测为例,如果图片过 ...

  5. 微信小程序上线后,苹果手机请求不到数据,安卓可以

    微信小程序上线后,苹果手机请求不到数据,安卓可以 首先说明一下我的小程序页面是嵌入的网页--webview,在网页里面,会有各种网络请求,上线后,安卓手机测试没有问题,苹果手机能加载到页面,但是没有请 ...

  6. 【抓包工具】配置:Fiddler 设置 APP 抓包成功,微信小程序却无网络问题解决

    目录 一.问题情况:微信小程序无网络 二.问题解决:微信小程序无网络 三.问题情况:APP 无网络 四.问题解决:APP 无网络 一.问题情况:微信小程序无网络 fiddler 配置 https 成功 ...

  7. fiddler抓取不了PC端微信小程序的包解决方法

    fiddler抓取不了微信小程序的包 最近突然遇到微信抓取不到小程序包,之前都是好的,但突然就凉凉了,经过不懈的查找终于在某个大佬的文章找到解决方法.原址在这里:https://mbd.baidu.c ...

  8. 兼容微信小程序的流式网络请求库

    本项目从属于笔者的Web开发入门与最佳实践之前端开源项目系列.如果对于HTTP协议与规范尚不掌握的建议阅读HTTP 基础与变迁一文.如果对于REST尚不掌握的推荐阅读来自微软的接口设计指南以及来自于P ...

  9. 微信小程序正确的异步request请求,根据经纬度获取地理位置信息

    微信小程序的所有request请求都是异步的,不支持同步.但是在请求时可能会耗费一定时间,这样的话在获取返回数据时可能方法还没有执行完就已经进行赋值操作了.我遇到的就是拿到的数据为undefined. ...

最新文章

  1. 微信小程序多张图片和表单一起上传,验证表单及进度条的实现完整代码
  2. 解决Android的ListView控件滚动时背景变黑
  3. AJAX是一门艺术: XHR篇
  4. 撰写实施方案注意事项
  5. 上传漏洞学习——upload-labs 闯关(二)
  6. python写sql语句_简单的(笨的)用python以及SQL语句书写增删改查
  7. 计算机专业 拒绝清华,高分拒绝清华北大怎么回事 为什么会拒绝
  8. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(一)-- 起步
  9. cordova 实现网页缓存_如何解决ionic,cordova混合开发的app缓存大的问题
  10. 解决UBUNTU NVIDIA驱动安装后循环登录问题:关闭UEFI Secure Boot选项
  11. 安卓系统管理软件_26号免费软件集合
  12. 20+免费精美响应式Html5 网站模板01(含源码)
  13. 什么是Microsoft Visual FoxPro?
  14. 【2016.11.28】纯HTML仿微博注册页面
  15. 7z删除_7Zip免费的文件压缩/解压软件,包括独有的7z文件
  16. [论文笔记]Feature-constrained Active Visual SLAM for Mobile Robot Navigation
  17. ubuntu下安装wps出现系统缺失字体问题?
  18. python实践输出星星_打印星星 - Python
  19. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)
  20. RPG角色扮演C++

热门文章

  1. 百部BBC经典纪录片,附地址,需要的请抱走
  2. Apache Beam中python常用函数(二):聚合函数
  3. 日语编程语言抚子-第三版实现初探
  4. win10 下 maven 安装与配置
  5. 疯狂Java讲义(七)----第三部分
  6. Tradeoff 是一种针对目标选择有效的路径的思维方式
  7. 你离互联网大公司的距离只有三个月:算法小白的面试成长之旅之路线图
  8. php插入友情链接,PHP_详解WordPress中添加友情链接的方法,友情链接对于一个每个独立博 - phpStudy...
  9. 互联网低成本的创业与变现
  10. matlab接触刚度编程,关于接触刚度的定义