#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
知乎登录状态调试脚本
用于检测知乎登录状态、验证cookies文件和直接检查登录状态
"""
import os
import sys
import json
import time
import logging
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# 添加项目根目录到路径以便导入
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
# 导入知乎认证模块
from zhihu_mcp_server.auth import ZhihuAuth
def check_cookies_file():
"""检查cookies文件状态"""
cookies_file = "zhihu_cookies.json"
if not os.path.exists(cookies_file):
logger.error(f"Cookies文件不存在: {cookies_file}")
return False
try:
with open(cookies_file, 'r', encoding='utf-8') as f:
cookies = json.load(f)
if not cookies:
logger.error("Cookies文件为空")
return False
logger.info(f"Cookies文件有效,包含 {len(cookies)} 个cookie项")
logger.info(f"Cookies文件大小: {os.path.getsize(cookies_file)} 字节")
# 输出一些关键cookie(如果存在)
important_cookies = ["z_c0", "SESSIONID", "_zap", "d_c0"]
for name in important_cookies:
for cookie in cookies:
if cookie.get("name") == name:
logger.info(f"找到关键cookie: {name} (过期时间: {cookie.get('expiry', 'N/A')})")
break
return True
except Exception as e:
logger.error(f"读取Cookies文件失败: {e}")
return False
def manual_check_login():
"""直接使用Selenium检查登录状态"""
logger.info("开始直接检查登录状态...")
try:
# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
driver = webdriver.Chrome(options=chrome_options)
logger.info(f"Chrome驱动创建成功,Session ID: {driver.session_id}")
# 加载cookies
driver.get("https://www.zhihu.com")
time.sleep(2)
cookies_file = "zhihu_cookies.json"
if os.path.exists(cookies_file):
with open(cookies_file, 'r', encoding='utf-8') as f:
cookies = json.load(f)
for cookie in cookies:
# 修正cookie格式
if 'domain' in cookie and cookie['domain']:
if cookie['domain'].startswith('.'):
cookie['domain'] = cookie['domain'][1:]
try:
driver.add_cookie(cookie)
except Exception as e:
logger.warning(f"添加cookie失败: {cookie.get('name', 'N/A')} - {e}")
# 刷新页面
driver.refresh()
time.sleep(3)
# 检查页面状态
current_url = driver.current_url
logger.info(f"当前URL: {current_url}")
# 检查是否有登录按钮
try:
login_btn = driver.find_element(By.XPATH, "//button[contains(text(), '登录/注册')]")
if login_btn.is_displayed():
logger.warning("检测到登录/注册按钮,可能未登录")
else:
logger.info("未发现登录/注册按钮")
except:
logger.info("未找到登录/注册按钮,可能已登录")
# 尝试访问设置页面
driver.get("https://www.zhihu.com/settings/profile")
time.sleep(3)
current_url = driver.current_url
logger.info(f"设置页面URL: {current_url}")
# 根据URL判断登录状态
if "settings" in current_url:
logger.info("可以访问设置页面,已登录")
login_status = True
else:
logger.warning(f"无法访问设置页面 (当前URL: {current_url}),可能未登录")
login_status = False
# 检查页面内容
page_source = driver.page_source
if "登录" in page_source and "注册" in page_source:
logger.warning("页面内容包含'登录'和'注册'关键词,可能未登录")
else:
logger.info("页面内容不含明显的登录/注册关键词")
# 尝试获取用户名等信息
try:
# 检查是否有用户头像
avatar_selectors = [
".Avatar",
".AppHeader-profile",
".UserAvatar",
".UserLink-link"
]
found_avatar = False
for selector in avatar_selectors:
try:
avatar = driver.find_element(By.CSS_SELECTOR, selector)
if avatar.is_displayed():
logger.info(f"检测到用户头像元素: {selector}")
found_avatar = True
break
except:
pass
if not found_avatar:
logger.warning("未检测到用户头像元素")
except Exception as e:
logger.error(f"检查用户信息元素失败: {e}")
# 关闭浏览器
driver.quit()
return login_status
except Exception as e:
logger.error(f"直接检查登录状态失败: {e}")
return False
def test_auth_module():
"""测试认证模块的登录状态检查"""
logger.info("开始测试认证模块...")
try:
# 创建认证管理器实例
auth = ZhihuAuth()
# 检查登录状态
login_status = auth.check_login_status()
logger.info(f"认证模块报告的登录状态: {'已登录' if login_status else '未登录'}")
# 获取用户信息
if login_status:
user_info = auth.get_user_info()
logger.info(f"用户信息: {user_info}")
# 关闭浏览器
auth.close()
return login_status
except Exception as e:
logger.error(f"测试认证模块失败: {e}")
return False
def main():
"""主函数"""
logger.info("===== 知乎登录状态调试开始 =====")
# 检查cookies文件
logger.info("----- 检查Cookies文件 -----")
cookies_valid = check_cookies_file()
logger.info(f"Cookies文件状态: {'有效' if cookies_valid else '无效'}")
# 直接检查登录状态
logger.info("----- 直接检查登录状态 -----")
direct_login = manual_check_login()
logger.info(f"直接检查登录状态: {'已登录' if direct_login else '未登录'}")
# 测试认证模块
logger.info("----- 测试认证模块 -----")
auth_login = test_auth_module()
logger.info(f"认证模块登录状态: {'已登录' if auth_login else '未登录'}")
# 总结
logger.info("===== 知乎登录状态调试总结 =====")
logger.info(f"1. Cookies文件: {'有效' if cookies_valid else '无效'}")
logger.info(f"2. 直接检查: {'已登录' if direct_login else '未登录'}")
logger.info(f"3. 认证模块: {'已登录' if auth_login else '未登录'}")
if direct_login and not auth_login:
logger.warning("发现不一致: 直接检查显示已登录,但认证模块报告未登录")
logger.warning("可能是认证模块的登录检测逻辑与实际不符")
elif not direct_login and auth_login:
logger.warning("发现不一致: 直接检查显示未登录,但认证模块报告已登录")
logger.warning("可能是认证模块的登录检测不够严格")
logger.info("===== 知乎登录状态调试结束 =====")
if __name__ == "__main__":
main()