#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
知乎手动登录脚本
用于首次登录并保存cookies,后续可自动登录
"""
import sys
import os
import time
import json
# 添加项目路径到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from zhihu_mcp_server.auth import ZhihuAuth
def manual_login_and_save_cookies():
"""手动登录知乎并保存cookies"""
print("🚀 开始知乎手动登录流程")
print("=" * 60)
try:
# 创建认证管理器
print("📱 正在初始化浏览器...")
auth_manager = ZhihuAuth()
# 设置Chrome浏览器为可见模式(用户可以看到浏览器窗口)
if hasattr(auth_manager, '_setup_driver'):
# 重新设置驱动为可见模式
auth_manager.driver = auth_manager._setup_driver()
if not auth_manager.driver:
print("❌ 无法启动Chrome浏览器")
print("💡 请确保已安装Chrome浏览器和ChromeDriver")
return False
print("✅ 浏览器启动成功")
# 打开知乎登录页面
print("🌐 正在打开知乎登录页面...")
auth_manager.driver.get("https://www.zhihu.com/signin")
time.sleep(3)
print("\n" + "=" * 60)
print("📋 请在浏览器中完成知乎登录操作")
print("=" * 60)
print("🔍 支持的登录方式:")
print(" 1. 手机号 + 验证码登录(推荐)")
print(" 2. 手机号 + 密码登录")
print(" 3. 微信扫码登录")
print(" 4. QQ登录")
print(" 5. 微博登录")
print("\n⏰ 系统将等待最多300秒(5分钟)检测登录完成")
print("💡 登录成功后,cookies将自动保存,后续无需重复登录")
print("=" * 60)
# 等待用户手动登录,检测间隔为5秒
login_success = False
max_wait_time = 300 # 300秒 = 5分钟
check_interval = 5 # 每5秒检测一次
for i in range(0, max_wait_time, check_interval):
try:
# 检查当前URL和页面内容来判断是否登录成功
current_url = auth_manager.driver.current_url
page_source = auth_manager.driver.page_source
# 检查是否已经离开登录页面
if "signin" not in current_url and "login" not in current_url:
print(f"\n✅ 检测到URL变化: {current_url}")
login_success = True
break
# 检查是否还在登录页面但已经登录
if "SignFlowHomepage" not in page_source:
print(f"\n✅ 检测到页面结构变化,可能已登录")
login_success = True
break
# 显示等待进度
remaining_time = max_wait_time - i - check_interval
print(f"\r⏳ 等待登录中... 剩余时间: {remaining_time}秒", end="", flush=True)
time.sleep(check_interval)
except Exception as e:
print(f"\n⚠️ 检测登录状态时出现异常: {e}")
time.sleep(check_interval)
continue
print("\n") # 换行
if not login_success:
print("⏰ 登录等待超时(5分钟),请重新运行脚本")
auth_manager.close()
return False
# 验证登录状态
print("🔍 正在验证登录状态...")
time.sleep(3) # 等待页面完全加载
# 尝试访问用户设置页面来确认登录
try:
auth_manager.driver.get("https://www.zhihu.com/settings/profile")
time.sleep(5)
current_url = auth_manager.driver.current_url
if "settings" in current_url:
print("✅ 登录验证成功!可以访问用户设置页面")
verified_login = True
else:
print("❌ 登录验证失败,无法访问用户设置页面")
verified_login = False
except:
print("⚠️ 无法验证登录状态,但将尝试保存cookies")
verified_login = True # 继续尝试保存cookies
if verified_login:
# 保存cookies
print("💾 正在保存登录cookies...")
try:
cookies = auth_manager.driver.get_cookies()
cookies_file = "zhihu_cookies.json"
with open(cookies_file, 'w', encoding='utf-8') as f:
json.dump(cookies, f, ensure_ascii=False, indent=2)
print(f"✅ Cookies已保存到: {cookies_file}")
print(f"📊 保存了 {len(cookies)} 个cookie项")
# 获取用户信息
print("👤 正在获取用户信息...")
try:
auth_manager.driver.get("https://www.zhihu.com/settings/profile")
time.sleep(3)
user_info = {
"login_time": time.strftime("%Y-%m-%d %H:%M:%S"),
"platform": "知乎",
"status": "已登录"
}
# 尝试获取用户名
try:
username_selectors = [
"h1.css-sar5vy",
".css-1voxft1",
".ProfileHeader-name",
"h1"
]
for selector in username_selectors:
try:
username_element = auth_manager.driver.find_element("css selector", selector)
if username_element and username_element.text:
user_info["username"] = username_element.text
break
except:
continue
except:
pass
print(f"👤 用户信息: {json.dumps(user_info, ensure_ascii=False, indent=2)}")
except Exception as e:
print(f"⚠️ 获取用户信息失败: {e}")
except Exception as e:
print(f"❌ 保存cookies失败: {e}")
auth_manager.close()
return False
# 关闭浏览器
print("🔄 关闭浏览器...")
auth_manager.close()
print("\n" + "=" * 60)
print("🎉 知乎手动登录完成!")
print("=" * 60)
print("✅ 登录状态: 成功")
print("✅ Cookies保存: 完成")
print("💡 后续使用:")
print(" - 知乎API服务器将自动使用保存的cookies")
print(" - 无需重复登录,除非cookies过期")
print(" - 可以开始使用知乎发布功能")
print("=" * 60)
return True
except Exception as e:
print(f"❌ 登录流程异常: {e}")
if 'auth_manager' in locals() and auth_manager:
auth_manager.close()
return False
def main():
"""主函数"""
success = manual_login_and_save_cookies()
if success:
print("\n🚀 接下来可以:")
print(" 1. 启动知乎API服务器: python zhihu_http_api_server.py")
print(" 2. 测试API接口: python test_zhihu_updated.py")
print(" 3. 集成到多平台发布工具")
else:
print("\n❌ 登录失败,请重新运行脚本")
print("💡 常见问题:")
print(" - 确保Chrome浏览器已安装")
print(" - 确保网络连接正常")
print(" - 在浏览器中完成人机验证")
if __name__ == "__main__":
main()