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