Skip to main content

Chrome DevTools Protocol 客户端,支持独立使用或与 DrissionPage 配合

Project description

PyCDP - Chrome DevTools Protocol 客户端

Python License

CDP 客户端,自动配置 ChromiumOptions,可直接传给 DrissionPage 的 Chromium。

特性

  • 自动配置 --remote-allow-origins=* 参数
  • 支持绕过反爬的请求(在浏览器上下文中执行)
  • 完整的 IDE 类型提示支持

安装

pip install pycdp-client

快速开始

from pycdp import CDP
from DrissionPage import Chromium

cdp = CDP(port=9222)
page = Chromium(cdp.options).latest_tab

page.get("https://example.com")

# CDP 请求(绕过反爬)
result = cdp.post('https://api.example.com/data', body={"key": "value"})
print(result)

API 文档

CDP 类

from pycdp import CDP

cdp = CDP(port=9222)  # 默认端口 9222

属性

属性 说明
options 返回 ChromiumOptions 实例,用于传给 Chromium
port 当前端口号

方法

方法 说明
get(url, headers=None, token_key=None, extra=None) GET 请求
post(url, body=None, headers=None, token_key=None, extra=None) POST 请求
put(url, body=None, headers=None, token_key=None, extra=None) PUT 请求
delete(url, headers=None, token_key=None, extra=None) DELETE 请求
request(url, method, body, headers, token_key, extra) 通用请求
run(js, wait=False) 执行 JavaScript
storage(key, value=None, storage='localStorage') 操作 Storage
cookies(name=None) 获取 Cookies
inject(js) 页面加载前注入脚本
call(func, *args) 调用页面函数
hook(target, callback=None) Hook JS 函数
unhook(target) 移除 Hook
getvar(path) 获取页面 JS 变量值
setvar(path, value) 设置页面 JS 变量值
override(target, impl) 覆盖 JS 函数实现
restore(target) 恢复被覆盖的函数
reconnect(tab_index=0) 重新连接(切换 tab)
close() 关闭连接

请求示例

# GET 请求
result = cdp.get('https://api.example.com/data')

# POST 请求
result = cdp.post('https://api.example.com/data', body={"name": "test"})

# 带 token 的请求(自动从 localStorage 获取)
result = cdp.get('https://api.example.com/user', token_key='ACCESS_TOKEN')

# 带额外请求头
result = cdp.post('https://api.example.com/data', 
    body={"key": "value"},
    extra={"X-Custom-Header": "custom-value"}
)

执行 JavaScript

# 同步执行
title = cdp.run('document.title')

# 异步执行(等待 Promise)
result = cdp.run('fetch("/api/data").then(r=>r.json())', wait=True)

操作 Storage

# 获取 localStorage
token = cdp.storage('token')

# 设置 localStorage
cdp.storage('token', 'new_value')

# 操作 sessionStorage
cdp.storage('key', 'value', storage='sessionStorage')

获取 Cookies

# 获取所有 cookies
all_cookies = cdp.cookies()

# 获取指定 cookie
session = cdp.cookies('session_id')

注入脚本(JS 逆向)

# 页面加载前注入脚本(每个新文档都会执行)
cdp.inject('Object.defineProperty(navigator,"webdriver",{get:()=>false})')

# 注入自定义函数
cdp.inject('window.myFunc = (x) => x * 2')

调用页面函数

# 调用页面函数
result = cdp.call('JSON.stringify', {'key': 'value'})

# 调用链式函数
cdp.call('window.app.login', 'user', 'pass')

Hook JS 函数

# Hook fetch,记录所有请求到控制台
cdp.hook('window.fetch')

# 自定义回调处理
cdp.run('window.onHook = (name, args) => console.log(name, args)')
cdp.hook('JSON.parse', 'window.onHook')

# 移除 Hook
cdp.unhook('window.fetch')

获取/设置页面变量

# 获取页面变量
config = cdp.getvar('window.app.config')
token = cdp.getvar('app.userInfo.token')

# 设置页面变量
cdp.setvar('window.DEBUG', True)
cdp.setvar('app.config.apiUrl', 'https://api.example.com')

覆盖 JS 函数

# 固定 Date.now() 返回值
cdp.override('Date.now', '()=>1234567890000')

# 固定 Math.random() 返回值
cdp.override('Math.random', '()=>0.5')

# 恢复原函数
cdp.restore('Date.now')

完整示例

from pycdp import CDP
from DrissionPage import Chromium

# 创建 CDP
cdp = CDP(port=9222)

# 通过 cdp.options 传给 Chromium
page = Chromium(cdp.options).latest_tab

# 访问页面
page.get("https://example.com/login")

# DrissionPage 操作
page.ele('#username').input('user@example.com')
page.ele('#password').input('password123')
page.ele('#login-btn').click()

# CDP 请求获取数据
result = cdp.get('https://api.example.com/user/profile', token_key='ACCESS_TOKEN')
print(f"用户信息: {result['data']}")

# 获取 token
token = cdp.storage('ACCESS_TOKEN')
print(f"Token: {token}")

上下文管理器

from pycdp import CDP

with CDP(9222) as cdp:
    result = cdp.get('https://api.example.com/data')
    print(result)

注意事项

  1. 使用 cdp.options 传给 Chromium,自动配置端口和 --remote-allow-origins=*
  2. CDP 请求在浏览器上下文中执行,共享 cookies 和 localStorage
  3. CDP 实例会在 __del__ 时自动关闭,也可手动调用 close()

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pycdp_client-1.1.1.tar.gz (9.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pycdp_client-1.1.1-py3-none-any.whl (11.9 kB view details)

Uploaded Python 3

File details

Details for the file pycdp_client-1.1.1.tar.gz.

File metadata

  • Download URL: pycdp_client-1.1.1.tar.gz
  • Upload date:
  • Size: 9.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for pycdp_client-1.1.1.tar.gz
Algorithm Hash digest
SHA256 534d834f7aa133ac57c878a6234b2625ba786693518379b1a440d58d757d3349
MD5 b3612962dfef56851651ccf8ace868a4
BLAKE2b-256 0c118c1cdc3a00135854a540bfd28a6b3c91aa3bc3d326561253013013c61631

See more details on using hashes here.

File details

Details for the file pycdp_client-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: pycdp_client-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 11.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for pycdp_client-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 61f9bde080c3a4716b73d086cc2a6933eca5856ea4306debaef18e22e9a39b56
MD5 fb994d4dfc37b9e181a852b0ce127e2a
BLAKE2b-256 9eef2fb72d972527d1cb29af125f9974502ef00c64f6428c015de33c39fe06e5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page