如何使用 puppeteer 保存身份验证?
How do i save the authentication with puppeteer?
我需要使用我的网络应用程序与电报机器人交谈。所以我决定做一个网络抓取,我不知道这是不是最好的策略。
当我尝试访问电报网络时,我需要进行身份验证然后继续聊天,但是如果我再次 运行 服务器,我需要再次手动进行身份验证。我试图保存 cookies,waitForTimeout 是 200 秒,所以我可以手动登录,但是 cookies 是一个空数组。
const puppeteer = require("puppeteer");
const fs = require("fs").promises;
(async () => {
const browser = await puppeteer.launch({ headless: false, executablePath: 'C:\Program Files\Google\Chrome\Application\chrome' });
const page = await browser.newPage();
await page.goto("https://web.telegram.org/k/");
console.log('before waiting');
await page.waitForTimeout(200000)
console.log('after waiting');
const cookies = await page.cookies();
await fs.writeFile('./coockie.json', JSON.stringify(cookies, null, 2));
// await browser.close();
})();
使用 puppeteer 在 Telegram 中进行身份验证非常困难。
第 1 部分收集数据
首先我们需要收集localStorage(甚至可能只有localStorage)。
如果我们还想收集所有 cookie,我们必须删除 page.cookies();
并使用 page._client.send('Network.getAllCookies');
代替。
运行这段代码收集必要的数据
import puppeteer from 'puppeteer';
import { setTimeout as wait } from 'timers/promises';
import fs from 'fs';
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://web.telegram.org/z/');
await wait(60000); //We need this in order to have time for qr-code authentication
const localStorageData = await page.evaluate(() => {
let json = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
json[key] = localStorage.getItem(key);
}
return json;
});
await fs.writeFile('localStorageData.json', JSON.stringify(localStorageData, null, 2), function(error, data){
if(error) throw error;
console.log(data);
});
const cookies = await page._client.send('Network.getAllCookies');
await fs.writeFile('cookies.json', JSON.stringify(cookies, null, 2), function(error, data){
if(error) throw error;
console.log(data);
});
await browser.close()
})();
第 2 部分使用收集的数据进行身份验证
在我们开始之前,我们需要打开我们的文件cookies.json。如果看起来像这样:
{
"cookies": [
{
//some data
},
{
//some data
}
]
}
那么必须手动修正成这个样子
[
{
//some data
},
{
//some data
}
]
ok,文件已更正,继续
运行此验证码
import puppeteer from 'puppeteer';
import { setTimeout as wait } from 'timers/promises';
import fs from 'fs';
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://web.telegram.org');// here without /z/, with z for some reason it doesn't work
await fs.readFile('./cookies.json', async (err, data) => {
if (err){
console.log(err);
} else {
let json = JSON.parse(data);
await page.setCookie(...json);
console.log(json);
//your code using json object
}
});
await fs.readFile('./localStorageData.json', async (err, data) => {
if (err){
console.log(err);
} else {
let json = JSON.parse(data);
await page.evaluate(localStorageData => {
localStorage.clear();
for (let key in localStorageData) {
console.log(key);
localStorage.setItem(key, localStorageData[key]);
}
}, json);
console.log(json);
}
});
await wait(50000);
await browser.close()
})();
就是这样。我建议你使用 playwright 而不是 puppeteer。更容易使用和更容易理解
我需要使用我的网络应用程序与电报机器人交谈。所以我决定做一个网络抓取,我不知道这是不是最好的策略。
当我尝试访问电报网络时,我需要进行身份验证然后继续聊天,但是如果我再次 运行 服务器,我需要再次手动进行身份验证。我试图保存 cookies,waitForTimeout 是 200 秒,所以我可以手动登录,但是 cookies 是一个空数组。
const puppeteer = require("puppeteer");
const fs = require("fs").promises;
(async () => {
const browser = await puppeteer.launch({ headless: false, executablePath: 'C:\Program Files\Google\Chrome\Application\chrome' });
const page = await browser.newPage();
await page.goto("https://web.telegram.org/k/");
console.log('before waiting');
await page.waitForTimeout(200000)
console.log('after waiting');
const cookies = await page.cookies();
await fs.writeFile('./coockie.json', JSON.stringify(cookies, null, 2));
// await browser.close();
})();
使用 puppeteer 在 Telegram 中进行身份验证非常困难。
第 1 部分收集数据
首先我们需要收集localStorage(甚至可能只有localStorage)。
如果我们还想收集所有 cookie,我们必须删除 page.cookies();
并使用 page._client.send('Network.getAllCookies');
代替。
运行这段代码收集必要的数据
import puppeteer from 'puppeteer';
import { setTimeout as wait } from 'timers/promises';
import fs from 'fs';
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://web.telegram.org/z/');
await wait(60000); //We need this in order to have time for qr-code authentication
const localStorageData = await page.evaluate(() => {
let json = {};
for (let i = 0; i < localStorage.length; i++) {
const key = localStorage.key(i);
json[key] = localStorage.getItem(key);
}
return json;
});
await fs.writeFile('localStorageData.json', JSON.stringify(localStorageData, null, 2), function(error, data){
if(error) throw error;
console.log(data);
});
const cookies = await page._client.send('Network.getAllCookies');
await fs.writeFile('cookies.json', JSON.stringify(cookies, null, 2), function(error, data){
if(error) throw error;
console.log(data);
});
await browser.close()
})();
第 2 部分使用收集的数据进行身份验证
在我们开始之前,我们需要打开我们的文件cookies.json。如果看起来像这样:
{
"cookies": [
{
//some data
},
{
//some data
}
]
}
那么必须手动修正成这个样子
[
{
//some data
},
{
//some data
}
]
ok,文件已更正,继续
运行此验证码
import puppeteer from 'puppeteer';
import { setTimeout as wait } from 'timers/promises';
import fs from 'fs';
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://web.telegram.org');// here without /z/, with z for some reason it doesn't work
await fs.readFile('./cookies.json', async (err, data) => {
if (err){
console.log(err);
} else {
let json = JSON.parse(data);
await page.setCookie(...json);
console.log(json);
//your code using json object
}
});
await fs.readFile('./localStorageData.json', async (err, data) => {
if (err){
console.log(err);
} else {
let json = JSON.parse(data);
await page.evaluate(localStorageData => {
localStorage.clear();
for (let key in localStorageData) {
console.log(key);
localStorage.setItem(key, localStorageData[key]);
}
}, json);
console.log(json);
}
});
await wait(50000);
await browser.close()
})();
就是这样。我建议你使用 playwright 而不是 puppeteer。更容易使用和更容易理解