首页 > 编程语言 >python--playwright修改GET/POST请求参数,抓包修改数据

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

时间:2023-10-25 11:34:31浏览次数:42  
标签:playwright GET url route await request 修改 context page

首先,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())

拦截更改网络请求

可以通过 page.on("request") 和 page.on("response") 来监听请求和响应事件。

from playwright.sync_api import sync_playwright as playwright
 
def run(pw):
    browser = pw.webkit.launch()
    page = browser.new_page()
    # Subscribe to "request" and "response" events.
    page.on("request", lambda request: print(">>", request.method, request.url))
    page.on("response", lambda response: print("<<", response.status, response.url))
    page.goto("https://example.com")
    browser.close()
 
with playwright() as pw:
    run(pw)

其中 request 和 response 的属性和方法,可以查阅文档:https://playwright.dev/python/docs/api/class-request

通过 context.route, 还可以伪造修改拦截请求等。比如说,拦截所有的图片请求以减少带宽占用:

context = browser.new_context()
page = context.new_page()
# route 的参数默认是通配符,也可以传递编译好的正则表达式对象
context.route("**/*.{png,jpg,jpeg}", lambda route: route.abort())
context.route(re.compile(r"(\.png$)|(\.jpg$)"), lambda route: route.abort())
page.goto("https://example.com")
browser.close()

其中 route 对象的相关属性和方法,可以查阅文档:https://playwright.dev/python/docs/api/class-route

灵活设置代理

Playwright 还可以很方便地设置代理。Puppeteer 在打开浏览器之后就无法在更改代理了,对于爬虫类应用非常不友好,而 Playwright 可以通过 Context 设置代理,这样就非常轻量,不用为了切换代理而重启浏览器。

context = browser.new_context(
    proxy={"server": "http://example.com:3128", "bypass": ".example.com", "username": "", "password": ""}
)

 

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

 POST请求结果为:

 

标签:playwright,GET,url,route,await,request,修改,context,page
From: https://www.cnblogs.com/Im-Victor/p/17786741.html

相关文章

  • window平台下Emacs Home目录的修改
    现在Emacs的Home目录会随机生成了,default-directory等已经不起作用了,查找了网上各种方法。下面这种方法是最方便的在控制台(cmd)中执行下面的命令:SETXEMACS_HOME"D:\Documents\Programming\emacshome"添加环境变量(这里是用户变量)或手动添加环境变量(系统变量也可以),这里的变量名E......
  • 用git stash暂存修改
    gitstash命令用于保存当前工作目录的临时状态,包括暂存区和已修改但未暂存的文件。它会将这些修改保存在一个临时区域(即“堆栈”)中,让你能够回到一个干净的工作目录,可以进行其他操作。等到你完成其他任务后,可以再回到之前的状态,继续之前的开发。使用场景切换分支:当你正在开发一个功......
  • apt-get
    apt-get是Debian及其衍生版本(如Ubuntu)中的命令行工具,用于处理与软件包相关的任务,如安装、更新、升级和删除软件包。apt-get是APT(AdvancedPackageTool)工具集的一部分,它提供了一个用于软件包管理的高级界面。以下是apt-get的一些常见用途和场景:安装软件包:你可以使用ap......
  • linux wget的使用
    环境centos7wget是一个在Linux系统中常用的命令行下载工具,它能够从网络上下载各种文件,如文本、图片、音频、视频等。常见用法和说明安装yuminstall-ywget下载单个文件wget[URL]如,wgethttp://example.com/example.txt另存文件名wget-Omyfile.txthttp://exam......
  • 中文Windows修改为英文并解决“无法获取此Windows显示语言”问题的方法
      本文介绍在Windows10操作系统中,修改系统的显示语言的方法;并解决在这一过程中,出现的“很抱歉,我们无法获取此Windows显示语言”报错问题。  本文就以将原本系统语言的中文修改为英文为例,介绍具体的方法。首先,我们在电脑左下角的开始菜单处,右键并选择“设置”;如下图所示。 ......
  • 基于mutation的自定义指令以监听用户使用f12修改dom
    昨天写了功能后,就又封了一个指令,可以直接应用于ui框架的input组件上贴贴:preventChange/index.jsexportconstpreventChange={inserted(el,binding){constelTag=el.tagName.toLowerCase();//获取当前dom下类型为password的input标签constpasswordI......
  • centos修改ip
    1.查看网卡ipaddr2.进入配置文件路径cd/etc/sysconfig/network-scripts3.查看路径下文件ls4.编辑网卡配置文件vimifcfg-eth05.文件内容参考TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=......
  • 时间复杂度O(40n*n)的C++算法:修改图中的边权
    1.12.1.题目给你一个n个节点的无向带权连通图,节点编号为0到n-1,再给你一个整数数组edges,其中edges[i]=[ai,bi,wi]表示节点ai和bi之间有一条边权为wi的边。部分边的边权为-1(wi=-1),其他边的边权都为正数(wi>0)。你需要将所有边权为-1的边都修改为范......
  • 解决SVN目录下不显示状态图标的情况,例如绿色表示正常,红色表示修改等不显示
    原文连接:https://blog.csdn.net/lr200012/article/details/1277329131.2.点击到该路径:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers 如果方框中的文件夹不在第一,就点击F2增加空格数(比别的文件夹空格数多)让其......
  • windows 在 PowerShell 中,可以使用 `Get-WindowsFeature` 命令来获取 Windows 功能的
    查询:在PowerShell中,可以使用Get-WindowsFeature命令来获取Windows功能的信息,包括已安装和可用的功能。以下是Get-WindowsFeature命令的一些常见参数:-Name:指定要获取的功能的名称。可以使用通配符来匹配多个功能,例如-NameWeb将匹配所有包含"Web"的功能。-Compute......