Chrome 如何快速获取 request header?

2020-10-24 23:05:23 +08:00
woshichuanqilz  woshichuanqilz

一般的做法就是 f12 打开 dev tool 然后复制粘贴,

但是现在想用程序自动化的实现这个功能

我这边用了 mitmproxy 比较卡。

然后想到了 tampermonkey, 不太熟悉 js 没有找到办法, 这里请问一下如何能实现这个功能。 通过后台的程序自动化的获取 request header

2972 次点击
所在节点   Python  Python
10 条回复
locoz
locoz
2020-10-24 23:19:25 +08:00
代理是最好的办法了…
ClericPy
ClericPy
2020-10-25 00:09:18 +08:00
```
import asyncio
from ichrome import AsyncChromeDaemon, AsyncTab


async def show_headers(tab: AsyncTab):
await tab.wait_response(filter_function=lambda r: 'httpbin.org/headers' in
r['params']['response']['url'],
callback_function=lambda r: print(
r['params']['response']['headers'], '\n', r[
'params']['response']['requestHeaders']))
# await tab.wait_request(lambda r: print(r))


async def main():
async with AsyncChromeDaemon() as cd:
async with cd.connect_tab() as tab:
task = asyncio.create_task(show_headers(tab))
await tab.goto('https://httpbin.org/headers')
# print(await tab.html)
await task


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


```
yucongo
yucongo
2020-10-25 00:22:02 +08:00
自己解析解密 chrome 的 sqlite3 格式 cookies 库(可能比想象的稍微难一点)或是用 browser-cookie3 https://pypi.org/project/browser-cookie3/
crab
crab
2020-10-25 00:30:57 +08:00
mengyx
mengyx
2020-10-25 00:34:01 +08:00
我用做过一个 Golang 的 MITM Proxy 。性能还行,外包的项目中实际验证过,需要的话可以找我
mengyx
mengyx
2020-10-25 00:37:15 +08:00
或者 Chrome 的 Devtools 也有相应 Api,https://chromedevtools.github.io/devtools-protocol/
ClericPy
ClericPy
2020-10-25 00:49:51 +08:00
V2 吞我空格...?

https://paste.ubuntu.com/p/QrDmcGwxvS/

加上 Headless 和禁用图片, 也可以屏蔽 css 和 mp4 没放上, 冷启动 3 秒, 连接已经启动的 tab 大概 1 秒(基本就是花在下载), 同域名并发被 Chrome 限制在 6 以内, 所以没写并发的
kajweb
kajweb
2020-10-25 01:18:41 +08:00
我最近准备开源的 stop-debugger 您可以关注一下,基于 node 屏蔽浏览器调试 debugger 。
里面的 proxy-serve 模块可以满足您的要求。
基本原理是使用 net 模块获得请求并进行代理。

https://github.com/kajweb/stop-debugger
kajweb
kajweb
2020-10-25 01:19:39 +08:00
浏览器拓展可以参考 XSwitch 的源码
woshichuanqilz
woshichuanqilz
2020-10-25 11:12:24 +08:00
解决了谢谢各位的帮助, 主要参考的是 @Cleric 的思路, 我用了 pychrome

基本代码在这里比较粗糙

```
import pychrome
from urllib.parse import urlparse
import subprocess, signal
import os
import time


def killprocess(pname):
p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE)
out, err = p.communicate()
for line in out.splitlines():
pinfo = line.decode().lower()
if pname in pinfo:
pid = int(line.split(None, 1)[0])
os.kill(pid, signal.SIGKILL)

header = dict()
url = "https://www.dogedoge.com"
if not url.endswith('/'):
url += '/'
domain = urlparse(url).netloc
killprocess('chrome')
cmd = 'google-chrome-stable --remote-debugging-port=9222'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
time.sleep(3)

# 创建一个浏览器实例
browser = pychrome.Browser(url="http://127.0.0.1:9222")

# 新建一个页签
tab = browser.new_tab()


# 需要注册的回调函数
def request_will_be_sent(**kwargs):
if url == kwargs.get('request').get('url'):
header = kwargs.get('request').get('headers')
return


tab.Network.requestWillBeSent = request_will_be_sent

# 开始接收消息, requestWillBeSent 事件发生时被注册的回调函数也可以执行
tab.start()

# 调用方法
tab.Network.enable()

# 调用方法并设置超时时间
tab.Page.navigate(url=url, _timeout=5)
input()
# 等待页面加载
tab.wait(5)

# 停止处理事件, 停止从 chrome 接收消息
tab.stop()

# 关闭页签
browser.close_tab(tab)

```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/718282

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX