mitmproxy-py脚本编写
原⽂链接
1、脚本编写的两个条件
1.1 编写⼀个 py ⽂件供 mitmproxy 加载,⽂件中定义了若⼲函数,这些函数实现了某些 mitmproxy 提供的事件,mitmproxy 会在某个事件发⽣时调⽤对应的函数
1.2 编写⼀个 py ⽂件供 mitmproxy 加载,⽂件定义了【变量 addons】,addons 是个数组,每个元素是⼀个类实例,这些类有若⼲⽅法,这些⽅法实现了某些 mitmproxy 提供
的事件,mitmproxy 会在某个事件发⽣时调⽤对应的⽅法。这些类,称为⼀个个 addon。
基本模板为
from mitmproxy import http, ctx
import json
class xxx:
def xxx:
def xxx
addons = [
xxx() //类名的加载,也可以定义多个类,然后以数组的形式添加,进⾏加载
]
1.3 针对 HTTP ⽣命周期
def http_connect(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 收到了来⾃客户端的 HTTP CONNECT 请求。在 flow 上设置⾮ 2xx 响应将返回该响应并断开连接。CONNECT 不是常⽤的 HTTP 请求⽅法,⽬的是与服务器建⽴代理连接,仅是 client 与 proxy 的之间的交流,所以 CONNECT 请求不def requestheaders(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来⾃客户端的 HTTP 请求的头部被成功读取。此时 flow 中的 request 的 body 是空的。
def request(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来⾃客户端的 HTTP 请求被成功完整读取。
def responseheaders(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来⾃服务端的 HTTP 响应的头部被成功读取。此时 flow 中的 response 的 body 是空的。
def response(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 来⾃服务端端的 HTTP 响应被成功完整读取。
def error(self, flow: mitmproxy.http.HTTPFlow):
(Called when) 发⽣了⼀个 HTTP 错误。⽐如⽆效的服务端响应、连接断开等。注意与“有效的 HTTP 错误返回”不是⼀回事,后者是⼀个正确的服务端响应,只是 HTTP code 表⽰错误⽽已。
2 、脚本函数编写
2.1 替换请求
from mitmproxy import ctx, http
import json
class Modify:
def request(self, flow):
#替换请求链接
quest.url.startswith("spay1.shuqireader/api/ios/info?method=priceList"):
#有分享
ctx.log.info("修改链接")
addons = [
Modify()
]
2.2 修改cookies
from mitmproxy import ctx, http
import json
class Modify:
def request(self, flow):
#替换cookie,两种匹配请求链接的⽅式
# quest.host == "":
quest.url.startswith("/"):
quest.url)
kies)
req = kies["_testCookie1"]
ctx.log.info(req)
addons = [
Modify()
]
2.3 修改请求参数
from mitmproxy import ctx, http
import json
class Modify:
def request(self, flow):
quest.url.startswith("/customActivity/bookcode/doJoin"):
ctx.log.info("modify request form")
quest.urlencoded_form:
else:
("actId", "20727"),("nick","name")
]
addons = [
Modify()
]
2.4 修改相应状态
from mitmproxy import ctx, http
import json
class Modify:
def response(self, flow):
quest.url.startswith("baidu"):
ctx.log.info("modify status code")
addons = [
Modify()
]
2.5 修改响应体
from mitmproxy import ctx, http
import json
class Modify:
def response(self, flow):
quest.url.startswith("/activityInfo/getPrizeInfo=="):
//获取响应的json字符串,转成python对象进⾏解析和修改
response = json._text())
response['limitCount'] = 1
//修改完成后,奖python对象转成json字符串,set进请求的响应体重发送给客户端
ctx.log.info('modify limitCount')
addons = [
Modify()
]
2.6 读取json⽂件中字符串返回客户端
from mitmproxy import ctx, http
import json
class Modify:
def response(self, flow):
quest.url.startswith("/activityInfo/getPrizeInfo=="):
//读取⽂件,在当前⽂件路径下执⾏脚本,否则需要写⽂件的绝对路径;不然会不到该json⽂件
python json字符串转数组
with open('getStatus.json','rb') as f:
//从json⽂件中读取数据成python对象
res = json.load(f)
//将读取的python对象转成json字符串发送给客户端
ctx.log.info("modify order status")
addons = [
Modify()
]
2.7 Request的⼀些⽅法:
get_query():得到请求的url的参数,被存放成了字典。
set_query(odict):设置请求的url参数,参数是字典。
get_url():请求的url。 set_url(url):设置# url的域。
get_cookies():得到请求的cookie。 headers:请求的header的字典。
content:请求的内容,如果请求时post,那么content就是指代post的参数。
Response的⼀些⽅法如下: Headers:返回的header的字典。
Code:返回数据包的状态,⽐如200,301之类的状态。
Httpversion:http版本。
3、脚本加载
mitmdump -s script.py
4、插件脚本的基本使⽤
4.1 ⽇志输出,
⽇志输出
调⽤ctx模块:from mitmproxy import ctx引⼊,然后通过输出:
ctx.log.info(显⽰⽩⾊)
ctx.log.wran(显⽰黄⾊)
(显⽰红⾊)
4.2 参数flow,我们可以通过quest属性获取当前请求,
通过获取相应属性,如:
更多内容请查看mitmproxy的API接⼝
不仅可以获取相应的值,我们也可以对其值进⾏修改:
# 通过这种⽅式我们就可以进⾏修改和伪造请求,通过此⽅式我们知道,在⽇常上⽹的过程中,有时候我们输⼊的url是正确的,但是页⾯内容却与我们所需要看到的不同,有的钓鱼⽹站可能是通过此⽅式进⾏改变⽹页信息的,因此我们在⽇常上⽹过# 在⽇常爬⾍过程中,我们可以通过修改cookies和添加代理的⽅式来规避⽹站的反爬。
4.3 参数flow,我们可以通过sponse属性获取当前请求
# 对于爬⾍来说,我们更想获取其响应的内容,对于响应来说,我们采⽤response()⽅法来获取响应的内容:
通过获取相应属性,如:
<(获取响应的内容)
通过上述的这些基本⽅法再加上⼀些数据的存储技术,就可以实现对数据的抓取了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论