Necesito hablar con un bot de Telegram, con mi aplicación web. Así que decidí hacer un web scrapping, no sé si es la mejor estrategia.
Cuando intento acceder a la web de Telegram, necesito autenticarme y luego continuar con el chat, pero si vuelvo a ejecutar el servidor, necesito autenticarme manualmente nuevamente. Traté de guardar las cookies, el tiempo de espera de espera es de 200 segundos, por lo que puedo iniciar sesión manualmente, pero las cookies llegaron como una matriz vacía.
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(); })();Es bastante difícil autenticarse en Telegram usando titiritero.
Parte 1 Recopilación de datos
En primer lugar, debemos recopilar localStorage (tal vez incluso solo localStorage). Si también queremos recopilar todas las cookies, tenemos que eliminar page.cookies(); y usa page._client.send('Network.getAllCookies'); en cambio.
Ejecute este código para recopilar los datos necesarios
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() })();Parte 2 Uso de los datos recopilados para la unificación
Antes de comenzar, debemos abrir nuestro archivo cookies.json. Si se ve así:
{ "cookies": [ { //some data }, { //some data } ] }entonces debe corregirse manualmente a este aspecto
[ { //some data }, { //some data } ]ok, el archivo ha sido corregido, adelante
Ejecute este código para autenticarse
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() })();Eso es todo. Te recomiendo que uses dramaturgo en lugar de titiritero. Mucho más fácil de usar y más comprensible