#!/usr/bin/env python3
"""
一次性登录脚本 - 保存完整的浏览器状态(包括 localStorage)
"""
import asyncio
from browser.browser import BrowserManager
async def one_time_login():
"""一次性登录,保存完整状态"""
print("="*60)
print("小红书一次性登录 - 保存完整浏览器状态")
print("="*60)
print("\n说明:")
print(" 这个脚本会保存完整的浏览器状态(cookies + localStorage)")
print(" 登录一次后,以后就不需要重复登录了")
print("="*60)
print("\n正在打开浏览器...")
browser = BrowserManager(headless=False)
await browser.start()
try:
page = await browser.new_page()
print("\n步骤 1:登录主站(www.xiaohongshu.com)")
print("-" * 60)
await page.goto("https://www.xiaohongshu.com", timeout=60000)
await page.wait_for_load_state("load", timeout=60000)
await asyncio.sleep(3)
# 检查主站登录状态
is_logged_in = await page.evaluate("""
() => {
const userElement = document.querySelector('.main-container .user .link-wrapper .channel');
return !!userElement;
}
""")
if not is_logged_in:
print(" ⚠ 主站未登录,请在浏览器中登录...")
print(" 等待登录完成...")
# 等待登录
max_wait = 300
start_time = asyncio.get_event_loop().time()
while asyncio.get_event_loop().time() - start_time < max_wait:
is_logged_in = await page.evaluate("""
() => {
const userElement = document.querySelector('.main-container .user .link-wrapper .channel');
return !!userElement;
}
""")
if is_logged_in:
print(" ✅ 主站登录成功!")
break
await asyncio.sleep(2)
else:
print(" ✗ 登录超时")
return
else:
print(" ✅ 主站已登录")
await asyncio.sleep(2)
print("\n步骤 2:登录创作中心(creator.xiaohongshu.com)")
print("-" * 60)
await page.goto("https://creator.xiaohongshu.com", timeout=60000)
await page.wait_for_load_state("load", timeout=60000)
await asyncio.sleep(3)
# 检查创作中心登录状态
current_url = page.url
if 'login' in current_url.lower():
print(" ⚠ 创作中心需要登录,请在浏览器中登录...")
print(" 等待登录完成...")
# 等待登录
max_wait = 300
start_time = asyncio.get_event_loop().time()
while asyncio.get_event_loop().time() - start_time < max_wait:
current_url = page.url
if 'login' not in current_url.lower():
print(" ✅ 创作中心登录成功!")
break
await asyncio.sleep(2)
else:
print(" ✗ 登录超时")
return
else:
print(" ✅ 创作中心已登录")
await asyncio.sleep(2)
print("\n步骤 3:验证发布页面")
print("-" * 60)
await page.goto("https://creator.xiaohongshu.com/publish/publish", timeout=60000)
await page.wait_for_load_state("load", timeout=60000)
await asyncio.sleep(3)
current_url = page.url
if 'login' in current_url.lower():
print(" ✗ 发布页面仍需要登录")
else:
print(" ✅ 发布页面可以访问")
print("\n" + "="*60)
print("登录完成!浏览器状态将在关闭时自动保存")
print("按 Ctrl+C 关闭浏览器并保存状态...")
print("="*60)
# 保持浏览器打开
while True:
await asyncio.sleep(1)
except KeyboardInterrupt:
print("\n\n正在保存浏览器状态...")
except Exception as e:
print(f"\n✗ 错误: {e}")
import traceback
traceback.print_exc()
finally:
# 关闭时会自动保存完整的 storage_state
await browser.close()
print("✓ 浏览器状态已保存到 storage_state.json")
print("\n" + "="*60)
print("现在可以测试发布功能了:")
print(" python simple_publish_test.py")
print("="*60)
if __name__ == "__main__":
try:
asyncio.run(one_time_login())
except KeyboardInterrupt:
print("\n程序已退出")