103 lines
3.3 KiB
JavaScript
103 lines
3.3 KiB
JavaScript
|
|
const { chromium } = require('playwright');
|
||
|
|
const fs = require('fs');
|
||
|
|
const path = require('path');
|
||
|
|
|
||
|
|
async function solveCaptchaAndSavePdf() {
|
||
|
|
// 启动手机模式浏览器
|
||
|
|
const browser = await chromium.launch({ headless: true });
|
||
|
|
const context = await browser.newContext({
|
||
|
|
viewport: { width: 375, height: 812 },
|
||
|
|
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/1AE148',
|
||
|
|
deviceScaleFactor: 3,
|
||
|
|
isMobile: true,
|
||
|
|
hasTouch: true
|
||
|
|
});
|
||
|
|
|
||
|
|
const page = await context.newPage();
|
||
|
|
|
||
|
|
try {
|
||
|
|
// 访问目标网页
|
||
|
|
console.log('正在访问网页...');
|
||
|
|
await page.goto('https://www.schrss.org.cn/scggfwApp/cbzmyz/toPage.do?code=Au4JWUwufsRpfGrEp42G');
|
||
|
|
await page.waitForTimeout(3000);
|
||
|
|
|
||
|
|
console.log('页面标题:', await page.title());
|
||
|
|
|
||
|
|
// 获取页面快照,查看验证码元素
|
||
|
|
const snapshot = await page.content();
|
||
|
|
console.log('页面内容长度:', snapshot.length);
|
||
|
|
|
||
|
|
// 查找验证码图片
|
||
|
|
const captchaImg = await page.locator('img').first();
|
||
|
|
if (captchaImg) {
|
||
|
|
const captchaPath = path.join(__dirname, 'captcha_verify.png');
|
||
|
|
await captchaImg.screenshot({ path: captchaPath });
|
||
|
|
console.log('验证码已保存到:', captchaPath);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 获取验证码图片的base64
|
||
|
|
const captchaBase64 = await page.evaluate(() => {
|
||
|
|
const img = document.querySelector('img');
|
||
|
|
if (img) {
|
||
|
|
const canvas = document.createElement('canvas');
|
||
|
|
const ctx = canvas.getContext('2d');
|
||
|
|
canvas.width = img.width;
|
||
|
|
canvas.height = img.height;
|
||
|
|
ctx.drawImage(img, 0, 0);
|
||
|
|
return canvas.toDataURL('image/png');
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
});
|
||
|
|
|
||
|
|
if (captchaBase64) {
|
||
|
|
const base64Data = captchaBase64.replace(/^data:image\/\w+;base64,/, '');
|
||
|
|
fs.writeFileSync(path.join(__dirname, 'captcha_base64.png'), Buffer.from(base64Data, 'base64'));
|
||
|
|
console.log('验证码base64图片已保存');
|
||
|
|
}
|
||
|
|
|
||
|
|
// 打印页面中所有图片的src
|
||
|
|
const imgSrcs = await page.evaluate(() => {
|
||
|
|
return [...document.querySelectorAll('img')].map(img => ({
|
||
|
|
src: img.src,
|
||
|
|
alt: img.alt,
|
||
|
|
width: img.width,
|
||
|
|
height: img.height
|
||
|
|
}));
|
||
|
|
});
|
||
|
|
console.log('页面中的图片:', JSON.stringify(imgSrcs, null, 2));
|
||
|
|
|
||
|
|
// 查找输入框和提交按钮
|
||
|
|
const inputs = await page.locator('input').all();
|
||
|
|
console.log('输入框数量:', inputs.length);
|
||
|
|
|
||
|
|
const buttons = await page.locator('button').all();
|
||
|
|
console.log('按钮数量:', buttons.length);
|
||
|
|
|
||
|
|
// 查找表单元素
|
||
|
|
const formInfo = await page.evaluate(() => {
|
||
|
|
const form = document.querySelector('form');
|
||
|
|
if (form) {
|
||
|
|
return {
|
||
|
|
action: form.action,
|
||
|
|
method: form.method
|
||
|
|
};
|
||
|
|
}
|
||
|
|
return null;
|
||
|
|
});
|
||
|
|
console.log('表单信息:', formInfo);
|
||
|
|
|
||
|
|
// 等待一下,确保页面完全加载
|
||
|
|
await page.waitForTimeout(2000);
|
||
|
|
|
||
|
|
// 获取完整的页面快照
|
||
|
|
const bodyHtml = await page.evaluate(() => document.body.innerHTML);
|
||
|
|
console.log('Body HTML (前2000字符):', bodyHtml.substring(0, 2000));
|
||
|
|
|
||
|
|
} catch (error) {
|
||
|
|
console.error('错误:', error.message);
|
||
|
|
} finally {
|
||
|
|
await browser.close();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
solveCaptchaAndSavePdf();
|