• Как встроить puppeteer в node.js telegram bot?

    you_are_enot
    @you_are_enot
    Пограммист любитель
    Попробуй так

    const edua = require('./scrapper');
    
    bot.onText(/\/gr(.+)/, (msg, match) => {
        const chatId = msg.chat.id;
        const photo = 'grades.png';
    
        edua('login', 'password').then(() => {
            bot.sendPhoto(chatId, photo, { caption: ' ' });
        }).catch((err) => {
            console.log(err)
        });
    });


    const puppeteer = require('puppeteer');
    const eduEnu = 'https://edu.enu.kz/';
    const grades = 'https://edu.enu.kz/current_progress_gradebook_student';
    
    async function platonus(login, password) {
        const browser = await puppeteer.launch({ headless: false });
       const page = await platonus.browser.newPage();
       await page.setViewport({width: 1000, height: 500});
    
       await page.goto(eduEnu, { waitUntil: 'networkidle2' });
    
       await page.waitForSelector('input[name = "iin"]')
       await page.type('input[name = "iin"]', username, {delay: 1});
    
       await page.waitForSelector('input[name = "password"]')
       await page.type('input[name = "password"]', password, {delay: 1});
    
       const loginButton = await platonus.page.$x("//button[contains(text(), 'Кіру')]");
       await loginButton[0].click();
       await platonus.page.waitFor(5000);
    
       await page.goto(grades, { waitUntil: 'networkidle2' });
       await page.waitFor(2000);
       await page.screenshot({path: 'grades.png', fullPage: true});
    
       browser.close();
    };
    
    module.exports = platonus


    P.S. Использовать статические таймауты не особо хорошая идея. Лучше жди появления нужного элемента. Плюс, вместо waitUntil: 'networkidle2' при загрузке страницы лучше использовать domcontentloaded/
    Ответ написан
  • Как проксировать https запросы в node.js?

    you_are_enot
    @you_are_enot Автор вопроса
    Пограммист любитель
    Решение оказалось до смешного простым.
    https://github.com/nodejs/node-v0.x-archive/issues/2474

    var http = require('http');
    var https = require('https');
    
    var connectReq = http.request({ // establishing a tunnel
      host: 'localhost',
      port: 3128,
      method: 'CONNECT',
      path: 'github.com:443',
    }).on('connect', function(res, socket, head) {
      // should check res.statusCode here
      var req = https.get({
        host: 'github.com',
        socket: socket, // using a tunnel
        agent: false    // cannot use a default agent
      }, function(res) {
        res.setEncoding('utf8');
        res.on('data', console.log);
      });
    }).end();
    Ответ написан
    Комментировать
  • Как нажать Enter в Selenium?

    you_are_enot
    @you_are_enot Автор вопроса
    Пограммист любитель
    Решение оказалось проще, чем предполагалось. Достаточно в конце отправляемого сообщения добавить символ переноса строки "\n"
    Ответ написан
    Комментировать