【python--playwright修改GET/POST请求参数,抓包修改数据】

文章介绍了如何利用Playwright库在Chromium浏览器中拦截并修改GET和POST请求的参数。通过创建一个处理函数handle_route,实现了GET请求时将key1的值改为GET,POST请求时将key1的值改为POST。然后在Playwright的上下文中设置路由拦截,成功改变了请求参数,而浏览器网络面板显示的原始参数未变,但实际请求到服务端的参数已更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,playwright修改GET/POST请求参数后在浏览器(chromium)的network面板的入参是没有变化的,但实际上传给服务端的参数是已经发生变化了的,下面先搭建了一个返回入参的flask服务,地址为"http://127.0.0.1:8083"。

接着通过playwright分别发送GET和POST请求,参数均为:{"key1": "value1", "key2": "value2"},并实现如下功能:

1、将GET请求的key1的值修改为“GET”;

2、将POST请求的key1的值修改为“POST”。

首先需要一个方法处理GET/POST的参数,将key1的值做修改:

async def handle_route(route):
    url = route.request.url
    if route.request.method == "GET":
        print(f"GET请求url为:{route.request.url}")
        bits = list(parse.urlparse(url))
        qs = parse.parse_qs(bits[4])
        qs["key1"] = ["GET"] # 此处替换key1的值
        bits[4] = parse.urlencode(qs, True)
        url = parse.urlunparse(bits)
        print(f"改变后的url为: {url}\n")
        await route.continue_(url=url)
    elif route.request.method == "POST":
        print(f"POST请求入参为:{route.request.post_data}")
        text_list = route.request.post_data.split("&")
        for i in range(len(text_list)):
            text_item = text_list[i]
            if "key1=" in text_item:
                text_list[i] = "key1=POST" # 此处替换key1的值
        print(f"改变后的数据为: {'&'.join(text_list)}\n")
        await route.continue_(post_data="&".join(text_list))

然后就可以通过playwright的contexts.route或page.route对请求进行拦截处理,代码如下:

async def main():
    url = "http://127.0.0.1:8083"
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)
        context = await browser.new_context()
        page = await context.new_page()
        await context.route("*/**", lambda route: handle_route(route))
        await page.goto(f"{url}?key1=value1&key2=value2")
        await page.wait_for_load_state('networkidle')

        print("--新建窗口,使用js执行post请求--")
        page = await context.new_page()
        await page.evaluate(
        """
            //发送POST请求跳转到指定页面
            function httpPost(URL, PARAMS) {
                var temp = document.createElement("form");
                temp.action = URL;
                temp.method = "post";
                temp.style.display = "none";

                for (var x in PARAMS) {
                    var opt = document.createElement("textarea");
                    opt.name = x;
                    opt.value = PARAMS[x];
                    temp.appendChild(opt);
                }
                document.body.appendChild(temp);
                temp.submit();
                return temp;
            }
            httpPost('""" + url + """', {"key1": "value1", "key2": "value2"})
        """)
        await page.wait_for_timeout(1000)
        input("任意键关闭浏览器")
        await browser.close()
        await p.stop()


if __name__ == "__main__":
    asyncio.run(main())

最终服务端接收到的GET请求结果为:

 POST请求结果为:

详细代码(包含服务端):https://download.csdn.net/download/aa490791706/87775302

使用Playwright拦截请求并获取响应数据,可以按照以下步骤进行操作: 1. 导入所需的Playwright模块和相关类: ```python from playwright.sync_api import sync_playwright ``` 2. 初始化Playwright并创建一个浏览器实例: ```python with sync_playwright() as playwright: browser = playwright.chromium.launch() context = browser.new_context() page = context.new_page() ``` 3. 使用`page.route()`方法拦截请求,并在回调函数中获取响应数据: ```python def handle_request(route, request): # 获取请求的URL url = request.url # 获取请求的方法 method = request.method # 获取请求的头部信息 headers = request.headers # 获取请求的主体数据 body = request.post_data # 继续处理请求,获取响应数据 response = route.continue_() # 获取响应的状态码 status = response.status # 获取响应的头部信息 response_headers = response.headers # 获取响应的主体数据 response_body = response.body() # 在这里对请求和响应进行处理或保存数据等操作 # 拦截所有请求,并调用上面定义的回调函数处理请求和响应 page.route("**/*", handle_request) # 打开一个网页,触发请求拦截 page.goto("https://www.example.com") # 关闭浏览器实例 context.close() browser.close() ``` 在上面的代码中,`handle_request`函数是用来处理请求和响应的回调函数。在这个函数中,你可以获取请求的URL、方法、头部信息和主体数据,以及获取响应的状态码、头部信息和主体数据。你可以在这里对请求和响应进行处理或保存数据等操作。 请注意,上面的代码使用了Playwright的同步API,在异步环境中使用时,需要使用异步版本的相关方法和修饰器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值