基于 Sync your cookie + Cloudflare KV + MCP + Claude 實現 B站視頻信息自動獲取
?? 前言
在現代 Web 開發中,我們經常需要從各種平臺獲取數據。本文將分享我如何構建一個 B站視頻信息獲取工具,這個項目不僅僅是一個簡單的爬蟲,而是一個集成了多項前沿技術的完整解決方案:
- Sync your cookie: 谷歌插件
- Cloudflare KV: 全球分布式鍵值存儲
- MCP (Model Context Protocol): AI 模型上下文協議
- Claude AI: 強大的 AI 編程助手
本項目的獨特之處在于通過 Chrome 擴展自動同步加密的 Cookie 到云端,然后通過 Python 程序自動解密并獲取所需的視頻信息。
?? 項目概述
核心功能
- ?? 從 Cloudflare KV 自動獲取并解密 Cookie 數據
- ?? 批量獲取 B站視頻詳細信息(標題、播放量、點贊數等)
- ?? 支持多種輸出格式(控制臺、JSON、CSV)
- ?? 基于 MCP 協議獲取最新的 bilibili-api 文檔
- ?? 異步處理,高效穩定
技術架構圖
graph TB
A[Chrome擴展] --> B[加密Cookie數據]
B --> C[Cloudflare KV存儲]
C --> D[Python獲取工具]
D --> E[多層解密]
E --> F[提取B站憑證]
F --> G[bilibili-api調用]
G --> H[視頻信息輸出]
I[MCP協議] --> J[Claude AI]
J --> K[最新API文檔]
K --> G
style C fill:#f9f,stroke:#333,stroke-width:2px
style J fill:#9f9,stroke:#333,stroke-width:2px
style E fill:#ff9,stroke:#333,stroke-width:2px
Sync your cookie :
作用
Sync your cookie 是一個 Chrome 擴展程序,它可以幫助您將 Cookie 同步到 Cloudflare。它是一個有用的工具,用于在不同設備之間共享 Cookie, 免去了登錄流程的煩惱,此外也提供了cookie管理面板查看,管理已經過同步的 cookie。
?? Cloudflare KV:全球分布式存儲利器
什么是 Cloudflare KV?
Cloudflare Workers KV 是一個全球分布式鍵值存儲服務,具有以下特點:
- 全球分發: 數據自動復制到全球 200+ 個數據中心
- 超低延遲: 邊緣計算節點就近響應
- 高可用性: 99.9% 的服務可用性保證
- 簡單易用: RESTful API,支持各種編程語言
在本項目中的應用
class CloudflareKVClient:
"""Cloudflare KV 存儲客戶端"""
def __init__(self, account_id, namespace_id, api_token):
self.account_id = account_id
self.namespace_id = namespace_id
self.api_token = api_token
self.base_url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/storage/kv/namespaces/{namespace_id}"
self.headers = {
"Authorization": f"Bearer {api_token}",
"Content-Type": "application/json"
}
def get_value(self, key):
"""從KV存儲獲取值"""
try:
url = f"{self.base_url}/values/{key}"
response = requests.get(url, headers=self.headers, timeout=10)
response.raise_for_status()
# 檢查響應內容類型
content_type = response.headers.get('content-type', '')
if 'application/json' in content_type:
return response.json()
else:
# 返回加密的Cookie數據
return response.text.strip()
except Exception as e:
print(f"? 獲取Cloudflare KV數據失敗: {e}")
return None
配置示例
{
"cloudflare_kv": {
"account_id": "your-account-id",
"namespace_id": "your-namespace-id",
"api_token": "your-api-token",
"key_name": "sync-your-cookie"
}
}
?? MCP:AI 時代的新協議
MCP (Model Context Protocol) 簡介
MCP 是 Anthropic 推出的一種新協議,用于 AI 模型與外部工具和數據源的標準化交互。它解決了以下問題:
- 上下文管理: 為 AI 模型提供結構化的上下文信息
- 工具集成: 標準化的工具調用接口
- 數據訪問: 安全可控的外部數據獲取
在 Claude 中使用 MCP
在我的項目中,我使用 MCP 的 Context7 服務獲取最新的 bilibili-api 文檔:
# 通過 MCP 獲取 bilibili-api 最新文檔
# 這確保了我們使用的是最新的API接口和最佳實踐
from bilibili_api import video, Credential, sync
# 根據 MCP 文檔,創建 Video 對象的正確方式
v = video.Video(bvid=bvid, credential=self.credential)
# 根據 MCP 文檔,獲取視頻信息的正確方法
info = await v.get_info()
MCP 的優勢
- 實時更新: 獲取最新的 API 文檔和最佳實踐
- 準確性: 避免過時信息導致的錯誤
- 效率: 直接獲取相關文檔片段,提高開發效率
?? 多層加密解密:安全與效率的平衡
加密流程解析
先將Sync your cookie項目clone到本地,然后通過claude解析代碼,從中得到Sync your cookie的加密cookie方法,然后得到對應的解密方法,本地測試
Chrome 擴展將 Cookie 數據進行多層加密后存儲到 Cloudflare KV:
原始Cookie數據 → Protocol Buffers → zlib壓縮 → gzip壓縮 → Base64編碼 → 存儲
解密實現
def decrypt_cookie_data(self, encrypted_data):
"""解密Cookie數據"""
if not encrypted_data or not encrypted_data.strip():
print("? 加密數據為空")
return None
try:
print("?? 開始解密Cookie數據...")
# 步驟1: Base64 解碼
buffer = base64.b64decode(encrypted_data.strip())
print(f"? Base64 解碼成功,數據大小: {len(buffer)} 字節")
# 步驟2: gzip 解壓縮
buffer = gzip.decompress(buffer)
print(f"? gzip 解壓縮成功,數據大小: {len(buffer)} 字節")
# 步驟3: zlib 解壓縮
buffer = zlib.decompress(buffer)
print(f"? zlib 解壓縮成功,數據大小: {len(buffer)} 字節")
# 步驟4: protobuf 解析
cookies_map = cookie_pb2.CookiesMap()
cookies_map.ParseFromString(buffer)
print("? protobuf 解析成功")
return cookies_map
except Exception as e:
print(f"? 解密失敗: {str(e)}")
return None
Protocol Buffers 結構
// cookie.proto
syntax = "proto3";
message Cookie {
string name = 1;
string value = 2;
string domain = 3;
string path = 4;
int64 expires = 5;
bool httpOnly = 6;
bool secure = 7;
string sameSite = 8;
}
message DomainCookie {
repeated Cookie cookies = 1;
}
message CookiesMap {
map<string, DomainCookie> domainCookieMap = 1;
}
憑證提取
def extract_bilibili_credentials(self, cookies_map):
"""從解密的Cookie數據中提取B站登錄憑證"""
if not cookies_map:
return None
credentials = {}
# 查找B站相關域名的Cookie
bilibili_domains = ['.bilibili.com', 'bilibili.com', '.www.bilibili.com']
for domain, domain_cookie in cookies_map.domainCookieMap.items():
if any(bili_domain in domain for bili_domain in bilibili_domains):
print(f"?? 檢查域名: {domain}")
for cookie in domain_cookie.cookies:
if cookie.name == 'SESSDATA':
credentials['SESSDATA'] = cookie.value
print(f"? 找到 SESSDATA")
elif cookie.name == 'bili_jct':
credentials['BILI_JCT'] = cookie.value
print(f"? 找到 BILI_JCT")
elif cookie.name == 'buvid3':
credentials['BUVID3'] = cookie.value
print(f"? 找到 BUVID3")
return credentials if credentials else None
?? B站 API 集成:數據獲取的藝術
bilibili-api 的選擇
經過對比測試,最終選擇了 bilibili-api 庫的 9.1.0 版本:
- ? 穩定可靠的接口封裝
- ? 完善的異步支持
- ? 豐富的功能覆蓋
- ? 活躍的社區維護
核心獲取邏輯
async def get_video_info_async(self, video_input):
"""異步獲取視頻信息"""
# 獲取憑證
if not self.credential:
if not self.get_credentials_from_kv():
print("?? 未獲取到登錄憑證,將嘗試無登錄訪問")
# 提取BV號
bvid = self.extract_bvid(video_input)
if not bvid:
print(f"? 無法從輸入中提取有效的BV號: {video_input}")
return None
try:
print(f"?? 正在獲取視頻信息: {bvid}")
# 創建 Video 對象
v = video.Video(bvid=bvid, credential=self.credential)
# 獲取視頻信息
info = await v.get_info()
# 從 info 中提取統計信息
stat = info.get('stat', {})
# 構造返回數據
result = {
'title': info.get('title', ''),
'bvid': bvid,
'aid': info.get('aid', 0),
'url': f"https://www.bilibili.com/video/{bvid}",
'view_count': stat.get('view', 0),
'like_count': stat.get('like', 0),
'coin_count': stat.get('coin', 0),
'favorite_count': stat.get('favorite', 0),
'uploader': info.get('owner', {}).get('name', ''),
'upload_time': datetime.fromtimestamp(info.get('pubdate', 0)).strftime('%Y-%m-%d %H:%M:%S'),
# ... 更多字段
}
return result
except Exception as e:
print(f"? 獲取視頻信息失敗: {e}")
return None
BV號提取邏輯
def extract_bvid(self, input_str):
"""從輸入中提取BV號"""
# 如果直接是BV號
if input_str.startswith('BV') and len(input_str) == 12:
return input_str
# 如果是完整鏈接,提取BV號
bv_pattern = r'BV[1-9a-km-z]{10}'
match = re.search(bv_pattern, input_str, re.IGNORECASE)
if match:
return match.group(0)
return None
?? 數據輸出:多樣化的展示方式
控制臺輸出
def format_console_output(self, data):
"""格式化控制臺輸出"""
print("\n" + "="*70)
print("?? B站視頻信息 (基于 MCP bilibili-api)")
print("="*70)
print(f"標題: {data['title']}")
print(f"BV號: {data['bvid']}")
print(f"鏈接: {data['url']}")
print(f"播放數: {data['view_count']:,}")
print(f"點贊數: {data['like_count']:,}")
print(f"UP主: {data['uploader']}")
print("="*70)
CSV 輸出(中文表頭)
def save_csv(self, data, output_path):
"""保存為CSV格式"""
# 中文表頭
chinese_headers = [
'標題', 'BV號', 'AV號', '鏈接', '分區', '分區ID', '分P數', '版權類型',
'播放數', '點贊數', '投幣數', '收藏數', '分享數', '評論數', '彈幕數',
'UP主', 'UP主UID', '上傳時間', '時長(秒)', '簡介', '封面圖'
]
with open(output_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(chinese_headers)
# 寫入數據...
??? 開發環境與依賴管理
Python 環境選擇
選擇 conda py310 環境的原因:
- 兼容性: Python 3.10 對 asyncio 有更好的支持
- 穩定性: 避免系統 Python 環境污染
- 依賴管理: conda 更好的包版本管理
# 環境創建和激活
conda create -n py310 python=3.10
conda activate py310
# 依賴安裝
pip install -r requirements.txt
關鍵依賴版本
requests==2.32.4
bilibili-api==9.1.0
aiohttp==3.7.4.post0
beautifulsoup4==4.9.3
protobuf>=3.19.0
?? 完整的工作流程
1. Chrome 擴展同步 Cookie
// Chrome擴展將Cookie加密后上傳到Cloudflare KV
const encryptedData = encryptCookies(cookies);
await uploadToCloudflareKV(encryptedData);
2. Python 程序獲取并解密
# 從 KV 獲取加密數據
encrypted_data = kv_client.get_value('sync-your-cookie')
# 多層解密
cookies_map = kv_client.decrypt_cookie_data(encrypted_data)
# 提取 B站憑證
credentials = kv_client.extract_bilibili_credentials(cookies_map)
3. 視頻信息獲取
# 創建認證對象
credential = Credential(
sessdata=credentials['SESSDATA'],
bili_jct=credentials['BILI_JCT'],
buvid3=credentials['BUVID3']
)
# 獲取視頻信息
video_info = await get_video_info_async(bv_id)
4. 數據輸出
# 多種輸出格式
save_json(video_info, 'output.json')
save_csv(video_info, 'output.csv')
format_console_output(video_info)
?? 性能優化與最佳實踐
異步處理
# 使用 asyncio 提高并發性能
async def batch_get_videos(self, video_list):
tasks = []
for video_id in video_list:
tasks.append(self.get_video_info_async(video_id))
results = await asyncio.gather(*tasks, return_exceptions=True)
return results
錯誤處理
# 完善的錯誤處理機制
try:
video_info = await self.get_video_info_async(bv_id)
except aiohttp.ClientError as e:
print(f"? 網絡請求失敗: {e}")
except json.JSONDecodeError as e:
print(f"? JSON 解析失敗: {e}")
except Exception as e:
print(f"? 未知錯誤: {e}")
緩存策略
# 簡單的內存緩存
from functools import lru_cache
@lru_cache(maxsize=100)
def get_video_cached(self, bv_id):
return self.get_video_info(bv_id)
?? 使用示例
基本用法
# 測試工具
python video_info_fetcher_mcp.py --test
# 獲取單個視頻信息
python video_info_fetcher_mcp.py BV1uv411q7Mv
# 輸出到 CSV
python video_info_fetcher_mcp.py BV1uv411q7Mv --format csv
實際運行效果
? bilibili-api 庫加載成功
? protobuf 模塊加載成功
?? 正在從KV獲取密鑰: sync-your-cookie
?? 開始解密Cookie數據...
? Base64 解碼成功,數據大小: 1395 字節
? gzip 解壓縮成功,數據大小: 1372 字節
? zlib 解壓縮成功,數據大小: 3325 字節
? protobuf 解析成功
? 找到 SESSDATA
? 找到 BILI_JCT
? 找到 BUVID3
? 成功提取到 3 個B站登錄憑證
? 成功創建 Credential 對象
?? 正在獲取視頻信息: BV1uv411q7Mv
? 成功獲取視頻信息
======================================================================
?? B站視頻信息 (基于 MCP bilibili-api)
======================================================================
標題: 爆肝98小時!在MC中還原糖調小鎮
BV號: BV1uv411q7Mv
播放數: 19,676
點贊數: 2,250
UP主: -星の憶-
======================================================================
?? 未來展望
功能擴展
- 批量處理: 支持從文件批量讀取視頻列表
- 數據分析: 添加視頻數據分析和可視化功能
- 實時監控: 定時獲取關注UP主的最新視頻
- 多平臺支持: 擴展到其他視頻平臺
技術優化
- 分布式處理: 使用 Celery 實現分布式任務隊列
- 數據庫存儲: 集成 PostgreSQL 或 MongoDB
- API 服務: 提供 RESTful API 接口
- Docker 部署: 容器化部署方案
?? 總結與思考
這個項目展示了如何將多項現代技術有機結合:
- 云服務集成: Cloudflare KV 提供全球分布式存儲
- AI 輔助開發: MCP + Claude 提升開發效率
- 安全加密: 多層加密保護敏感數據
- 異步編程: 提高程序性能和用戶體驗
通過這個項目,我深刻體會到:
- 技術選型的重要性: 合適的技術棧能事半功倍
- 安全性考慮: 數據加密和權限控制至關重要
- 用戶體驗: 簡潔的接口和清晰的輸出同樣重要
- 可擴展性: 良好的架構設計為未來發展奠定基礎
希望這個項目和分享能為大家在類似的技術探索中提供一些參考和啟發!
?? 參考資料
- [sync-your-cookie 項目地址](https://github.com/jackluson/sync-your-cookie/)
- Cloudflare Workers KV 官方文檔
- MCP (Model Context Protocol) 介紹
- bilibili-api 文檔
- Protocol Buffers 指南
- Python asyncio 官方文檔
- [參考項目]https://www.bilibili.com/video/BV1XUMRz2EvG/

浙公網安備 33010602011771號