您现在的位置是:网站首页 > 博客日记 >

playwright拦截并替换js

作者:YXN-python 阅读量:67 发布日期:2024-06-28

拦截所有js

注意:此事件应该在进入页面之前,也就是要放在 goto 之前

await page.route('**', lambda route: route.continue_() if not route.request.url.endswith('.js') else route.abort())

拦截并替换指定js文件

功能:

  • 拦截指定 js 文件
  • 拦截指定 js 文件,并替换此文件中的指定js代码并重新上传
# 拦截并替换js文件内的代码
@staticmethod
async def intercept_js(route, js, *, js_path=None, js_code=None, new_js_code=None):
    """
    拦截并替换js文件内的代码
    :param route:
    :param js: 需要拦截的js文件名,支持正则
    :param js_path: 如果有替换的本地文件则传入本地的js地址
    :param js_code: 需要替换的js代码
    :param new_js_code: 替换后的js代码
    :return:
    """
    # 使用方法
    # 方法一:拦截js文件,可使用正则
    # await page.route('**', lambda route: intercept_js(route, '需要拦截的js文件名')
    # 方法二:
    # 拦截js文件,并替换此文件中的指定js代码,然后替换为修改后的代码上传
    # await page.route('**', lambda route: intercept_js(route,
    #                                                   '需要拦截的js文件名',
    #                                                   """需要替换掉的js代码""",
    #                                                   '替换后的js代码'))
    # 方法三:
    # 拦截js文件,并将此文件内容替换成本地js
    # await page.route('**', lambda route: intercept_js(route,
    #                                                   '需要拦截的js文件名',
    #                                                   '需要替换的本地文件路径'))

    if all(not var for var in (js_path, js_code, new_js_code)):
        if re.match(r'%s' % js, route.request.url):  # 单独只拦截js
            print('阻止请求:', route.request.url)
            return await route.abort()
        else:
            return await route.continue_()
    if not re.match(r'%s' % js, route.request.url):  # 正常请求
        return await route.continue_()
    else:  # 需要修改js文件并重新上传
        print('修改请求:' + route.request.url)
        if js_path:  # 替换为本地js
            try:
                new_js_content = open(js_path, 'r', encoding='utf-8').read()
            except FileNotFoundError:
                raise FileNotFoundError(f'本地没有找到{js_path}文件')
        else:  # 替换指定js代码
            js_content = requests.get(route.request.url).text
            new_js_content = js_content.replace(js_code, new_js_code)
        await route.fulfill(
            body=new_js_content.encode(),
            headers={'Content-Type': 'application/javascript'}
        )

YXN-python

2024-06-28