Files
nanocode/playwright-hotspots/scripts/weibo_send_v3.js
T
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

178 lines
5.1 KiB
JavaScript

/**
* 微博发送 V3 - 带详细错误检查
*/
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 = '🤖 自动化测试 ' + Date.now();
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 });
// 监听控制台日志
page.on('console', msg => {
if (msg.type() === 'error') {
console.log(' [页面错误]', msg.text());
}
});
// 加载 Cookie
console.log('🍪 加载 Cookie...');
const cookies = JSON.parse(fs.readFileSync(COOKIE_FILE, 'utf-8'));
await page.goto('https://weibo.com', { waitUntil: 'domcontentloaded' });
for (const c of cookies) {
try {
await page.setCookie({
name: c.name,
value: c.value,
domain: c.domain,
path: c.path || '/'
});
} catch (e) {}
}
// 访问主页
console.log('🔄 访问微博主页...');
await page.goto('https://weibo.com', { waitUntil: 'networkidle2' });
await delay(3000);
// 点击"写微博"
console.log('🖱️ 点击"写微博"...');
const allBtns = await page.$$('button, a, div[role="button"]');
for (const btn of allBtns) {
const text = await page.evaluate(el => el.textContent, btn);
if (text?.includes('写微博')) {
await btn.click();
console.log(' 已点击');
break;
}
}
await delay(2000);
await page.screenshot({ path: '/tmp/weibo_login/v3_compose.png' });
// 查找发布框
console.log('📝 查找发布框...');
let postBox = await page.$('textarea[placeholder*="有什么新鲜事"]');
if (!postBox) {
const textareas = await page.$$('textarea');
console.log(` 找到 ${textareas.length} 个 textarea`);
if (textareas.length > 0) {
postBox = textareas[0];
}
}
if (!postBox) {
throw new Error('未找到发布框');
}
// 输入内容
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/v3_typed.png' });
// 查找发送按钮
console.log('🔍 查找发送按钮...');
let sendBtn = null;
let sendText = '';
const allBtns2 = await page.$$('button, a, div[role="button"]');
for (const btn of allBtns2) {
const text = await page.evaluate(el => el.textContent, btn);
if (text?.includes('发送') || text?.includes('发布')) {
sendBtn = btn;
sendText = text.trim();
break;
}
}
if (!sendBtn) {
throw new Error('未找到发送按钮');
}
console.log(` 找到按钮: "${sendText}"`);
// 检查按钮是否可点击
const isEnabled = await page.evaluate(el => {
return !el.disabled && !el.getAttribute('disabled');
}, sendBtn);
console.log(` 按钮状态: ${isEnabled ? '可用' : '禁用'}`);
// 点击前截图
await page.screenshot({ path: '/tmp/weibo_login/v3_before_click.png' });
// 点击发送
console.log('🚀 点击发送...');
await sendBtn.click();
// 等待并检查页面变化
console.log('⏳ 等待响应...');
await delay(5000);
// 检查是否有错误提示
const errorMsg = await page.$eval('.error, .W_layer, .tips, [class*="error"]', el => el.textContent).catch(() => null);
if (errorMsg) {
console.log('⚠️ 页面提示:', errorMsg);
}
// 检查当前URL
const currentUrl = page.url();
console.log('🔗 当前URL:', currentUrl);
// 截图
await page.screenshot({ path: '/tmp/weibo_login/v3_after_send.png' });
console.log('📸 已截图');
// 检查最新微博
await page.goto('https://weibo.com/u/me?tabtype=weibo', { waitUntil: 'networkidle2' });
await delay(3000);
const posts = await page.evaluate(() => {
const items = Array.from(document.querySelectorAll('[class*="card"], [class*="item"]'));
return items.slice(0, 2).map(item => {
const text = item.textContent || '';
return text.substring(0, 100);
});
});
console.log('\n📱 最新微博:');
posts.forEach((p, i) => console.log(` [${i+1}] ${p.substring(0, 80)}...`));
if (posts.some(p => p.includes('自动化测试'))) {
console.log('\n✅ 发送成功!');
} else {
console.log('\n❌ 未找到刚发的微博,发送可能失败了');
}
} catch (error) {
console.error('❌ 错误:', error.message);
try {
await page.screenshot({ path: '/tmp/weibo_login/v3_error.png' });
} catch(e) {}
} finally {
await browser.close();
}
}
postWeibo().catch(console.error);