Python bindings for Cronet-Cloak - Authentic Chrome TLS/HTTP2 fingerprints with async support
Project description
chrome_client
chrome_client 是一个基于 Chromium Cronet、Rust 和 PyO3 的 Python HTTP 客户端,提供同步、异步、流式请求、Cookie、代理、TLS 指纹模拟和 WebSocket 支持。
公开接口的兼容优先级为:
requestscurl_cffi.requestschrome_client自有扩展
Python 导入名和项目名均为 chrome_client。
目录
- 主要能力
- 安装与平台
- 接口层级与迁移
- 快速开始
- Client 和 Session
- 请求接口
- Response
- 异步接口
- 流式响应
- Cookie
- PreparedRequest
- 上传与下载
- WebSocket
- 代理、超时与证书
- TLS Profile 与 impersonate
- 异常处理
- 兼容性边界
- 原生库排查
主要能力
- Requests 风格模块 API:
get()、post()、request()等。 - Requests 风格命名空间:
from chrome_client import requests。 - 同步
Client/Session和异步AsyncClient/AsyncSession。 - HTTP、HTTPS、SOCKS5、SOCKS5H 代理。
- 自动重定向、跨域认证保护和
response.history。 - 同步与异步流式响应。
- RFC 6265 风格 Cookie Domain、Path、Expires、Max-Age 和 Secure 处理。
- 可配置 Chrome TLS Profile,公开参数名为
impersonate。 - 回调式 WebSocket。
- Rust 原生扩展,使用 PyO3
abi3-py36。
安装与平台
安装:
pip install chrome_client
升级:
pip install --upgrade chrome_client
要求 Python >= 3.6。
| 平台 | 架构 | 状态 |
|---|---|---|
| Windows | x86_64 | 支持 |
| Windows | x86 / 32 位 | 支持 |
| Linux | x86_64,glibc >= 2.24 | 支持 |
| macOS | Apple Silicon / arm64 | 支持 |
当前不提供 Linux ARM64、macOS Intel 和 Alpine Linux / musl Wheel。
接口层级与迁移
推荐导入方式
import chrome_client
# Requests 风格命名空间,仅提供同步模块 API
from chrome_client import requests
# 可复用会话
from chrome_client import Session, AsyncSession
# 底层客户端
from chrome_client import Client, AsyncClient
类关系
Client:底层同步客户端,持有一个原生 Cronet Session。AsyncClient:底层异步客户端。Session:继承Client,作为 Requests 风格同步入口。AsyncSession:继承AsyncClient,作为异步入口。
Client 与 AsyncClient 具有相同的公共方法集合;区别是网络方法是否需要 await。
从 requests 迁移
原代码:
import requests
with requests.Session() as session:
response = session.get("https://example.com/api", params={"page": 1})
迁移后:
from chrome_client import requests
with requests.Session(impersonate="chrome_150") as session:
response = session.get("https://example.com/api", params={"page": 1})
也可以直接替换为:
from chrome_client import Session
with Session() as session:
response = session.get("https://example.com/api", params={"page": 1})
TLS Profile 参数统一使用 impersonate。
快速开始
单次同步请求
import chrome_client
response = chrome_client.get(
"https://example.com/api",
params={"page": 1},
headers={"accept": "application/json"},
)
response.raise_for_status()
print(response.status_code)
print(response.headers)
print(response.json())
Requests 命名空间
from chrome_client import requests
response = requests.post(
"https://example.com/api",
json={"name": "chrome_client"},
impersonate="chrome_150",
)
print(response.status_code)
print(response.json())
可复用 Session
from chrome_client import Session
with Session(
base_url="https://example.com/api/",
headers={"accept": "application/json"},
params={"language": "zh-CN"},
auth=("username", "password"),
timeout=30,
impersonate="chrome_150",
) as session:
response = session.get("users", params={"page": 1})
response.raise_for_status()
print(response.json())
POST JSON、表单与原始内容
import chrome_client
# JSON 支持字典、列表、字符串、数字、布尔值和 None
json_response = chrome_client.post(
"https://example.com/json",
json=[{"id": 1}, {"id": 2}],
)
# data 字典编码为 application/x-www-form-urlencoded
form_response = chrome_client.post(
"https://example.com/form",
data={"username": "alice", "enabled": "1"},
)
# content 用于发送原始请求体,不能与 data/json 同时使用
raw_response = chrome_client.post(
"https://example.com/raw",
content=b"raw body",
headers={"content-type": "application/octet-stream"},
)
Client 和 Session
同步和异步客户端支持相同的构造参数:
client = chrome_client.Client(
verify=True,
proxies=None,
timeout=30,
impersonate="chrome_150",
headers=None,
cookies=None,
auth=None,
proxy=None,
base_url=None,
params=None,
allow_redirects=True,
max_redirects=30,
default_headers=True,
timeout_ms=None,
default_domain=None,
)
| 参数 | 含义 |
|---|---|
verify |
是否验证 TLS 证书,仅支持布尔值。 |
proxies |
代理字符串或 Requests 风格代理字典。 |
proxy |
curl_cffi 风格单代理参数,不能和 proxies 同时使用。 |
timeout |
超时秒数。 |
timeout_ms |
Cronet 毫秒超时,不能和非默认 timeout 同时使用。 |
impersonate |
TLS Profile 名称;传 None 不加载自定义 Profile。 |
headers |
Session 默认请求头。 |
cookies |
Cookie 映射或 CookieJar。 |
auth |
(username, password) HTTP Basic Auth。 |
base_url |
相对 URL 的基础地址。 |
params |
每次请求自动合并的查询参数。 |
allow_redirects |
默认是否跟随重定向。 |
max_redirects |
最大重定向次数,默认 30。 |
default_headers |
为 False 时忽略构造时传入的默认 headers。 |
default_domain |
手动写入 Cookie 时使用的默认域名。 |
建议总是使用上下文管理器,确保原生 Session 被释放:
with chrome_client.Client() as client:
response = client.get("https://example.com")
不使用上下文管理器时必须手动关闭:
client = chrome_client.Client()
try:
response = client.get("https://example.com")
finally:
client.close()
请求接口
模块和客户端均支持:
request(method, url, **kwargs)get(url, params=None, **kwargs)options(url, **kwargs)head(url, **kwargs)post(url, data=None, json=None, **kwargs)put(url, data=None, **kwargs)patch(url, data=None, **kwargs)delete(url, **kwargs)trace(url, **kwargs)query(url, **kwargs)
常用请求参数:
| 参数 | 含义 |
|---|---|
params |
字典或键值序列,使用 doseq=True 编码。 |
headers |
字典或有序 (name, value) 序列;值为 None 可删除同名默认头。 |
cookies |
仅本次请求使用的 Cookie 映射或 CookieJar。 |
data |
表单、字符串或字节请求体。 |
content |
原始请求体,不能和 data/json 同时使用。 |
json |
任意可被 json.dumps() 序列化的值。 |
auth |
本次请求的 Basic Auth。 |
timeout |
本次请求超时秒数。 |
verify |
本次请求证书验证设置。 |
allow_redirects |
是否自动跟随重定向。 |
max_redirects |
本次请求的重定向上限。 |
proxies / proxy |
本次请求代理。 |
impersonate |
本次请求 TLS Profile。 |
hooks |
Requests 风格 {"response": callback} 响应钩子。 |
stream |
返回 StreamResponse。 |
当请求级 timeout、verify、代理或 impersonate 与当前 Client 不同时,Client 会创建兼容的临时原生 Session,并在响应关闭后释放。
有序请求头
headers = [
("user-agent", "Mozilla/5.0"),
("accept", "text/html,application/xhtml+xml"),
("accept-language", "zh-CN,zh;q=0.9"),
]
response = chrome_client.get(
"https://example.com",
headers=headers,
)
Header 名称和值必须是字符串。包含 CR、LF、NUL 或非法名称字符时会在进入原生层前抛出异常。
重定向
response = chrome_client.get(
"https://example.com/redirect",
allow_redirects=True,
max_redirects=10,
)
for previous in response.history:
print(previous.status_code, previous.url)
- 跨域重定向不会携带
Authorization。 - 301、302、303 会按浏览器语义切换请求方法。
- 307、308 保留原方法和请求体。
- Session 默认查询参数不会在每次重定向中重复追加。
Response
普通请求返回 Response,stream=True 返回 StreamResponse。
常用属性:
response.status_code
response.headers # 大小写不敏感
response.cookies # CookieJar
response.content # bytes
response.text # str
response.url
response.encoding
response.ok
response.is_redirect
response.history
response.request # PreparedRequest
response.raw
常用方法:
response.json()
response.raise_for_status()
response.iter_content(chunk_size=8192)
response.iter_lines(chunk_size=512, decode_unicode=False)
response.close()
Response.iter_content()、Response.iter_lines() 和 StreamResponse.iter_lines() 默认产生字节;后两类行迭代以及非流式 iter_content() 可通过 decode_unicode=True 产生字符串。流式 StreamResponse.iter_content() 始终产生字节。
异步接口
AsyncClient
以下写法兼容 Python 3.6:
import asyncio
import chrome_client
async def main():
async with chrome_client.AsyncClient(
impersonate="chrome_150",
timeout=30,
) as client:
responses = await asyncio.gather(
client.get("https://example.com/1"),
client.get("https://example.com/2"),
)
for response in responses:
print(response.status_code)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Python 3.7 及以上可使用:
asyncio.run(main())
模块级异步函数
async def module_api_example():
response = await chrome_client.async_get("https://example.com")
response = await chrome_client.async_post(
"https://example.com/api",
json={"name": "chrome_client"},
)
可用函数:
async_request()async_get()async_options()async_head()async_post()async_put()async_patch()async_delete()async_upload_file()async_download_file()
流式响应
同步流
import chrome_client
response = chrome_client.get("https://example.com/file", stream=True)
try:
with open("download.bin", "wb") as output:
for chunk in response.iter_content(64 * 1024):
output.write(chunk)
finally:
response.close()
也可以让响应上下文自动关闭:
with chrome_client.get("https://example.com/file", stream=True) as response:
for chunk in response.iter_content(8192):
process(chunk)
异步流
import asyncio
import chrome_client
async def download():
async with chrome_client.AsyncClient() as client:
response = await client.get("https://example.com/file", stream=True)
try:
with open("download.bin", "wb") as output:
async for chunk in response.aiter_content(64 * 1024):
output.write(chunk)
finally:
await response.aclose()
loop = asyncio.get_event_loop()
loop.run_until_complete(download())
异步流还支持:
async def read_stream(response):
body = await response.acontent()
text = await response.atext()
async for line in response.aiter_lines(chunk_size=512):
print(line)
Cookie
Session 会自动解析响应中的 Set-Cookie,并在后续请求中发送匹配的 Cookie。
自动行为
- 按
(domain, path, name)保存,同名不同 Path 可以共存。 - Host-only Cookie 只发送到原主机。
- 带
Domain的 Cookie 可发送到匹配子域。 - 请求路径必须符合 RFC 6265 Path 匹配规则。
- 同名 Cookie 发送时,较长 Path 排在前面。
- 未提供
Path时,根据设置 Cookie 的请求 URL 计算默认 Path。 - 支持
Expires与Max-Age,Max-Age优先。 Max-Age=0或已过期的Expires会删除对应(domain, path, name)Cookie。- 过期 Cookie 会在查询和发送前自动清理。
SecureCookie 只通过 HTTPS/WSS 发送。- 支持 Host-only IPv4、IPv6 和普通域名。
Session Cookie
from chrome_client import Session
with Session(default_domain="example.com") as session:
session.cookies.set("language", "zh-CN")
session.cookies["theme"] = "dark"
response = session.get("https://example.com/account")
print(session.cookies["language"])
print(session.cookies.get_dict(domain="example.com", path="/account"))
Path 和持久时间
session.cookies.set(
"token",
"value",
domain="example.com",
path="/account",
max_age=3600,
secure=True,
)
# expires 使用 Unix 时间戳
session.cookies.set(
"persistent",
"value",
domain="example.com",
path="/",
expires=4102444800,
)
查询和删除
value = session.cookies.get(
"token",
domain="example.com",
path="/account/settings",
)
cookies = session.cookies.cookies_for_request(
"https://example.com/account/settings"
)
session.cookies.delete(
name="token",
domain="example.com",
path="/account",
)
session.cookies.clear_expired_cookies()
session.cookies.clear_session_cookies()
session.cookies.clear(domain="example.com", path="/account")
单次请求 Cookie
单次请求的 Cookie 不会写回 Session,并会覆盖同名 Session Cookie:
response = session.get(
"https://example.com/account",
cookies={"token": "request-only"},
)
PreparedRequest
同步和异步客户端均支持 Request、prepare_request() 和 send()。
同步
from chrome_client import Request, Session
with Session(base_url="https://example.com/") as session:
request = Request(
method="POST",
url="api/items",
params={"page": 1},
headers={"accept": "application/json"},
json={"name": "item"},
)
prepared = session.prepare_request(request)
response = session.send(prepared)
异步
from chrome_client import AsyncSession, Request
async def send_prepared():
async with AsyncSession(base_url="https://example.com/") as session:
prepared = session.prepare_request(Request(
"POST",
"api/items",
json=[1, 2, 3],
))
response = await session.send(prepared)
上传与下载
上传文件
result = chrome_client.upload_file(
"https://example.com/upload",
"./image.png",
field_name="file",
additional_fields={"category": "avatar"},
)
客户端方法:
with chrome_client.Client() as client:
response = client.upload_file(
"https://example.com/upload",
"./image.png",
field_name="file",
additional_fields={"category": "avatar"},
)
下载文件
result = chrome_client.download_file(
"https://example.com/file",
"./download.bin",
chunk_size=64 * 1024,
)
print(result["file_path"])
print(result["size"])
print(result["status_code"])
print(result["headers"])
异步版本:
async def async_download():
result = await chrome_client.async_download_file(
"https://example.com/file",
"./download.bin",
chunk_size=64 * 1024,
)
files= 当前不作为通用请求参数实现;请使用 upload_file()。
WebSocket
from chrome_client import Client
def on_open(ws):
print("connected")
ws.send("hello")
def on_message(ws, message):
print("message:", message)
def on_close(ws, code, reason):
print("closed:", code, reason)
def on_error(ws, error):
print("error:", error)
with Client() as client:
ws = client.websocket(
"wss://example.com/ws",
on_open=on_open,
on_message=on_message,
on_close=on_close,
on_error=on_error,
sub_protocols=["chat", "json"],
origin="https://example.com",
headers={"X-Client": "chrome_client"},
)
ws.run_forever()
后台线程:
import threading
opened = threading.Event()
with Client() as client:
ws = client.websocket(
"wss://example.com/ws",
on_open=lambda ws: opened.set(),
)
thread = ws.run_in_background()
try:
if not opened.wait(10):
raise TimeoutError("WebSocket connection timed out")
ws.send("text")
ws.send_bytes(b"binary")
finally:
ws.close(code=1000, reason="done")
thread.join()
AsyncClient.websocket() 返回同一个回调式 WebSocketApp;事件循环运行在其独立线程中,不需要 await ws.run_forever()。
Windows Cronet 原生 ABI 支持 origin 和 sub_protocols,但当前不支持任意额外 WebSocket Header;Linux/macOS 支持 headers。
代理、超时与证书
代理
client = chrome_client.Client(
proxies="http://127.0.0.1:8080"
)
client = chrome_client.Client(
proxies={
"http": "http://127.0.0.1:8080",
"https": "http://user:password@127.0.0.1:8080",
}
)
client = chrome_client.Client(
proxy="socks5h://user:password@127.0.0.1:1080"
)
支持协议:
http://https://socks5://socks5h://
Cronet Session 最终使用一个代理地址;代理字典按 https、http、all、all:// 顺序选择。
超时
秒:
client = chrome_client.Client(timeout=15)
response = chrome_client.get("https://example.com", timeout=15)
毫秒:
client = chrome_client.Client(timeout_ms=15000)
原生 Cronet Session 当前不能表达无限超时,因此 timeout=None 使用安全默认值 30 秒。
证书验证
client = chrome_client.Client(verify=True)
测试环境或自签名服务:
client = chrome_client.Client(verify=False)
当前 verify 仅支持布尔值,不支持 CA Bundle 路径;cert= 客户端证书尚未实现。
TLS Profile 与 impersonate
默认 Profile 为 chrome_150:
with chrome_client.Client(impersonate="chrome_150") as client:
response = client.get("https://example.com")
不加载 Profile:
client = chrome_client.Client(impersonate=None)
查看可用 Profile:
profiles = chrome_client.get_tls_profiles()
print(sorted(profiles))
新增或修改 Profile:
profile = chrome_client.get_tls_profiles()["chrome_150"].copy()
profile["tls_curves"] = [
"X25519MLKEM768",
"X25519",
"P-256",
"P-384",
]
chrome_client.add_tls_profile("chrome_custom", profile)
with chrome_client.Client(impersonate="chrome_custom") as client:
response = client.get("https://example.com")
替换全部 Profile:
chrome_client.set_tls_profiles({
"chrome_custom": {
"cipher_suites": [],
"tls_curves": ["X25519", "P-256"],
"tls_extensions": [],
"signature_algorithms": [],
}
})
相关接口:
get_tls_profiles()add_tls_profile(name, profile)set_tls_profiles(profiles)clear_tls_profiles_cache()
这些接口修改当前 Python 进程中的配置。需要持久化时,请修改 python/chrome_client/tls_profiles.json 后重新构建 Wheel。
异常处理
from chrome_client import (
ConnectionError,
HTTPStatusError,
ProxyError,
RequestError,
SSLError,
Timeout,
)
try:
response = chrome_client.get("https://example.com", timeout=10)
response.raise_for_status()
except Timeout as error:
print("timeout:", error)
except HTTPStatusError as error:
print("http status:", error.response.status_code)
except ProxyError as error:
print("proxy:", error)
except SSLError as error:
print("tls:", error)
except ConnectionError as error:
print("connection:", error)
except RequestError as error:
print("request:", error)
Requests 别名:
RequestException = RequestErrorHTTPError = HTTPStatusError
兼容性边界
chrome_client 优先兼容 Requests 的高频请求接口,但并不是 Requests 所有内部模块的逐项复制。
当前明确限制:
files=:请改用upload_file()。cert=:客户端证书尚未实现。verify="/path/to/ca.pem":当前只支持布尔值。timeout=None:原生层使用 30 秒安全默认值,不表示无限等待。- Requests 的 Adapter、Transport Adapter、AuthBase、完整 CookiePolicy 等内部扩展点未实现。
- Windows WebSocket 不支持任意额外 Header。
迁移时建议优先使用:
- 模块级
request/get/post/... Session、Request、PreparedRequest、Responseparams/headers/cookies/data/json/auth/proxies/timeout/verify/allow_redirects/stream
原生库排查
官方 Wheel 会携带对应平台的 Cronet 动态库。
Windows
若出现:
ImportError: DLL load failed: 找不到指定的程序。
请确认:
- Python 架构与 Wheel 一致,例如 x64 Python 使用 x64 Wheel。
chrome_client包目录中存在cronet.<version>.dll。- Wheel 中的
cronet_cloak.pyd和 Cronet DLL 来自同一次构建。 - 未被其他目录中的旧版 Cronet DLL 抢先加载。
当前项目附带的 Windows x86/x64 Cronet 库均导出:
Cronet_WebSocket_CreateCronet_WebSocket_ConnectCronet_WebSocket_SendCronet_WebSocket_CloseCronet_WebSocket_Destroy
Linux
源码安装后如果出现:
libcronet.144.0.7506.0.so: cannot open shared object file
可临时添加包目录:
export LD_LIBRARY_PATH="$(python -c 'import os, chrome_client; print(os.path.dirname(chrome_client.__file__))'):$LD_LIBRARY_PATH"
当前 Wheel 不是 musllinux Wheel,Alpine Linux 请改用 glibc 系发行版。
API 参考
致谢
感谢 2833844911/cyCronet 项目及其作者提供跨平台 Cronet 基座。本项目在其基础上进行 Python API、类型声明、Cookie、流式请求、WebSocket 和 Wheel 打包方面的二次开发。
License
以下版权声明和许可条款必须完整保留:
MIT License
Copyright (c) 2026 Cronet-Cloak
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
完整许可内容见 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 Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chrome_client-0.1.3-cp36-abi3-win_amd64.whl.
File metadata
- Download URL: chrome_client-0.1.3-cp36-abi3-win_amd64.whl
- Upload date:
- Size: 9.0 MB
- Tags: CPython 3.6+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55d2b6571191a40f763e2e86f3648c73fd3f4c2d46ac5fdbaf05f83078a0e29a
|
|
| MD5 |
b89ad01bee9478e4f4534337e8cea5be
|
|
| BLAKE2b-256 |
ae5197978028b67690a6c1208f8ca359036a991998dc04c902df0fcf14bd7f0f
|
Provenance
The following attestation bundles were made for chrome_client-0.1.3-cp36-abi3-win_amd64.whl:
Publisher:
build-wheels.yml on komAAmok/chrome_client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chrome_client-0.1.3-cp36-abi3-win_amd64.whl -
Subject digest:
55d2b6571191a40f763e2e86f3648c73fd3f4c2d46ac5fdbaf05f83078a0e29a - Sigstore transparency entry: 2294406643
- Sigstore integration time:
-
Permalink:
komAAmok/chrome_client@f3a141776ade24c9719a62c431e509b412f71b44 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/komAAmok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-wheels.yml@f3a141776ade24c9719a62c431e509b412f71b44 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chrome_client-0.1.3-cp36-abi3-win32.whl.
File metadata
- Download URL: chrome_client-0.1.3-cp36-abi3-win32.whl
- Upload date:
- Size: 8.4 MB
- Tags: CPython 3.6+, Windows x86
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9977b8369fa031d75c473250371d7f1139d18236f1d96b34d9574d8e30335c6
|
|
| MD5 |
557e1a5d0475008537c13c769df46673
|
|
| BLAKE2b-256 |
8b9cc5e26e6e8af1fd2319a99e96ca84fdf48bc4a9fd07771dae3e4e7706d738
|
Provenance
The following attestation bundles were made for chrome_client-0.1.3-cp36-abi3-win32.whl:
Publisher:
build-wheels.yml on komAAmok/chrome_client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chrome_client-0.1.3-cp36-abi3-win32.whl -
Subject digest:
e9977b8369fa031d75c473250371d7f1139d18236f1d96b34d9574d8e30335c6 - Sigstore transparency entry: 2294407035
- Sigstore integration time:
-
Permalink:
komAAmok/chrome_client@f3a141776ade24c9719a62c431e509b412f71b44 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/komAAmok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-wheels.yml@f3a141776ade24c9719a62c431e509b412f71b44 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chrome_client-0.1.3-cp36-abi3-manylinux_2_24_x86_64.whl.
File metadata
- Download URL: chrome_client-0.1.3-cp36-abi3-manylinux_2_24_x86_64.whl
- Upload date:
- Size: 22.9 MB
- Tags: CPython 3.6+, manylinux: glibc 2.24+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3fa2f2b8f53043683a842c5b2352551d1d38b8dfc6014870a751ec9b1c139871
|
|
| MD5 |
cbcba751fde4f5400d4331c28ee9fbfa
|
|
| BLAKE2b-256 |
50c25dbe32dd8bfa8d6cd5c2ae526a6dd3f16dd33db30a77c4e07f4ce55b9c99
|
Provenance
The following attestation bundles were made for chrome_client-0.1.3-cp36-abi3-manylinux_2_24_x86_64.whl:
Publisher:
build-wheels.yml on komAAmok/chrome_client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chrome_client-0.1.3-cp36-abi3-manylinux_2_24_x86_64.whl -
Subject digest:
3fa2f2b8f53043683a842c5b2352551d1d38b8dfc6014870a751ec9b1c139871 - Sigstore transparency entry: 2294406814
- Sigstore integration time:
-
Permalink:
komAAmok/chrome_client@f3a141776ade24c9719a62c431e509b412f71b44 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/komAAmok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-wheels.yml@f3a141776ade24c9719a62c431e509b412f71b44 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file chrome_client-0.1.3-cp36-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: chrome_client-0.1.3-cp36-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.8 MB
- Tags: CPython 3.6+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4a7c2374ad0868b93f9b196cb2835322e5e3bdfc9a4ce774b0d2445d109ab4bc
|
|
| MD5 |
30ad81f2f0c0fd559228bc222ce6c549
|
|
| BLAKE2b-256 |
f6e826e8970d89b1ed0886ecbe318db15ab30760661c2512b1f0c7c69015302d
|
Provenance
The following attestation bundles were made for chrome_client-0.1.3-cp36-abi3-macosx_11_0_arm64.whl:
Publisher:
build-wheels.yml on komAAmok/chrome_client
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chrome_client-0.1.3-cp36-abi3-macosx_11_0_arm64.whl -
Subject digest:
4a7c2374ad0868b93f9b196cb2835322e5e3bdfc9a4ce774b0d2445d109ab4bc - Sigstore transparency entry: 2294407218
- Sigstore integration time:
-
Permalink:
komAAmok/chrome_client@f3a141776ade24c9719a62c431e509b412f71b44 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/komAAmok
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-wheels.yml@f3a141776ade24c9719a62c431e509b412f71b44 -
Trigger Event:
workflow_dispatch
-
Statement type: