dy_cookie_manager.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. import asyncio
  2. import time
  3. import json
  4. import hashlib
  5. from typing import Optional
  6. from loggers import StdoutLog
  7. from utils import AsyncRedisHelper
  8. class DouyinCookieManager:
  9. def __init__(self, cookie_key: str):
  10. """
  11. Douyin Cookie 管理器
  12. :param cookie_key: Redis 键名,如 "cookies:douyin:search"
  13. """
  14. self.redis = AsyncRedisHelper().get_client()
  15. self.key_list = cookie_key
  16. self.key_info = f"{cookie_key}:info"
  17. # Cookie 管理操作
  18. async def add_cookie(self, cookie: str):
  19. """手动新增一个 Cookie"""
  20. try:
  21. if isinstance(cookie, bytes):
  22. cookie = cookie.decode("utf-8")
  23. cookie_id = self._generate_cookie_id(cookie)
  24. # 检查是否已存在
  25. existing_info = await self.redis.hget(self.key_info, cookie_id)
  26. if existing_info:
  27. StdoutLog.info("[⚠️] Cookie 已存在,跳过")
  28. return
  29. # 添加到列表和哈希表
  30. await self.redis.lpush(self.key_list, cookie)
  31. info = {
  32. "cookie": cookie,
  33. "use_count": 0,
  34. "status": "ok",
  35. "fail": 0,
  36. "first_use": 0,
  37. "last_use": 0,
  38. "last_fail_time": 0,
  39. "added_time": int(time.time())
  40. }
  41. await self.redis.hset(self.key_info, cookie_id, json.dumps(info))
  42. StdoutLog.info(f"[✅] 新增 Cookie 成功,ID: {cookie_id}")
  43. except Exception as e:
  44. StdoutLog.error(f"添加Cookie异常: {e}")
  45. async def get_cookie(self) -> Optional[str]:
  46. """获取一个 Cookie 并更新使用信息"""
  47. try:
  48. # 从列表尾部取出并放回头部,实现轮询
  49. cookie = await self.redis.rpoplpush(self.key_list, self.key_list)
  50. if not cookie:
  51. StdoutLog.info("[❗] 当前无可用 Cookie")
  52. return None
  53. # 解码为字符串
  54. cookie_str = cookie.decode() if isinstance(cookie, bytes) else cookie
  55. cookie_id = self._generate_cookie_id(cookie_str)
  56. now = int(time.time())
  57. # 获取 info
  58. info_raw = await self.redis.hget(self.key_info, cookie_id)
  59. if not info_raw:
  60. # 若 info 不存在,自动补建
  61. info_data = {
  62. "cookie": cookie_str,
  63. "use_count": 1,
  64. "status": "ok",
  65. "fail": 0,
  66. "first_use": now,
  67. "last_use": now,
  68. "last_fail_time": 0,
  69. "added_time": now
  70. }
  71. else:
  72. info_data = json.loads(info_raw.decode() if isinstance(info_raw, bytes) else info_raw)
  73. info_data["use_count"] = info_data.get("use_count", 0) + 1
  74. info_data["last_use"] = now
  75. if not info_data.get("first_use"):
  76. info_data["first_use"] = now
  77. await self.redis.hset(self.key_info, cookie_id, json.dumps(info_data))
  78. StdoutLog.info(f"[✅] 获取 Cookie 成功,ID: {cookie_id}")
  79. return cookie_str
  80. except Exception as e:
  81. StdoutLog.error(f"获取Cookie异常: {e}")
  82. return None
  83. async def mark_fail(self, cookie: str):
  84. """标记 Cookie 使用失败"""
  85. await self._update_info(cookie, success=False)
  86. async def _update_info(self, cookie: str, success: bool):
  87. """更新 Cookie 使用状态"""
  88. try:
  89. if isinstance(cookie, bytes):
  90. cookie = cookie.decode("utf-8")
  91. cookie_id = self._generate_cookie_id(cookie)
  92. info_raw = await self.redis.hget(self.key_info, cookie_id)
  93. if not info_raw:
  94. StdoutLog.warning(f"[⚠️] Cookie 信息不存在: {cookie_id}")
  95. return
  96. info_data = json.loads(info_raw.decode() if isinstance(info_raw, bytes) else info_raw)
  97. now = int(time.time())
  98. if not success:
  99. info_data["fail"] = info_data.get("fail", 0) + 1
  100. if not info_data.get("first_fail_time"):
  101. info_data["first_fail_time"] = now
  102. info_data["last_fail_time"] = now
  103. if info_data["fail"] >= 2:
  104. info_data["status"] = "banned"
  105. await self.redis.lrem(self.key_list, 0, cookie)
  106. info_data["last_use"] = now
  107. await self.redis.hset(self.key_info, cookie_id, json.dumps(info_data))
  108. except Exception as e:
  109. StdoutLog.error(f"更新Cookie信息异常: {e}")
  110. async def delete_cookie(self, cookie: str):
  111. """删除 Cookie(从列表与 info 中同时移除)"""
  112. try:
  113. if isinstance(cookie, bytes):
  114. cookie = cookie.decode("utf-8")
  115. cookie_id = self._generate_cookie_id(cookie)
  116. # 删除 info
  117. await self.redis.hdel(self.key_info, cookie_id)
  118. # 删除列表中对应 cookie(兼容 bytes)
  119. raw_list = await self.redis.lrange(self.key_list, 0, -1)
  120. for item in raw_list:
  121. item_str = item.decode("utf-8") if isinstance(item, bytes) else item
  122. if item_str == cookie:
  123. await self.redis.lrem(self.key_list, 0, item)
  124. StdoutLog.info(f"[✅] 删除 Cookie 成功,ID: {cookie_id}")
  125. return
  126. StdoutLog.warning(f"[⚠️] 未找到列表中对应 Cookie: {cookie_id}")
  127. except Exception as e:
  128. StdoutLog.error(f"删除Cookie异常: {e}")
  129. async def list_cookies(self):
  130. """列出所有 Cookie 信息"""
  131. try:
  132. data = await self.redis.hgetall(self.key_info)
  133. result = {}
  134. for k, v in data.items():
  135. try:
  136. key = k.decode() if isinstance(k, bytes) else k
  137. value = v.decode() if isinstance(v, bytes) else v
  138. result[key] = json.loads(value)
  139. except Exception:
  140. continue
  141. # 格式化时间戳为可读格式
  142. for cookie_info in result.values():
  143. if "first_use" in cookie_info and cookie_info["first_use"] > 0:
  144. import datetime
  145. cookie_info["first_use_formatted"] = datetime.datetime.fromtimestamp(
  146. cookie_info["first_use"]).strftime('%Y-%m-%d %H:%M:%S')
  147. else:
  148. cookie_info["first_use_formatted"] = "从未使用"
  149. if "last_use" in cookie_info and cookie_info["last_use"] > 0:
  150. import datetime
  151. cookie_info["last_use_formatted"] = datetime.datetime.fromtimestamp(
  152. cookie_info["last_use"]).strftime('%Y-%m-%d %H:%M:%S')
  153. else:
  154. cookie_info["last_use_formatted"] = "从未使用"
  155. if "last_fail_time" in cookie_info and cookie_info["last_fail_time"] > 0:
  156. import datetime
  157. cookie_info["last_fail_time_formatted"] = datetime.datetime.fromtimestamp(
  158. cookie_info["last_fail_time"]).strftime('%Y-%m-%d %H:%M:%S')
  159. else:
  160. cookie_info["last_fail_time_formatted"] = "从未失败"
  161. if "added_time" in cookie_info and cookie_info["added_time"] > 0:
  162. import datetime
  163. cookie_info["added_time_formatted"] = datetime.datetime.fromtimestamp(
  164. cookie_info["added_time"]).strftime('%Y-%m-%d %H:%M:%S')
  165. else:
  166. cookie_info["added_time_formatted"] = "未知时间"
  167. return result
  168. except Exception as e:
  169. StdoutLog.error(f"列出Cookie异常: {e}")
  170. return {}
  171. def _generate_cookie_id(self, cookie: str) -> str:
  172. """使用 MD5 生成固定长度的 cookie_id"""
  173. return hashlib.md5(cookie.encode("utf-8")).hexdigest()
  174. # 测试
  175. async def main():
  176. mgr = DouyinCookieManager("cookies:douyin:search")
  177. # 添加 Cookie 示例
  178. # cookies = [
  179. # '__ac_nonce=069172f4400f3ab53f00d; __ac_signature=_02B4Z6wo00f01-Ole1gAAIDB0DCNG.F1NifjhX.AAJIHd1; enter_pc_once=1; UIFID_TEMP=b7ffea4ffb7fd578f49f51586a953ac3b119cdf53ef4e59d8d754c665e367392f568057dd465fd446e45dab366910badbfb7d3035c9f38ad0811cb234fdcd31b722f51b88c85b3411f54f5758be0ea79; x-web-secsdk-uid=1c82aa07-26df-4ee7-b0c5-27782bab3b0a; s_v_web_id=verify_mhywcuzj_1SsaSL0L_179U_4877_B9EJ_bzNtYTuIGoJM; douyin.com; device_web_cpu_core=12; device_web_memory_size=8; hevc_supported=true; home_can_add_dy_2_desktop=%220%22; dy_swidth=1920; dy_sheight=1080; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1920%2C%5C%22screen_height%5C%22%3A1080%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A12%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A100%7D%22; strategyABtestKey=%221763127109.404%22; fpk1=U2FsdGVkX188/8LXy+vpNjkOjVC2Qxh3vDpCCOsJlaPMWLSb/pcmBfATycuhr7e9USs5xSsX7hF7QC+WKxFr9g==; fpk2=f18b5213b6de2490ec9be218b0f025b0; xgplayer_user_id=218982624082; odin_tt=4b24d2c771295d1be3a14f1106bb19dd90087b0aa727b286cf196966e08f0d0deec713f56655ea759ae1701541794b4f8e52af3af372786dd84095e96746e573f35295fc8e935af6b9f3c16ecf6c2653; passport_csrf_token=20c9ef38f724243a70f8ab3adce09f9a; passport_csrf_token_default=20c9ef38f724243a70f8ab3adce09f9a; biz_trace_id=f2a12167; __security_mc_1_s_sdk_crypt_sdk=a5ee5324-48a8-9fee; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCRDRTYTI0dy9nOG5UVmtQU2dJODlOUnZkWXdNT1pkdzdTdFlzRjd6UUF5OUFFRWtiempRbXd6eEdsSnlHUXJMZ05BODdwbFFlWmJVbWVwMkNaN0tITkk9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; bd_ticket_guard_client_web_domain=2; bd_ticket_guard_client_data_v2=eyJyZWVfcHVibGljX2tleSI6IkJENFNhMjR3L2c4blRWa1BTZ0k4OU5SdmRZd01PWmR3N1N0WXNGN3pRQXk5QUVFa2J6alFtd3p4R2xKeUdRckxnTkE4N3BsUWVaYlVtZXAyQ1o3S0hOST0iLCJyZXFfY29udGVudCI6InNlY190cyIsInJlcV9zaWduIjoidW9zUlhSSWQ1dERBa3VRQldVNDNNTVI4ZGg3WitGdVRzV3hIeCsvVTd0Zz0iLCJzZWNfdHMiOiIjcUNJR1VoREJSOTdHZkxOWitRU3ZVb04zRG52ekVCL1c1YzA0UVBUNVdrR0trUEtVQldTTFhtbDM4U0ZHIn0%3D; ttwid=1%7C25oNPBuCVy-NObmX-hG8OdUZB4cV10e3EsZiK30Kyd4%7C1763127112%7C2b00bc62e211863fc5d11ce4800e0aced3b96554d6017ed3e3ec653f9a714df1; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f2733303335343432373436333234272927676c715a75776a716a666a69273f2763646976602778; bit_env=P-iGJAx9xbZTZHUAZXUTsjvEAw7zfzC5MVT1r6QGatqMXuekRamdEKoXa9jXgfHutTTutWgo3ZdytmunQiragaar4EI3VaprGE1LeDRwFZYQgDsuJfeAndteUXHG2gjypE-tLy3cwODYPH0OLweaxfspgvZdDdVsgY89-i5I6abULfu40Nb9TVe7HRmEAYnvbXJ8Ztb9vDAommBNAa-8tJPfMpCO_7xnPryRg5O48hBrlx_b_-K1drf4zKE_LsxThBKY7ffMz732gWhzUlSBdfUOsFhnaW-PbL-5MzhmznVxtwybDlfRIHbRh6zHNxjBhs_dkgNPK9aOB9b8M945xIJJUaPa_XQS3eGTpqvVoXckulS0a205S3Ratc_onqwDvJ03bryccyx0UkBf3NxvGxalcSgF2dbIEqgynSXIbZuZzsu3aPqgDbbb_8ygtCw8IQU-pH-Bq6wzJX1ACjPktQZ3cqwBc35w90GcTfTLT2mcEDfRwwHpacBxAwihTl4KrY6vaTx2OmfUJuL_4UXf9GiR7iWhfGpv5-wTITvs4Dw%3D; gulu_source_res=eyJwX2luIjoiYjYwM2IxOTA2OTIxYzA2MTQyN2RmODI4Y2MzNWMxYTIyNTE4ZTZiNmQxMGQyYmRiY2Q0Y2MzOTQ0ODNlM2E4YiJ9; passport_auth_mix_state=7n40kt35tz3mvxf1ufsr70vi916jose7g9a4wyiq9rtgznun; xg_device_score=7.630007575365517; volume_info=%7B%22isMute%22%3Afalse%2C%22isUserMute%22%3Atrue%2C%22volume%22%3A0.5%7D; is_dash_user=1; IsDouyinActive=false; SEARCH_RESULT_LIST_TYPE=%22single%22; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A0%7D%22; csrf_session_id=a5355d954d3c63ed1ba35faada452b4d',
  180. # '__ac_nonce=069172f730091ee9673da; __ac_signature=_02B4Z6wo00f01RlgVQgAAIDDKvWjSsxTCaEZQFGAAC9S22; enter_pc_once=1; UIFID_TEMP=b7ffea4ffb7fd578f49f51586a953ac3b119cdf53ef4e59d8d754c665e367392f568057dd465fd446e45dab366910bad854e9f21f6abfc4e1d98b1febedc8a8477e0bbbed7fb96abd389f4fe5e0899b8; x-web-secsdk-uid=2f94b7fd-9932-4c73-b6b2-14f509c94102; s_v_web_id=verify_mhywduza_CMh9AdN6_q7YF_4oBf_9svj_mK4PzOtuqokl; douyin.com; device_web_cpu_core=12; device_web_memory_size=8; hevc_supported=true; home_can_add_dy_2_desktop=%220%22; dy_swidth=1920; dy_sheight=1080; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1920%2C%5C%22screen_height%5C%22%3A1080%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A12%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A50%7D%22; strategyABtestKey=%221763127155.408%22; volume_info=%7B%22isUserMute%22%3Afalse%2C%22isMute%22%3Afalse%2C%22volume%22%3A0.5%7D; fpk1=U2FsdGVkX19eRlK+PptXl3Kzp1FyJfZ6bE6t/xXbxH0CE/vxDdPzjCwnd9sK5/BUiOtN1+8qWKkJrIsSCMqWUQ==; fpk2=f18b5213b6de2490ec9be218b0f025b0; ttwid=1%7CyOI11Eg_h-b7ct1xs8URYvtCs65Kg7pzMP0mluoCR60%7C1763127158%7C014d43801588f5e3dd9c74482827cad367ca3f2e13a2130d3f28bf8724b93da9; passport_csrf_token=c8215f524ccfb5142dd590f3cb1f80cc; passport_csrf_token_default=c8215f524ccfb5142dd590f3cb1f80cc; odin_tt=9f8b4ebe3ef2453c35e6eb2fe54a1420f179740ed5c109222dec66e248677a001a533dd60342e303f38e43e175fe172259c7a9cc1d1dcbcf2150793ae8c3f4f8148c47f814cacf6eb4ca6d845b8e811e; biz_trace_id=a33a365a; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f273d373d33303432373436333234272927676c715a75776a716a666a69273f2763646976602778; bit_env=XXm2hRTBW7SpOEX-NtkJ54q0EjKIo0F_KR58oniwQ-F7TlqLXEzDAdeYhEE2Kc1yE60AKJRSZT2DMDdz7aNoU0QwmV0q_qjthgurcCVs03PHWV3ExS1fOR5-VVBxB35PISN48rn8rZTpXOq3k0MusM6IWUgYgFbqMTjp_rUf6bfSq6v97DlM4HV9IgYbSuyvMzpuYjd1t0-kLhEDVZzGrWKI9RJIPffH9ts-kZH_WTZIi5kh_eH5WkKekcaYBG4LtCVZH-qTLs0ycE_-Za03hK2WBPhejY_2g6kf2nd9BYOYxN3i4L7uE2I4X0EF3Ixm68oXAlLgPtRpOHqihy4lc1vFag8lDXNDtU0q6nLtVzSVeaVbjJLfPs2jn1dE33cli7WWka4unwDfGfNp6IJKJ2cUlpC9xMiL0UHbXQGF_q2By10kprKBeeZBsGTD5oKch4Zqv9MzofWy43Fur1CVLzjBzX1NCgg5LJ6-SxmwgsePqHKu5i_QQ9tJ1dCWMJr94NZgBdCqkc3aepuXBcg9GrjaeBxcWPbCEOVEETitZu8%3D; gulu_source_res=eyJwX2luIjoiYjYwM2IxOTA2OTIxYzA2MTQyN2RmODI4Y2MzNWMxYTIyNTE4ZTZiNmQxMGQyYmRiY2Q0Y2MzOTQ0ODNlM2E4YiJ9; passport_auth_mix_state=9p7zr88t47xi6m5isbysp89tir0i4l57az0xn42rteddj503; is_dash_user=1; __security_mc_1_s_sdk_crypt_sdk=59892af2-4666-85ab; IsDouyinActive=false; SEARCH_RESULT_LIST_TYPE=%22single%22; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A0%7D%22; csrf_session_id=a5355d954d3c63ed1ba35faada452b4d',
  181. # '__ac_nonce=069172f9e00dcd51b3adf; __ac_signature=_02B4Z6wo00f01jlxeVQAAIDACuSPFAAcd-I5UX3AAOdZb2; enter_pc_once=1; UIFID_TEMP=b7ffea4ffb7fd578f49f51586a953ac3b119cdf53ef4e59d8d754c665e367392f568057dd465fd446e45dab366910bad2cc8fb67d10bec76430221c79e7dd8aea04c3fd2cceddba5a5d234b7b6159ff3; x-web-secsdk-uid=3b81fe2a-e4b8-4155-a157-71ef71e9d402; s_v_web_id=verify_mhywesj0_JYWe1Dm5_3XXw_4kcH_9nGj_amhCQg6BO9c1; douyin.com; device_web_cpu_core=12; device_web_memory_size=8; hevc_supported=true; IsDouyinActive=true; home_can_add_dy_2_desktop=%220%22; dy_swidth=1920; dy_sheight=1080; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1920%2C%5C%22screen_height%5C%22%3A1080%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A12%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A50%7D%22; strategyABtestKey=%221763127202.421%22; fpk1=U2FsdGVkX19mCYMlr//IOab0oig5jpys2Nhst7NJP04R4fZMND+kUSnZefg9Mw7pnYlSfNYK27Js17yMfeKM+A==; fpk2=f18b5213b6de2490ec9be218b0f025b0; odin_tt=369307361fede55b4eb2919c5f1c0f15b28469eb73f67ab462e80f1ae8189bdc0b2775b8540ab1f41791028278f5142195019f096edca7a0259ed347c6bd6c0640cb14678136df92ccc08a88e77bad1a; ttwid=1%7CEKIVY_6armKKngLBwT6WdL9IjcotEysxRFjxj8Gbxdk%7C1763127205%7Cabc8f3ac5c3541738fcce839f4b757793a5b17eaccc46e0c357f65ab3a0fc86c; passport_csrf_token=c59e47863737334e69ee1ed0febc4603; passport_csrf_token_default=c59e47863737334e69ee1ed0febc4603; biz_trace_id=e1d33e1e; __security_mc_1_s_sdk_crypt_sdk=289fec38-4b90-9e8b; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCRCtVa2VOcHhiUEt5a1lYRmxjQitnaGhjTXpOdVljQ1g3b2lGQWVxUks3dXBtVTlScEJnY1dVblozamxUcEVvcVJBWEh2eW92ODBLRGh6MWo3TGJUMFU9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; bd_ticket_guard_client_web_domain=2; bd_ticket_guard_client_data_v2=eyJyZWVfcHVibGljX2tleSI6IkJEK1VrZU5weGJQS3lrWVhGbGNCK2doaGNNek51WWNDWDdvaUZBZXFSSzd1cG1VOVJwQmdjV1VuWjNqbFRwRW9xUkFYSHZ5b3Y4MEtEaHoxajdMYlQwVT0iLCJyZXFfY29udGVudCI6InNlY190cyIsInJlcV9zaWduIjoiRGRTd0tIZ0tyTFQxMTNuYWgxVjlOT0dMc3o5NWtNV2JsaEV3ZnhCYWVEVT0iLCJzZWNfdHMiOiIjS1lLcVdnMys4ZXhuZEphVEdmUlBWbHBvWC96L0RxTWVZNS94cUFoRW9GL01tM053VXJJTjN6RkRWeTNMIn0%3D; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f2730343d36353732373436333234272927676c715a75776a716a666a69273f2763646976602778; bit_env=i3smUEq64LClRCQtCFCOMPT55Xjf8vWOBSsi07zEFxjsEsIYMN1dAkDp_q6S5Dl5pQaXjWPjWMgE4m-U3IYVy5RSfa7lGpFQWcGNRG51CRAzbGSwwyoJyHX_-_Y7PoQav-Fz7POg9Bptcgt3G-1KMJ94CrN2K7eHXpffzQMTFa_5QXg959AJml6QYGu8bgj-vcLGjq7aRlo2zwydK6CzK9iJeU9qX5F0uKrFr1wKzTFTCExbfEVQJEU-pKeiRR9gandBt0oYmX39Y38lQYR4C2jV6osavvYhbRUW4nBAAG7D8SjQY_Mzf8ztDgwzZ08_0sCSBRixxNoEvsIDCSpC0dXkT1Jytc1YrSXWKjU0G4ngmQEiV1XMMhfc601dxQEIwVtmnw7LF9CKF8fOBWcB6pmCcaoN3J3yaEaVJ-nTGH2c1MaeVgtt-42p8e9iiS570KHbbHUdnAPmgZk7G14AvNpqvczpTBGN_QOStDv4xFJL9qiIXAyUFyvURt-EDmAinZ03LcdPj4Jmwl7E5pwEfrXHh9W3wgdiP3zw5VCRuZk%3D; gulu_source_res=eyJwX2luIjoiYjYwM2IxOTA2OTIxYzA2MTQyN2RmODI4Y2MzNWMxYTIyNTE4ZTZiNmQxMGQyYmRiY2Q0Y2MzOTQ0ODNlM2E4YiJ9; passport_auth_mix_state=tqhud4383mw9yrbglt13vqgi4w32hx5dc670magubh1g5dbq; UIFID=b7ffea4ffb7fd578f49f51586a953ac3b119cdf53ef4e59d8d754c665e36739243824524f8ff831c6ef07f8175b391188441196f91e93a291d720077ed018fc3665e71347e1465d6b61c8958cfeca07a660d13bb6775ab1c07a2e91506ad4e521b5f9836b487f5246e811cbbc3a09129db6720b482fc211c3fe136bf7cdff814d0f025d216bcf5d259ec68325bef4c53e36973351865358d36cff570b80bdd3a; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A1%7D%22; volume_info=%7B%22isMute%22%3Afalse%2C%22isUserMute%22%3Atrue%2C%22volume%22%3A0.5%7D',
  182. # '__ac_nonce=069172fc5009d96ee2fcb; __ac_signature=_02B4Z6wo00f01j79UlQAAIDADWikFQbdH7Y-3VbAAOa23e; enter_pc_once=1; UIFID_TEMP=b7ffea4ffb7fd578f49f51586a953ac3b119cdf53ef4e59d8d754c665e367392f568057dd465fd446e45dab366910badb9ef5f9da729ae5f919ba5ecc0e84d21190230c012a66d72f772200fa1570246; x-web-secsdk-uid=6b224a87-8b18-41cd-837d-5b8b37f0475d; s_v_web_id=verify_mhywfmis_piG42jJA_1es4_4llx_ABdS_7jt6eMbBGtzL; douyin.com; device_web_cpu_core=12; device_web_memory_size=8; hevc_supported=true; home_can_add_dy_2_desktop=%220%22; dy_swidth=1920; dy_sheight=1080; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1920%2C%5C%22screen_height%5C%22%3A1080%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A12%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A50%7D%22; strategyABtestKey=%221763127238.083%22; fpk1=U2FsdGVkX1+Rxry6S/gAOL9oS8suJAqYD6ruYDDU62znNmHJAQtMnLj1lR414jWOnAXonfixjolbH3diZQ54tQ==; fpk2=f18b5213b6de2490ec9be218b0f025b0; passport_csrf_token=9e79f69047c05255adadfba3d74e5bdd; passport_csrf_token_default=9e79f69047c05255adadfba3d74e5bdd; odin_tt=9501068b0dc7e879ede5bdea3378460aa48aa5c3dceabff5989ecdc15ab5f2c7df08407bc7e66cb42fed8c03860b21b2f3f9f79eefa3c0a7f0d45cd5f7fa091177f0ab30fbd21be65f57bf6b082b1552; biz_trace_id=696c83e0; __security_mc_1_s_sdk_crypt_sdk=34881948-4c53-8b9e; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCSXAxTWxSMUJZbWFVQXFvR3ZxQ1B0ZGtQeHY4VXI1Sm5HOHBNRnNtSE5SS2R5M0NUU05nTCttTmgzcjJ4WnBPWXZJQlBmcWZQWHpiZS82V0JoeVpZWkE9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; bd_ticket_guard_client_web_domain=2; bd_ticket_guard_client_data_v2=eyJyZWVfcHVibGljX2tleSI6IkJJcDFNbFIxQlltYVVBcW9HdnFDUHRka1B4djhVcjVKbkc4cE1Gc21ITlJLZHkzQ1RTTmdMK21OaDNyMnhacE9ZdklCUGZxZlBYemJlLzZXQmh5WllaQT0iLCJyZXFfY29udGVudCI6InNlY190cyIsInJlcV9zaWduIjoiNHZBWFJVbUhjWlRwTitQWVRSQ0M2Q2h5TDRkcElrNW85TlBycGhFVnVrMD0iLCJzZWNfdHMiOiIjci9Ec3FkRWVSNmRxbzZWTmtHbFpuS0Z4MEQxeEJjWm04TDVMN1VxVmNncW00b1hJcmtEeFVNejV4dUhCIn0%3D; ttwid=1%7CGEPwCWXFNMCAK-UW2fmrxMZhsP3ylTtXz2ZVHOKnSgY%7C1763127241%7C1bc358f3f452e41a6ef6dc8d1a4039aceccd9c6734c9be8b8cfed95ddd81bf99; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f273336313c363732373436333234272927676c715a75776a716a666a69273f2763646976602778; bit_env=eQ_y9INSQ3J0z9zm56JMpEmCOuyXRgmpywmkrTVdJaOFfk6jd8qUwfdCqFexQL8qCK0ms4a4yZmC9GYaeX16FC47sc6t2kE3wqmw6pBgjIGv9a57AVe67kvaqHQ-DR-DE9Gn7ughIxNKJke40kwVPeeewPYVT8YdajAynxgMXrJdPZnMDjjtGSTO4Lh77-AVfLURmyRvwr42gr-WTzMQcRcDuROeg-EuwAur1Luq-uPbPzb54W89e9fGMhXiKJ-kG-rkMd9vdQ9zjGh4u9d2YL-1s72TE5irH6nVppi0uUbDwo6JdyYzAVj7ZKLiLLK5YkViHGtsdMkHS2drnXVyeNSWVI7iWhWsn07FlfHe0Fhpa-k2unoeSR4PrCE9xRu6c8I2iyltk7tpVxlT8fAMsW-ti30mEaDgRF46yXenCJeVzDhT2kV0A7CvxQXku6j1mWr0RSlmgjNGilNIf5PaCQdfkefy9I-pwaZSDIO2RVH8wLW3fJpnXZhtyizWJk2fEmhV5ddiq15ULvcN9rwiJhXmWbL24R3I14qWJnK0Q6g%3D; gulu_source_res=eyJwX2luIjoiYjYwM2IxOTA2OTIxYzA2MTQyN2RmODI4Y2MzNWMxYTIyNTE4ZTZiNmQxMGQyYmRiY2Q0Y2MzOTQ0ODNlM2E4YiJ9; passport_auth_mix_state=1cwqxjx9irhkcprlcn1308y245r5fkqb0v3lu25x74sxo63s; volume_info=%7B%22isMute%22%3Afalse%2C%22isUserMute%22%3Atrue%2C%22volume%22%3A0.5%7D; SEARCH_RESULT_LIST_TYPE=%22single%22; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A0%7D%22; csrf_session_id=a5355d954d3c63ed1ba35faada452b4d; IsDouyinActive=true',
  183. # '__ac_nonce=069172ff600db6b3b7ea2; __ac_signature=_02B4Z6wo00f01sFNrtQAAIDA8thYlOzx96LBbapAANlR76; enter_pc_once=1; UIFID_TEMP=b7ffea4ffb7fd578f49f51586a953ac3b119cdf53ef4e59d8d754c665e367392f568057dd465fd446e45dab366910bad95752e64144068b821abadbf76bdadcc2a72c35be3df27616a49635b5debb973; x-web-secsdk-uid=8075d9ac-3986-455d-b2f2-15c8061ed996; s_v_web_id=verify_mhywgoqm_sSfogFJD_ZHve_47if_Ac3m_HpuZyrHv0me6; douyin.com; device_web_cpu_core=12; device_web_memory_size=8; hevc_supported=true; home_can_add_dy_2_desktop=%220%22; dy_swidth=1920; dy_sheight=1080; stream_recommend_feed_params=%22%7B%5C%22cookie_enabled%5C%22%3Atrue%2C%5C%22screen_width%5C%22%3A1920%2C%5C%22screen_height%5C%22%3A1080%2C%5C%22browser_online%5C%22%3Atrue%2C%5C%22cpu_core_num%5C%22%3A12%2C%5C%22device_memory%5C%22%3A8%2C%5C%22downlink%5C%22%3A10%2C%5C%22effective_type%5C%22%3A%5C%224g%5C%22%2C%5C%22round_trip_time%5C%22%3A100%7D%22; fpk1=U2FsdGVkX1+pN9QAlPcL8cKM6FupvNBDx2cZH9aezTj6zJtn8iPxXk0n7rkUYisIjEFk29WCEEg4AjskXSPqJw==; fpk2=f18b5213b6de2490ec9be218b0f025b0; strategyABtestKey=%221763127287.057%22; volume_info=%7B%22isUserMute%22%3Afalse%2C%22isMute%22%3Afalse%2C%22volume%22%3A0.5%7D; passport_csrf_token=27e1fcef4d8216eaadee288104a59a29; passport_csrf_token_default=27e1fcef4d8216eaadee288104a59a29; biz_trace_id=44aa6830; __security_mc_1_s_sdk_crypt_sdk=1e98b894-4a46-8c84; bd_ticket_guard_client_data=eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCUHBXZlVXVS9oWlVYZjFCMG1mdVFMVlRTWDEyU2lWMFIyOFpGemo3NGE3Q29oV2EweHJTUkRuNDZwWEF2Tld0VHdtck5jaHlleHpyUE1IdGJpVVorbEE9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D; bd_ticket_guard_client_web_domain=2; bd_ticket_guard_client_data_v2=eyJyZWVfcHVibGljX2tleSI6IkJQcFdmVVdVL2haVVhmMUIwbWZ1UUxWVFNYMTJTaVYwUjI4WkZ6ajc0YTdDb2hXYTB4clNSRG40NnBYQXZOV3RUd21yTmNoeWV4enJQTUh0YmlVWitsQT0iLCJyZXFfY29udGVudCI6InNlY190cyIsInJlcV9zaWduIjoiSGVtWWUreFVZUzBENUttWWFkL2xESUkyK2taZGdHM1Z0eGw2YWp5azRjUT0iLCJzZWNfdHMiOiIjdmgvcVUxVnhxb2dIaHIrWUlyNWwyQW82ckp6WG9jNEtzVGFlSHBkNkNXaHl1U2FoUmltdFVDNDhxbmF1In0%3D; ttwid=1%7CeVthrLLewxLUlrVxEb2pWZ3E_OcrpAOY33PJ2Os95GY%7C1763127290%7C9e505e4f9c2d7b421208112ed06d7df046341e8cc79974f584d5b9282e3c7531; sdk_source_info=7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e582729277672715a646971273f2763646976602729277f6b5a666475273f2763646976602729276d6a6e5a6b6a716c273f2763646976602729276c6b6f5a7f6367273f27636469766027292771273f27333c373d3d3732373436333234272927676c715a75776a716a666a69273f2763646976602778; bit_env=w9lw6iwkkH1ulbZyet6geVGbCzi2_ofwUjOelweK86GYh5VkIMGxjt97GG7QEqNeo8mTPxNei571olg93vYtktE7iiOlJxCuD_k9IdMxmcz78GqclsuFZsra_9ZX2HNhExdSkEYh-R5MJcAFZ1hEoRWGD4ohEaGoX3DNB00JSM_i3WCJxVls8EORs29Eb8Qb6bwZ2EStHBgCgf8pR8lXwyhjmGegZ9JRoO5zk96XCRBKbLXEopnlPpxkAFBvKM3YxDB0OYMwizVj34iH-Jjt8_996Cvr0kS1SSZHerJ6ZRwS5embO4IyU7IR4iUiBVUGN5rJbcSQSOag8xoeUDi4612ishc-Gk41Hph2QstFZP81jT75r6vF08I-T4QlGmoK-da_7KJ7_IiX2LmjaMkfsKmYVbH6XsrR5Bv3VaCyTK3fXzIRewJ-Jbt_PR8DnG4-hHgaEu7_TWgSoigf7Krp2xB8lkaeM51nP6X6PY8RsesrCW_Po39vqJoIcEPlczBkPN8k1shAt-MBx4N4-q1gikKOEU460OAKDDZv9j3R3VQ%3D; gulu_source_res=eyJwX2luIjoiYjYwM2IxOTA2OTIxYzA2MTQyN2RmODI4Y2MzNWMxYTIyNTE4ZTZiNmQxMGQyYmRiY2Q0Y2MzOTQ0ODNlM2E4YiJ9; passport_auth_mix_state=jndi9zrd9x7ocr9bviqr32jrdu9b4pbtmompnva7glwjmrgj; odin_tt=71a5699dc13fe88fdf38b11d0bf87bbb2e2b73d0913420a817fee1a0643173a2641bada423bbe856b5636ddd7b803ef6ebd4e31fd9e18db7cccc7c924efb40f6c079d52b1a99e64150f1aad048d21742; is_dash_user=1; IsDouyinActive=false; SEARCH_RESULT_LIST_TYPE=%22single%22; stream_player_status_params=%22%7B%5C%22is_auto_play%5C%22%3A0%2C%5C%22is_full_screen%5C%22%3A0%2C%5C%22is_full_webscreen%5C%22%3A0%2C%5C%22is_mute%5C%22%3A0%2C%5C%22is_speed%5C%22%3A1%2C%5C%22is_visible%5C%22%3A0%7D%22; csrf_session_id=a5355d954d3c63ed1ba35faada452b4d'
  184. # ]
  185. # for cookie in cookies:
  186. # await mgr.add_cookie(cookie)
  187. # 获取 Cookie(会自动更新 first_use/last_use)
  188. # cookie = await mgr.get_cookie()
  189. # print("获取到 Cookie:", cookie)
  190. #
  191. # # 模拟失败一次
  192. # if cookie:
  193. # await mgr.mark_fail(cookie)
  194. #
  195. # # 查看全部 Cookie 信息
  196. cookies = await mgr.list_cookies()
  197. print(json.dumps(cookies, indent=2, ensure_ascii=False))
  198. if __name__ == "__main__":
  199. asyncio.run(main())