Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 17 additions & 6 deletions XianyuApis.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ def get_token(self, device_id, retry_count=0):
logger.error("重新登录失败,Cookie已失效")
logger.error("🔴 程序即将退出,请更新.env文件中的COOKIES_STR后重新启动")
sys.exit(1) # 直接退出程序

params = {
'jsv': '2.7.2',
'appKey': '34839810',
Expand All @@ -167,17 +167,24 @@ def get_token(self, device_id, retry_count=0):
data = {
'data': data_val,
}

# 简单获取token,信任cookies已清理干净
token = self.session.cookies.get('_m_h5_tk', '').split('_')[0]


# 🔧 调试信息:显示当前cookies状态
logger.debug(f"[调试] 重试次数: {retry_count}, _m_h5_tk token: {token[:20] if token else 'None'}...")
logger.debug(f"[调试] 关键cookies: cna={self.session.cookies.get('cna', 'Missing')[:10]}..., cookie2={self.session.cookies.get('cookie2', 'Missing')[:10]}...")

sign = generate_sign(params['t'], token, data_val)
params['sign'] = sign

try:
response = self.session.post('https://h5api.m.goofish.com/h5/mtop.taobao.idlemessage.pc.login.token/1.0/', params=params, data=data)
res_json = response.json()


# 🔧 调试信息:显示完整响应
logger.debug(f"[调试] API响应: {res_json}")

if isinstance(res_json, dict):
ret_value = res_json.get('ret', [])
# 检查ret是否包含成功信息
Expand All @@ -187,7 +194,11 @@ def get_token(self, device_id, retry_count=0):
if 'Set-Cookie' in response.headers:
logger.debug("检测到Set-Cookie,更新cookie") # 降级为DEBUG并简化
self.clear_duplicate_cookies()
time.sleep(0.5)

# 🔧 增加等待时间,避免风控(从0.5秒增加到2-3秒)
wait_time = 2 + retry_count # 第一次重试等2秒,第二次等3秒
logger.info(f"等待{wait_time}秒后重试...")
time.sleep(wait_time)
return self.get_token(device_id, retry_count + 1)
else:
logger.info("Token获取成功")
Expand Down
84 changes: 84 additions & 0 deletions debug_cookies.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""
闲鱼Cookie诊断工具
用于检查.env文件中的COOKIES_STR是否完整有效
"""
import os
from dotenv import load_dotenv

def check_cookies():
"""检查Cookie配置"""
print("=" * 60)
print("🔍 闲鱼Cookie诊断工具")
print("=" * 60)

# 加载.env文件
if not os.path.exists('.env'):
print("❌ 错误:.env文件不存在!")
print("💡 请从.env.example创建.env文件")
return False

load_dotenv()
cookies_str = os.getenv('COOKIES_STR', '')

if not cookies_str:
print("❌ 错误:COOKIES_STR为空!")
print("💡 请在.env文件中配置COOKIES_STR")
return False

print(f"\n📋 Cookie长度: {len(cookies_str)} 字符")
print(f"📋 Cookie片段: {cookies_str[:100]}...")

# 解析cookies
cookies = {}
for cookie in cookies_str.split('; '):
if '=' in cookie:
key, value = cookie.split('=', 1)
cookies[key.strip()] = value.strip()

print(f"\n📊 解析到 {len(cookies)} 个Cookie项\n")

# 检查关键cookies
required_cookies = {
'cna': '设备标识',
'_m_h5_tk': 'H5 Token',
'_m_h5_tk_enc': 'H5 Token加密',
'cookie2': 'Cookie2',
'unb': '用户标识',
'XSRF-TOKEN': 'CSRF Token'
}

missing_cookies = []
for cookie_name, description in required_cookies.items():
if cookie_name in cookies:
value = cookies[cookie_name]
# 只显示前20个字符
display_value = value[:20] + '...' if len(value) > 20 else value
print(f"✅ {cookie_name:15} ({description:15}): {display_value}")
else:
print(f"❌ {cookie_name:15} ({description:15}): 缺失")
missing_cookies.append(cookie_name)

print("\n" + "=" * 60)

if missing_cookies:
print(f"⚠️ 缺少 {len(missing_cookies)} 个关键Cookie: {', '.join(missing_cookies)}")
print("\n💡 解决方案:")
print("1. 打开浏览器访问 https://www.goofish.com/")
print("2. 登录你的闲鱼账号")
print("3. 按F12打开开发者工具")
print("4. 切换到Network标签")
print("5. 刷新页面")
print("6. 点击任意请求,在Headers中找到Cookie")
print("7. 复制完整的Cookie值,更新到.env文件的COOKIES_STR中")
return False
else:
print("✅ 所有关键Cookie都存在!")
print("\n💡 如果仍然出现错误,可能的原因:")
print("1. Cookie已过期 - 需要重新获取")
print("2. 触发了风控 - 等待几分钟后重试")
print("3. IP被限制 - 尝试更换网络环境")
return True

if __name__ == '__main__':
check_cookies()