某观鸟记录中心的爬虫——mitmproxy的简单使用
前言
这次搞个有名字的网址,因此,笔者隐去关键信息。
网址如下
aHR0cDovL2JpcmRyZXBvcnQuY24vaG9tZS9zZWFyY2gvcGFnZS5odG1s
正文
前置分析
选择了对应的参数,进行查询,可以看到表单数据经过的加密

看看堆栈的调用

可以发现发送请求是jquery
再看看请求头

可以发现有Sign和Timestamp。
既然如此,先搜索一下关键字sign
搜出来有点多,如下

笔者专门截取了关键的内容,最下面setRequestHeader("sign", sign)
很可能是这个。点进去看看

那么显示,已经发现关键的东西,打个断点看看

看看调用的过程

可以发现是从page.html调用了jquery,然后调用了jqueryAjax
如下地方调用的

好,其他不必多说。就这样
分析
笔者把jqueryAjax.js文件复制到本地index.js,然后笔者新建一个目录,其中新建一个index.html
引入jquery.js和index.js,发送一个请求看看。index.html的内容如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script src="index.js"></script><script>$.post("https://127.0.0.1:8000",{page:1,})</script>
</head>
<body></body>
</html>
笔者随便选了一个端口发送请求
虽然说是失败了

但是,笔者发现了关键的东西

可以发现这个表单是经过加密的,同时还注意到

这个sign和timestamp都是存在的,
哈哈哈哈哈哈哈,虽然笔者不知道是什么加密,但是,不重要
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
笔者想到好玩的事情,笔者只需要确定参数,发送到本地的某个端口,使用mitmproxy代理到服务器。不就可以获取数据了
感觉没问题,试一试。
确定加密参数
这更简单,直接断点移动到对应的地方

可以看到有什么city之类,或者可以添加一个记录点

控制台获取打印的结果,总之,可以获取,如下

{"city":"","ctime":"","district":"","endTime":"","mode":"0","pointname":"","province":"","serial_id":"","startTime":"2025-11-15","state":"","taxonid":"","username":"","version":"CH4"}
编写代理
from mitmproxy import httpdef responseheaders(flow: http.HTTPFlow):flow.response.headers["Access-Control-Allow-Origin"] = "*"flow.response.headers["Access-Control-Allow-Credentials"] = "true"flow.response.headers["Access-Control-Allow-Headers"] = "access-control-allow-origin, sign, content-type, timestamp, requestId"flow.response.headers["Access-Control-Allow-Methods"] = "GET,POST,OPTIONS"def request(flow: http.HTTPFlow):flow.request.headers["Referer"] = "*****"if flow.request.method == "OPTIONS":flow.response = http.Response.make(204, b"",{"Access-Control-Max-Age": "86400"})
笔者多次尝试,发现需要Referer,不然会403
发送请求
在index.html中的代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><script src="index.js"></script><script>let data = {"city": "","ctime": "","district": "","endTime": "","mode": "0","pointname": "","province": "","serial_id": "","startTime": "2025-10-15","state": "","taxonid": "","username": "","version": "CH4"}$.post("http://127.0.0.1:8082/front/record/search/TaxonCountBar", data)</script>
</head>
<body></body>
</html>
结果如下

不知道具体是什么加密,总之,成功了,ok
总结
简单使用了一下mitmproxy
