В реальном времени отказаться от чата с помощью Nodejs - PullRequest
3 голосов
/ 01 апреля 2019

Я хочу создать лом-приложение на NodeJs , из которого оно наблюдает в чате в реальном времени , и сохранять определенные сообщения в любой базе данных.?

Я хочу сделать следующее: я хочу получить данные из потоковых платформ чата и, таким образом, получить некоторую полезную информацию, которая помогает тем, кто выполняет потоковую службу;

Но я не знаю, как начать делать это с помощью NodeJs,

До сих пор я мог захватывать данные сообщений, однако Iне может отслеживать в режиме реального времени новые сообщения, какая-либо помощь в этом отношении?

Что я сделал до сих пор:

server.js

var express     = require('express');
var fs          = require('fs');
var request     = require('request');
var puppeteer = require('puppeteer');
var app         = express();

app.get('/', function(req, res){

    url = 'https://www.nimo.tv/live/6035521326';

    (async() => {

        const browser = await puppeteer.launch();

        const page = await browser.newPage();
        await page.goto(url);
        await page.waitForSelector('.msg-nickname');

        const messages = await page.evaluate(() => {
            return Array.from(document.querySelectorAll('.msg-nickname'))
                    .map(item => item.innerText);
        });

        console.log(messages);
    })();
    res.send('Check your console!')

});

app.listen('8081') 
console.log('Magic happens on port 8081'); 
exports = module.exports = app;

С помощью этого я получаю сообщения «Псевдонимы пользователей» и помещаю их в массив. Я хочу, чтобы мое приложение запускалось и автоматически получало новые Псевдонимы при вводе данных в чате. Помогите ли вы с этим вызовом?

Может мне понадобитсяиспользовать WebSocket

1 Ответ

4 голосов
/ 01 апреля 2019

Если возможно, вы должны использовать API, которым пользуется чат. Попробуйте открыть вкладку сети в инструментах разработчика Chrome и выяснить, какие сетевые запросы происходят.


Если это невозможно, вы можете использовать MutationObserver для отслеживания изменений DOM. Выставьте функцию через page.exposeFunction и затем прослушайте соответствующие изменения. Затем вы можете вставить полученные данные в базу данных.

Вот пример кода, с которого можно начать:

const puppeteer = require('puppeteer');
const { Client } = require('pg');

(async () => {
    const client = new Client(/* ... */);
    await client.connect(); // connect to database

    const browser = await puppeteer.launch({ headless: false });
    const [page] = await browser.pages();

    // call a handler when a mutation happens
    async function mutationListener(addedText) {
        console.log(`Added text: ${addedText}`);

        // insert data into database
        await client.query('INSERT INTO users(text) VALUES($1)', [addedText]);
    }
    page.exposeFunction('mutationListener', mutationListener);

    await page.goto('http://...');
    await page.waitForSelector('.msg-nickname');

    await page.evaluate(() => {
        // wait for any mutations inside a specific element (e.g. the chatbox)
        const observerTarget = document.querySelector('ELEMENT-TO-MONITOR');
        const mutationObserver = new MutationObserver((mutationsList) => {
            // handle change by checking which elements were added and which were deleted
            for (const mutation of mutationsList) {
                const { removedNodes, addedNodes } = mutation;
                // example: pass innerText of first added element to our mutationListener
                mutationListener(addedNodes[0].innerText);
            }
        });
        mutationObserver.observe( // start observer
            observerTarget,
            { childList: true }, // wait for new child nodes to be added/removed
        );
    });
})();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...