Создание интерактивного рейтинга сообщества Steem-BRU. Часть 2. Телеграм бот brustat_bot

in Steem-BRU (BY-RU-UA)3 years ago (edited)

image.png

Итак, продолжаем. В прошлый раз я расписал планы и задачи, мы пока застряли на первой же подзадаче. Сегодня мне хочется дойти до первых результатов, чтобы иметь возможность запустить скрипт и получить результат.

Прошлый пост: https://steemit.com/hive-171319/@alexmove/sozdanie-interaktivnogo-reitinga-soobshestva-steem-bru-podschet-kommentariev-na-nodejs-dlya-steemit

Еше раз подзадачи:

  1. Необходимо получить список всех комментариев нужного пользователя.
  2. Определение нужной даты. Проверка даты комментария с нужным нам диапазоном.
  3. Подсчет нужного аккаунта
  4. Заведение рейтинга - сохранение данных для определения рейтинга.
  5. Проделывание для всего списка сообщества.
  6. Вызов данных по комментарию (затем в иделает сделать в боте)

Все оказалось проще.

        steem.api.getDiscussionsByComments({
            "start_author": "jinzo",
            "limit": 10
        }, function (err, result) {
            console.log(err, result);
        });

Достаточно лишь спокойно отнестись к задаче.
Мы получаем 100 комментариев последних.
Врядли же пользователь сможет написать больше 100 комментариев за неделю?
Хотя... по 20 комментариев каждый день - вот уже 140 комментариев.

Ну окей, пока мы будем ограничены количеством 100 комментариев для анализа. Все, кто будет писать больше 100 комментариев - можно вручную считать.

Первая задача выполнена! Идем дальше.

var now = moment();
var input = moment("2016-04-17T11:45:00Z");
var isThisWeek = (now.isoWeek() == input.isoWeek())

Ставим библиотеку https://momentjs.com/
Надо скачать файл и устанавливаем библиотеку в nodejs:

npm install moment --save

и в скрипте добавляем для подключения библиотеки:

const moment= require('moment');

Задача вторая выполнена.

как и ожидается то появляются чисто технические моменты
например у Димы подсчет со среды до среды - а мне проще сделать чтобы в течении недели был подсчет. Т.е. с понедельника по понедельник
Думаю что пока буду делать как проще, а потом уже после внедрения можно будет менять.

Идем дальше.

Хочется сразу что-то подключить к боту.
Читаю инструкцию https://habr.com/ru/post/510760/

Подключаю бота!

const TelegramBot = require('node-telegram-bot-api');

// replace the value below with the Telegram token you receive from @BotFather
const token = 'YOUR_TELEGRAM_BOT_TOKEN';

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true});

// Matches "/echo [whatever]"
bot.onText(//echo (.+)/, (msg, match) => {
// 'msg' is the received Message from Telegram
// 'match' is the result of executing the regexp above on the text content
// of the message

const chatId = msg.chat.id;
const resp = match[1]; // the captured "whatever"

// send back the matched "whatever" to the chat
bot.sendMessage(chatId, resp);
});

// Listen for any kind of message. There are different kinds of
// messages.
bot.on('message', (msg) => {
const chatId = msg.chat.id;

// send a message to the chat acknowledging receipt of their message
bot.sendMessage(chatId, 'Received your message');
});

Фух, прошло пару часов:

js```
const TelegramBot = require('node-telegram-bot-api');
var stat = 0;
const steem = require('steem');

var alexmove_stat;
// replace the value below with the Telegram token you receive from @BotFather
const token = 'фівфів:фівіфв-3h5Q8';

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true});

// Matches "/echo [whatever]"
bot.onText(//echo (.+)/, (msg, match) => {
// 'msg' is the received Message from Telegram
// 'match' is the result of executing the regexp above on the text content
// of the messag
/// alexmove_stat = comments('alexmove');
alexmove_stat = sdfsdfsd;
bot.sendMessage(chatId, 'Введите имя пользователя, количество комментариев которого вы хотите узнать. Количество комментариев на этой неделе. Внимание - считается с понедельника!');

});

function comments(author){
steem.api.getDiscussionsByComments({
"start_author": author,
"limit": 100
}, function (err, result) {
// console.log(err, result);

        if (err === null) {
            var i, len = result.length;
            for (i = 0; i < len; i++) {
                var discussion = result[i];
                console.log(discussion.created);
                cost moment= require('moment');
                var now = moment();
                var input = moment(discussion.created);
                var isThisWeek = (now.isoWeek() == input.isoWeek())
                console.log(isThisWeek);
                if (isThisWeek === true) {
                  stat=stat+1;
                }
            }
        } else {
            console.log(err);
        }
        
    });
    return stat;

}

// Listen for any kind of message. There are different kinds of
// messages.
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const { id } = msg.chat;

alexmove_stat = comments('alexmove');

// send a message to the chat acknowledging receipt of their message
// bot.sendMessage(chatId, 'Введите имя пользователя, количество комментариев которого вы хотите узнать. Количество комментариев на этой неделе. Внимание - считается с понедельника!');
//if (msg.text === "alexmove")
//{ stat = alexmove_stat; }

//comments(msg.text);
// bot.sendMessage(chatId, JSON.stringify(msg));
//bot.sendMessage(chatId, alexmove_stat);
//stat = 0;
bot.sendMessage(chatId, alexmove_stat);

steem.api.getDiscussionsByComments({
"start_author": author,
"limit": 100
}, function (err, result) {
// console.log(err, result);

        if (err === null) {
            var i, len = result.length;
            for (i = 0; i < len; i++) {
                var discussion = result[i];
                console.log(discussion.created);
                cost moment= require('moment');
                var now = moment();
                var input = moment(discussion.created);
                var isThisWeek = (now.isoWeek() == input.isoWeek())
                console.log(isThisWeek);
                if (isThisWeek === true) {
                  stat=stat+1;
                }
            }
        } else {
            console.log(err);
        }
        
        bot.sendMessage(chatId, stat);

    });a

});

js```

Наброски телеграмм бота:

js```
const TelegramBot = require('node-telegram-bot-api');
const steem = require('steem');

// replace the value below with the Telegram token you receive from @BotFather
const token = '1997331759:AAE3uKEq-_QRvsQ6To3_q7zg5bE5M-3h5Q8';

// Create a bot that uses 'polling' to fetch new updates
const bot = new TelegramBot(token, {polling: true});

// Matches "/echo [whatever]"
bot.onText(//echo (.+)/, (msg, match) => {
// 'msg' is the received Message from Telegram
// 'match' is the result of executing the regexp above on the text content
// of the messag

});

// Listen for any kind of message. There are different kinds of
// messages.
bot.on('message', (msg) => {
const chatId = msg.chat.id;
const { id } = msg.chat;

// send a message to the chat acknowledging receipt of their message

if (msg.text === "alexmove")
{

bot.sendMessage(chatId, 'Статистика alexmove: 10 комментариев за неделю');

}
else bot.sendMessage(chatId, `Введите имя пользователя, количество комментариев которого вы хотите узнать. Количество комментариев на этой неделе. Внимание - считается с понедельника!

Пока работает только для:
alexmove
чтобы добавить себя, напишите @alexmove

Внимание!!!! Это прототип! Т.е. показывает как будет работать, пока не подключено к скрипту напрямую! Подробности: https://steemit.com/hive-171319/@alexmove/sozdanie-interaktivnogo-reitinga-soobshestva-steem-bru-podschet-kommentariev-na-nodejs-dlya-steemit`);

});
js```

Некоторые наброски для телеграмм бота готовы. Теперь, собственно, можно сделать тоже самое полноценно отдельно. Нужен запуск списка пользователей и/или сохранению в некую базу.

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

Прототип телеграм-бота для определения рейтинга: @brustat_bot
http://t.me/brustat_bot

Очень близко к реализации.
Продолжение следует.

Первый пост: https://steemit.com/hive-171319/@alexmove/sozdanie-interaktivnogo-reitinga-soobshestva-steem-bru-podschet-kommentariev-na-nodejs-dlya-steemit

Sort:  
 3 years ago 

Можно тестить?)

Loading...

Coin Marketplace

STEEM 0.31
TRX 0.11
JST 0.033
BTC 64550.89
ETH 3156.32
USDT 1.00
SBD 4.30