124 lines
3.5 KiB
JavaScript
124 lines
3.5 KiB
JavaScript
import puppeteer, { launch, Locator } from 'puppeteer'; // v23.0.0 or later
|
||
import fs from 'fs';
|
||
import { resolve } from 'path';
|
||
|
||
(async () => {
|
||
const browser = await launch({
|
||
headless: false,
|
||
});
|
||
const page = await browser.newPage();
|
||
const timeout = 5000;
|
||
page.setDefaultTimeout(timeout);
|
||
|
||
{
|
||
const targetPage = page;
|
||
await targetPage.goto('https://hlk.meiguanjia.net/#/login');
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
await Locator.race([targetPage.locator('input[placeholder="请输入您的手机号码')])
|
||
.setTimeout(timeout)
|
||
.click();
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
await Locator.race([targetPage.locator('input[placeholder="请输入您的手机号码')])
|
||
.setTimeout(timeout)
|
||
.fill('17770720274');
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
await Locator.race([targetPage.locator('input[placeholder="请输入登录密码')])
|
||
.setTimeout(timeout)
|
||
.click();
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
await Locator.race([targetPage.locator('input[placeholder="请输入登录密码')])
|
||
.setTimeout(timeout)
|
||
.fill('a123456');
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
await Locator.race([targetPage.locator('#agreement')])
|
||
.setTimeout(timeout)
|
||
.click();
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
await Locator.race([targetPage.locator('.login-form-button')])
|
||
.setTimeout(timeout)
|
||
.click();
|
||
await new Promise((resolve) => setTimeout(resolve, 3000));
|
||
}
|
||
{
|
||
const targetPage = page;
|
||
|
||
targetPage.on('console', (msg) => {
|
||
for (let i = 0; i < msg.args().length; ++i) {
|
||
console.log(`${msg.args()[i]}`);
|
||
}
|
||
});
|
||
|
||
// 获取浏览器中的 IndexedDB 数据
|
||
const result = await page.evaluate(async () => {
|
||
const databases = await indexedDB.databases();
|
||
const allData = [];
|
||
|
||
for (const db of databases) {
|
||
const databaseName = db.name;
|
||
|
||
// 打开数据库
|
||
const request = indexedDB.open(databaseName);
|
||
|
||
const databaseData = await new Promise((resolve, reject) => {
|
||
request.onsuccess = (event) => {
|
||
const db = event.target.result;
|
||
const transaction = db.transaction(db.objectStoreNames, 'readonly');
|
||
const objectStore = transaction.objectStore(db.objectStoreNames[0]);
|
||
const cursorRequest = objectStore.openCursor();
|
||
|
||
const storeData = [];
|
||
|
||
cursorRequest.onsuccess = (event) => {
|
||
const cursor = event.target.result;
|
||
if (cursor) {
|
||
storeData.push({ key: cursor.key, value: cursor.value });
|
||
cursor.continue();
|
||
} else {
|
||
resolve(storeData); // 执行 resolve,返回数据
|
||
}
|
||
};
|
||
|
||
cursorRequest.onerror = (event) => {
|
||
reject(event.target.error); // 发生错误时 reject
|
||
};
|
||
};
|
||
|
||
request.onerror = (event) => {
|
||
reject(event.target.error); // 发生错误时 reject
|
||
};
|
||
});
|
||
|
||
// 将数据库数据存入 allData
|
||
allData.push({
|
||
databaseName,
|
||
data: databaseData,
|
||
});
|
||
}
|
||
|
||
return allData;
|
||
});
|
||
const localStorageData = await page.evaluate(() => {
|
||
return JSON.stringify(localStorage); // 将 localStorage 转换为对象
|
||
});
|
||
fs.writeFileSync('./indexedDB.json', JSON.stringify(result));
|
||
fs.writeFileSync('./localStorage.json', localStorageData);
|
||
}
|
||
|
||
await browser.close();
|
||
})().catch((err) => {
|
||
console.error(err);
|
||
process.exit(1);
|
||
});
|