什么是CDP协议


什么是cdp协议

F12能够打开开发者工具进行调试,开发者工具即DevTools大家应该都知道,那么Chrome DevTools就是用的CDP协议来跟浏览器进行交互的调试等一系列操作的。
1.在devtools设置中打开Protocol Monitor用于监测cdp协议的调用记录:
image.png
image.png

  • 只看几个关键的cdp协议请求/响应内容。
  • Debugger.paused 官方文档说明 此方法会返回当前Debug触发时,暂停点的callFrame信息。
  • 当我们debug在这个点,并且在console输入命令时,我们是可以调用当前暂停断点位置的所有函数作用域内的函数,此时调用时候的CDP内容为Debugger.evaluateOnCallFrame方法,请求内容包含一个expression为执行的表达式内容。
  • image.png

远程调试模式启动浏览器

值得注意是安装 websocket 模块,要按照这以下顺序

  1. pip install webscoket
  2. pip install websocket-client

cmd中输入以下命令,启动远程调试浏览器

1
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9223 --user-data-dir="C:\Users\92859\Desktop\test"

“C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe”:浏览器的路径
edge的话通过:edge://version查看
image.png
–remote-debugging-port=9223:远程调试的websocket端口,可使用http://127.0.0.1:9223/json/version查看是否启动成功:image.png
–user-data-dir=”C:\Users\92859\Desktop\test”:用户数据保存地址,随便找个空文件夹就可以

:::info

如何关闭调试模式启动的端口:

在任务管理器中把edge全部关闭
:::

使用cdp调用加解密函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import json
import requests
import websocket


def websocket_conn():
# websocket_conn 连接
resp = requests.get('http://127.0.0.1:9223/json')
assert resp.status_code == 200
ws_url = resp.json()[0].get('webSocketDebuggerUrl')
return websocket.create_connection(ws_url,suppress_origin=True)
#return websocket.create_connection("ws://127.0.0.1:9223/devtools/browser/e423ff8b-7fc0-4396-a4c3-c87c96c443af", suppress_origin=True)


def execute_cdp(conn: websocket, command: dict):
# 执行 dp
conn.send(json.dumps(command))
# 接受websocket的响应,并将字符串转换为 dict()
return json.loads(conn.recv())


def main():
conn = websocket_conn()
# js = "console.log('hello world')" # 控制台打印 hello world
command1 = {
'method': 'Debugger.evaluateOnCallFrame', # 处理 传进去的 expression
'id': int(), # id需要传一个整型,否则会报错
'params': {
'callFrameId': callFrameId,
'expression': expression,
'objectGroup': 'console',
'includeCommandLineAPI': True,
}
}
command2 = {
'method': 'Debugger.evaluateOnCallFrame', # 处理 传进去的 expression
'id': int(), # id需要传一个整型,否则会报错
'params': {
'callFrameId': callFrameId,
'expression': expression2,
'objectGroup': 'console',
'includeCommandLineAPI': True,
}
}
resp1 = execute_cdp(conn, command1)
resp2 = execute_cdp(conn, command2)
print(resp1)
print(resp1["result"]["result"]['value'])
print(resp2["result"]["result"]['value'])


if __name__ == '__main__':
callFrameId = "2662354277330755034.6.0"
expression = 'Object(_$v[\'encrypt\'])(_$Q, _$a[\'data\'], _$z[\'default\'][\'getters\'][\'accessToken\'])'
expression2 = "Object(_$v['decrypt'])(_$Q, '9eec368983e43804e4f4602a4e8b4e73631e56a528af0c9c31c596aee0a7a3b0269bfcff931e1907c9b1afc3fae65a577b00332b6a9fa67f4e67a8592a8d4184', _$z['default'][cbv(0x2d76)][cbv(0x25fb)])"

main()

image.png


Author: 丶尘兮
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 丶尘兮 !
  TOC