#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 从Cookie字符串添加百家号账号到captured_account_cookies.json """ import sys import os import json import requests import urllib3 from datetime import datetime from typing import Dict, Optional # 设置UTF-8编码 if sys.platform == 'win32': import io if not isinstance(sys.stdout, io.TextIOWrapper) or sys.stdout.encoding != 'utf-8': sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') # 禁用SSL警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) class AccountAdder: """从Cookie字符串添加百家号账号""" def __init__(self): self.base_url = "https://baijiahao.baidu.com" self.cookies_file = os.path.join(os.path.dirname(__file__), "captured_account_cookies.json") # 初始化session self.session = requests.Session() self.session.verify = False # 禁用代理 os.environ['HTTP_PROXY'] = '' os.environ['HTTPS_PROXY'] = '' self.session.trust_env = False def parse_cookie_string(self, cookie_string: str) -> Dict[str, str]: """ 解析Cookie字符串为字典 格式: "name1: value1\nname2: value2" 或 "name1=value1; name2=value2" """ cookies = {} # 检测格式 if '\n' in cookie_string: # 多行格式 (name: value) for line in cookie_string.strip().split('\n'): line = line.strip() if not line or ':' not in line: continue name, value = line.split(':', 1) name = name.strip() value = value.strip() if name and value: cookies[name] = value else: # 单行格式 (name=value; name=value) for item in cookie_string.split(';'): item = item.strip() if not item or '=' not in item: continue name, value = item.split('=', 1) name = name.strip() value = value.strip() if name and value: cookies[name] = value return cookies def get_account_info(self, cookies: Dict[str, str]) -> Optional[Dict]: """ 调用百家号API获取账号信息 Args: cookies: Cookie字典 Returns: 账号信息字典,失败返回None """ api_url = f"{self.base_url}/builder/app/appinfo" # 获取token token = cookies.get('bjhStoken') or cookies.get('devStoken') if not token: print("[X] Cookie中未找到 bjhStoken 或 devStoken") return None # 设置Cookie for name, value in cookies.items(): self.session.cookies.set(name, value, domain='.baijiahao.baidu.com') # 请求头 headers = { 'Accept': 'application/json, text/plain, */*', 'Accept-Language': 'zh-CN', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', 'Referer': f'{self.base_url}/builder/rc/incomecenter', 'token': token, } try: print("正在请求百家号API...") response = self.session.get(api_url, headers=headers, timeout=15) if response.status_code != 200: print(f"[X] HTTP错误: {response.status_code}") return None data = response.json() if data.get('errno') != 0: print(f"[X] API错误: {data.get('errmsg', 'Unknown error')}") return None return data.get('data', {}) except Exception as e: print(f"[X] 请求失败: {e}") return None def save_account(self, account_id: str, cookies: Dict[str, str], account_info: Dict): """ 保存账号到captured_account_cookies.json Args: account_id: 账号ID(使用昵称) cookies: Cookie字典 account_info: API返回的账号信息 """ # 加载现有数据 existing_data = {} if os.path.exists(self.cookies_file): try: with open(self.cookies_file, 'r', encoding='utf-8') as f: existing_data = json.load(f) except: pass # 提取用户信息 user_info = account_info.get('user', {}) # 构建账号数据 account_data = { 'cookies': cookies, 'capture_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'capture_domain': 'baijiahao.baidu.com', 'nick': user_info.get('name', ''), 'username': user_info.get('username', ''), 'app_id': str(user_info.get('shoubai_c_appid', '')), 'user_id': user_info.get('userid', 0), 'level': user_info.get('status_cn', ''), 'domain': user_info.get('domain', ''), 'wishes': user_info.get('wishes', ''), 'media_type': user_info.get('media_type', ''), } # 添加到数据中 existing_data[account_id] = account_data # 保存 with open(self.cookies_file, 'w', encoding='utf-8') as f: json.dump(existing_data, f, ensure_ascii=False, indent=2) print(f"\n{'='*70}") print(f"✅ 账号已保存到: {self.cookies_file}") print(f"{'='*70}") print(f"账号ID: {account_id}") print(f"昵称: {account_data['nick']}") print(f"用户名: {account_data['username']}") print(f"App ID: {account_data['app_id']}") print(f"等级: {account_data['level']}") print(f"领域: {account_data['domain']}") print(f"{'='*70}") def add_from_cookie_string(self, cookie_string: str): """ 从Cookie字符串添加账号 Args: cookie_string: Cookie字符串(多行或单行格式) """ print("\n" + "="*70) print("从Cookie字符串添加百家号账号") print("="*70) # 解析Cookie print("\n[1/3] 解析Cookie...") cookies = self.parse_cookie_string(cookie_string) if not cookies: print("[X] Cookie解析失败或为空") return print(f"[OK] 解析到 {len(cookies)} 个Cookie字段") # 获取账号信息 print("\n[2/3] 获取账号信息...") account_info = self.get_account_info(cookies) if not account_info: print("[X] 获取账号信息失败") return user_info = account_info.get('user', {}) nick = user_info.get('name', '') if not nick: print("[X] 未获取到账号昵称") return print(f"[OK] 账号昵称: {nick}") # 保存账号 print("\n[3/3] 保存账号...") self.save_account(nick, cookies, account_info) def main(): """主函数""" # 从用户提供的Cookie字符串(多行格式) cookie_string = """__bid_n: 1921dd9d4207472857485b BAIDUID: FFCEE557FC202E38439C05DBA29FF1E6:FG=1 BAIDUID_BFESS: FFCEE557FC202E38439C05DBA29FF1E6:FG=1 BDUSS: kpONlRBMjdGSmhiUFBtVHhDelpiQVA4VWUzSVBZRFpjNGJjVTdOaGF3ZEtYcGRuRUFBQUFBJCQAAAAAAAAAAAEAAACQSTUbeHlodHN5MDcwMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAErRb2dK0W9nV BDUSS_BFESS: kpONlRBMjdGSmhiUFBtVHhDelpiQVA4VWUzSVBZRFpjNGJjVTdOaGF3ZEtYcGRuRUFBQUFBJCQAAAAAAAAAAAEAAACQSTUbeHlodHN5MDcwMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAErRb2dK0W9nV BMAP_SECKEY: CE4ZhQE4UpPX1cBmpwJb-k7-XDLA0FbpotCf9OB0N6w-dB1F3NrBAwRfYKx8masoan7tZ6PToMntm5YGeuMbC-gPBsFRmS82-Ej-QH3J35p8Uq1PBVJB7mVceaSvU_nQEBKpV7ZcOT2hhTN1ZxJAGSNHCiCpmpjRvwf_lsPpklA-a7GEEg0UtxWlBpKlKJMi canary: 0 gray: 1 Hm_lvt_f7b8c775c6c8b6a716a75df506fb72df: 1763973145 HMACCOUNT: F583F3A18D207AB0 openTabIndex: tab_hot_quest PHPSESSID: tugf8iroinn7gg3am7ar66mbn5 ppfuid: FOCoIC3q5fKa8fgJnwzbE0LGziLN3VHbX8wfShDP6RCsfXQp/69CStRUAcn/QmhIlFDxPrAc/s5tJmCocrihdwitHd04Lvs3Nfz26Zt2holplnIKVacidp8Sue4dMTyfg65BJnOFhn1HthtSiwtygiD7piS4vjG/W9dLb1VAdqPtqDLAxpW7bpPp/JX8kiJ9O0V6uxgO+hV7+7wZFfXG0MSpuMmh7GsZ4C7fF/kTgmtsKg7cD2BVkYtV0XsMM/CA7Ttd1NFiXsCukqfSTYHIe/trpsj7v6DWrflsZy3wtgg1v2iwj13daM+9aWJ5GJCQM+RpBohGNhMcqCHhVhtXpVObaDCHgWJZH3ZrTGYHmi7XJB9z3y2o8Kqxep5XBCsuFAdoiwD9zh1b2MLJsNOZceq7vLGCJ8pzPpNZKTX1qx+Y6sie37xF2/axvcK3uUG6FeLs4wygIv6m069lhsdmzZZ7tuGtBLDDMzV+lM5wt9EAWUYGK/6vri1YTNyEqMxOxcqfdReixTVTfT+miI3ZV5eQE96jz5eP/gEigLYjtZnrOQVr9TB3lK8L3WS99/Zr9ng7DJNA0zsRL0eZGEKF1aDRInbESzVqJcCK3XpGJOV/zZ6wkf5f+PnYbtHcSvBB4lPdCgO/rhHbvTb7w1sYiN/Vk5/GFQKmYmpXiN4dJodGacqAlmwr3VeGGt0kpd2xu3emEg6nEYu6lQuvYr6/UJpAq7e+CnVRC2DzwICP6cu9A5mNm34ZPuoRV+zY3FkhMPIogSdUXhmgZA4QFYm2nZRUXnImSLdnO0vkZt5mrEfhJVPd8EPM2uXc7kAJ+KxEdRGSluqM4FuAgHCvdnqfGnnbe3vsHq3LuF7pombT65cVprejPaivGVaWugm+VA1kVl5OE/aBXOg67P9UlCyJKUMx+vPzRp0n8nh4OMgiK7FDj6TU6gjn6waQU/cc8vmCehgMoOcklInO4L607ifk1fHEk0MlL4OWxuq7efgjrm6OWL/etDxmTUyOZM6zP36ROo4zi6mydDohar/N5lMi0wKAelCG6GviKnveGie7OgmF8kmo9RJfTW+IP3sZd/DuR/5Hpqzck8ARex050OxYQCAmf5kxWsQsjulfPwmSj1e/e5IMej8LeSYUutq68RilSDcVuoSozomZEeqTBGFIlGsX4zI6hgqbqSpGh7XVwmTNGzN5i8XJcI9K4nmjKg6CgI8pcTx9fvdY5nSYCUXWZw== RECENT_LOGIN: 0 SECKEY_ABVK: iDCiYriSi0nTLZWqv9z4m/pEfspPi57AnV+upmT3CwI%3D theme: bjh XFI: 8480c060-da4e-11f0-96c9-6b58b9418e3a XFT: aSlEXXLLXKfFbEX9TDZU7JaLHsTV7z09fGA1Gx/vsjI= XFCS: 20D138665DC36EE9C19F30649B914E49D13C2470B4126B585A55C28FFC038102 devStoken: 03312832700ecb67835a6b15801bf5c935c219b9be615a086be979af01d07f84 bjhStoken: a271d73cfab43b446a9deb491c69606e35c219b9be615a086be979af01d07f84 ab_sr: 1.0.1_ZjY4MjdmNTc3NTc2OTExNjBkZWRhMTUyZWI2N2IzZTkwMmVkOTRjOTI3ZjNlMjRiMmFjMjhjNDZkN2YwMzdiOTJiZDVjNmYxYjlkZjM1ZWI3OGE5ZDViYzVhMzgzNDc4ZjBiNzViZWJmZmUzMTY3MDdjZmNlZjA2ZTg0NWU5NGRhMzljZDU5NDliNjcxYjk5NzZhMGY0YmUyZjI2OGM2ODRmNTM1NzEzNGU4Yjc3Yzc4YjJiMjQyMzgzNjExNmVi RT: "z=1&dm=baidu.com&si=1c50c134-5366-4b01-829c-2c5b4a442d8e&ss=mj88vfl9&sl=12&tt=ww1&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf" Hm_lpvt_f7b8c775c6c8b6a716a75df506fb72df: 1765871353""" adder = AccountAdder() adder.add_from_cookie_string(cookie_string) if __name__ == '__main__': main()