/** * 使用 Cookie 登录微博 V2 - 直接访问发布页面 */ const puppeteer = require('puppeteer-core'); const { getLaunchOptions } = require('../config/browser'); const fs = require('fs'); const COOKIE_FILE = '/home/ubuntu/weibo_cookies.txt'; const TEST_CONTENT = '这是一条来自自动化脚本的测试微博 🤖 #测试 #自动化 ' + new Date().toLocaleString(); const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms)); async function postWeibo() { console.log('🌐 正在启动浏览器...'); const browser = await puppeteer.launch({ ...getLaunchOptions(), headless: true, }); try { const page = await browser.newPage(); await page.setViewport({ width: 1280, height: 900 }); // 读取 Cookie console.log('🍪 正在加载 Cookie...'); const cookieContent = fs.readFileSync(COOKIE_FILE, 'utf-8'); const cookies = JSON.parse(cookieContent); console.log(`📋 加载了 ${cookies.length} 个 Cookie`); // 先访问微博并设置 cookie await page.goto('https://weibo.com', { waitUntil: 'domcontentloaded', timeout: 60000 }); // 设置 Cookie for (const cookie of cookies) { try { await page.setCookie({ name: cookie.name, value: cookie.value, domain: cookie.domain, path: cookie.path || '/', secure: cookie.secure || false, httpOnly: cookie.httpOnly || false, ...(cookie.expirationDate && { expires: Math.floor(cookie.expirationDate) }) }); } catch (e) {} } console.log('✅ Cookie 设置完成'); // 访问个人主页验证登录 console.log('🔄 访问个人主页验证登录...'); await page.goto('https://weibo.com/u/me', { waitUntil: 'networkidle2', timeout: 60000 }); await delay(3000); await page.screenshot({ path: '/tmp/weibo_login/profile_page.png' }); console.log('📸 已截图个人主页'); // 获取页面标题和URL const title = await page.title(); const url = page.url(); console.log(`📄 页面标题: ${title}`); console.log(`🔗 当前URL: ${url}`); // 检查是否在登录页面 if (url.includes('login') || title.includes('登录')) { console.log('❌ Cookie 已过期,需要重新登录'); return; } // 尝试打开发布器 console.log('\n📝 尝试打开发布器...'); await page.goto('https://weibo.com/u/me?tabtype=weibo', { waitUntil: 'networkidle2', timeout: 60000 }); await delay(3000); // 查找发布框 - 尝试多种选择器 const selectors = [ 'textarea[title="微博内容"]', '.W_input', '[node-type="textEl"]', 'textarea[placeholder*="有什么新鲜事"]', 'textarea[placeholder*="想说什么"]', '[class*="publish"] textarea', '[class*="post"] textarea', ]; let postBox = null; for (const sel of selectors) { postBox = await page.$(sel); if (postBox) { console.log(`✅ 找到发布框: ${sel}`); break; } } // 如果没找到,尝试点击"发布"按钮 if (!postBox) { console.log('🖱️ 尝试点击发布按钮...'); // 通过文本内容查找按钮 const allLinks = await page.$$('a, button, div[role="button"]'); for (const link of allLinks) { const text = await page.evaluate(el => el.textContent, link); if (text && (text.includes('发布') || text.includes('发微博'))) { console.log(` 找到发布按钮: "${text.trim()}"`); await link.click(); await delay(2000); break; } } // 再次查找发布框 for (const sel of selectors) { postBox = await page.$(sel); if (postBox) break; } } if (postBox) { console.log('✅ 准备发送微博...'); // 聚焦并输入 await postBox.click(); await delay(500); await postBox.type(TEST_CONTENT, { delay: 30 }); console.log('✍️ 已输入:', TEST_CONTENT); await delay(1000); await page.screenshot({ path: '/tmp/weibo_login/before_send.png' }); // 查找发送按钮 let sendBtn = null; // 先尝试标准选择器 const sendSelectors = [ 'a[title="发布"]', '[action-type="submit"]', '[node-type="submit"]', '.W_btn_a', 'button[type="submit"]', ]; for (const sel of sendSelectors) { sendBtn = await page.$(sel); if (sendBtn) { const text = await page.evaluate(el => el.textContent, sendBtn); console.log(` 找到发送按钮: "${text?.trim()}" (${sel})`); break; } } // 如果没找到,通过文本搜索 if (!sendBtn) { const allBtns = await page.$$('a, button, div[role="button"]'); for (const btn of allBtns) { const text = await page.evaluate(el => el.textContent, btn); if (text && (text.includes('发送') || text.includes('发布'))) { console.log(` 通过文本找到按钮: "${text.trim()}"`); sendBtn = btn; break; } } } if (sendBtn) { await sendBtn.click(); console.log('🚀 已点击发送!'); await delay(5000); await page.screenshot({ path: '/tmp/weibo_login/after_send.png' }); console.log('📸 已截图保存结果'); // 检查是否发送成功 const success = await page.$eval('.success, .W_tips, [class*="success"]', el => el.textContent).catch(() => null); if (success) { console.log('✅ 发送结果:', success); } console.log('\n🎉 测试微博发送流程完成!'); } else { console.log('⚠️ 未找到发送按钮,请查看 /tmp/weibo_login/before_send.png'); } } else { console.log('⚠️ 未找到发布框'); await page.screenshot({ path: '/tmp/weibo_login/no_postbox.png' }); } } catch (error) { console.error('❌ 错误:', error.message); try { await page.screenshot({ path: '/tmp/weibo_login/error.png' }); } catch (e) {} } finally { await browser.close(); } } postWeibo().catch(console.error);