{"id":867,"title":"TJ \u0438\u0449\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043b\u043e\u043d\u0433\u0440\u0438\u0434\u043e\u0432: \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u043e\u0440\u044b \u043c\u0438\u0440\u043e\u0432\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439","url":"\/redirect?component=advertising&id=867&url=https:\/\/tjournal.ru\/team\/458238-ishchem-redaktora-otdela-longridov-nuzhno-pisat-operativnye-razbory-o-mirovyh-sobytiyah&placeBit=1&hash=10de05da23b939f2b8da1ed8ceea3dd605601445820aa5aceb4d8550ae1880a3","isPaidAndBannersEnabled":false}
Никита-Никита

Пишем бота для TJ, VC и DTF

Все три сайта используют общую платформу, поэтому принцип написания ботов для каждого их этих сайтов одинаков. Все примеры в этой статье будут для TJ. Погнали!

1. Получение токена

Первое что нужно сделать это получить токен для API. Он нужен чтобы вызывать методы API, через которые и будет работать наш бот. Выглядит он примерно так:

a0b002cbb010d4b321ddd8cff46b58bf7e93f77dccf60b20fc950bd752511753

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

Идем в настройки профиля и прокручиваем в самый низ пока не увидим ссылку "Инструменты для разработчика".

Нажимаем на нее и получаем попап с токеном и ссылкой на документацию API.

(Если вместо попапа всплывает ошибка 214, то 24 часа еще не прошло с момента регистрации юзера и нужно ПОТЕРПЕТЬ!)

Сохраняем токен для последующего использования.

2. Запускаем приложение

Чтобы бот реагировал на какой-то текст или свое упоминание в комментарии, он должен видеть все комментарии. У платформы для этого существует механизм вебхуков. Из чего следует, что для написания бота нам нужен хостинг, а сам бот будет веб-приложением. Собственно хостинг и есть самое сложное в написании бота.

Для нашей разработки будем использовать сервис glitch. Он бесплатен (до определенного уровня), позволяет писать код прямо в браузере и получать работающее веб-приложение, что идеально для наших целей. В качестве альтернативы можно использовать любой другой хостинг.

Регистрируемся по ссылке и переходим в Dashboard.

Выбираем Minimal Node и попадаем в редактор.

Слева видим список файлов. Нас инетересует два файла: package.json и server.js. Окрывем package.json и заменяем

"dependencies": { "fastify": "^3.14.1", "fastify-formbody": "^5.0.0", "fastify-static": "^4.0.0", "handlebars": "^4.7.7", "point-of-view": "^4.14.0" },

(или что-то похожее) на

"dependencies": { "express": "^4.17.1", "request": "^2.88.2" },

Затем открываем server.js и заменяем его содержимое на:

'use strict'; const express = require('express') const bodyParser = require('body-parser') const app = express() const webappUrl = "https://" + process.env.PROJECT_NAME + ".glitch.me" // Главная страница, чтобы видеть, что все работает app.get('/', (req, res) => { res.send('( ͡° ͜ʖ ͡°)') }) // Эндпоинт для вебхука app.post('/new-comment/tj', bodyParser.json(), (req, res) => { res.send('') console.log(req.body.data) }) // Запускаем веб-сервер app.listen(process.env.PORT, () => { console.log(`Webapp started @ ${webappUrl}`) })

Код разбирать не буду ибо это не туториал по JS. Но в принципе даже незнакомому с JS человеку должно быть понятно что он делает.

В самом правом блоке с превью должен появится ( ° ʖ °) (редактор, зачем ты так с lenny face?). Это значит, что все идет по плану. Если нет, можно посмотреть в логах что не так.

Открываем логи (Tools > Logs), там должно быть что-то вроде

Webapp started @ https://bla-bla-rest.glitch.me

https://bla-bla-rest.glitch.me это адрес песочницы, по которому доступно наше приложение. Везде где дальше упоминается этот адрес, нужно заменять его на свой реальный адрес песочницы. На всякий случай можно проверить, что бот понимает запросы сгенерировав запрос вручную в командной строке через curl:

curl -X POST \ --header "Content-Type: application/json" \ --data '{"type":"new_comment","data":{"id":"5583467","reply_to":{"id":"00999","creator":{"id":"401824"}},"content":{"id":"342564"},"text":"Да"}}' \ https://bla-bla-rest.glitch.me/new-comment/tj

В логах должна появиться запись:

{ id: '5583467', reply_to: { id: '00999', creator: { id: '401824' } }, content: { id: '342564' }, text: 'Да' }

Это значит что все хорошо.

3. Подписываемся на комментарии

На этом этапе наш бот готов получать реальные комментарии с сайта. Для этого отправляем запрос к API:

curl -X POST \ --header 'X-Device-Token: YOUR_API_TOKEN' \ --form 'url=https://bla-bla-rest.glitch.me/new-comment/tj' \ --form 'event=new_comment' \ https://api.tjournal.ru/v1.8/webhooks/add

YOUR_API_TOKEN здесь это API токен, который мы получили в пункте 1. API ответит:

{"message":"","result":{"id":9999999,"url":"https:\/\/bla-bla-rest.glitch.me\/new-comment\/tj"}}

А в лог будут добавляться все комменты с сайта. Полюбуемся на процесс какое-то время и отпишемся от комментариев, чтобы не тратить бесплатную квоту почем зря:

curl -X POST \ --header 'X-Device-Token: YOUR_API_TOKEN' \ --form 'event=new_comment' \ https://api.tjournal.ru/v1.8/webhooks/del

4. Пишем ответы от имени бота

Добавим в наш код пару функций, которые позволят нам писать комментарии от имени бота:

const request = require('request') const apiToken = "YOUR_API_TOKEN"; // Подставить токен из пункта 1 function apiRequest(path, formData) { const url = "https://api.tjournal.ru/v1.8" + path console.log(url, formData) request( { url: url, formData: formData, method: "POST", headers: { 'X-Device-Token': apiToken } }, (err, res, body) => { if (err) { console.log(err); } }) } function comment(contentId, replyTo, text) { var formData = {'id': contentId, 'text': text}; if (replyTo) formData['reply_to'] = replyTo; apiRequest('/comment/add', formData) }

В функцию comment передается:

* contentId - идентификатор поста, к которому нужно оставить комментарий

* replyTo - опциональный идентификатор комментария на который отправляется ответ

* text - текст комментария

А так же добавим логику в эндпоинт для вебхуков:

var data = req.body.data; if (data.text.match(/^д+а+[!.]*$/i)) { comment(data.content.id, data.id, "Звезда") }

Новый код использует регулярное выражение и проверяет что комментарий состоит из слова "Да" в любом регистре, с любым количеством повторяющихся букв, с опциональными точками и восклицательными знаками. Вот варианты, которые подходят: "да", "Да", "дА", "ДА!!!", "ДААА", "ДДААААА..." и так далее. На подходящий комментарий он отвечает словом "Звезда". Можете заменить на другое слово по своему усмотрению.

В итоге код server.js будет выглядеть примерно следующим образом:

'use strict'; const express = require('express') const bodyParser = require('body-parser') const request = require('request') const app = express() const webappUrl = "https://" + process.env.PROJECT_NAME + ".glitch.me" const apiToken = "YOUR_API_TOKEN"; // Подставить токен из пункта 1 function apiRequest(path, formData) { const url = "https://api.tjournal.ru/v1.8" + path console.log(url, formData) request( { url: url, formData: formData, method: "POST", headers: { 'X-Device-Token': apiToken } }, (err, res, body) => { if (err) { console.log(err); } }) } function comment(contentId, replyTo, text) { var formData = {'id': contentId, 'text': text}; if (replyTo) formData['reply_to'] = replyTo; apiRequest('/comment/add', formData) } // Главная страница, чтобы видеть, что все работает app.get('/', (req, res) => { res.send('( ͡° ͜ʖ ͡°)') }) // Эндпоинт для вебхука app.post('/new-comment/tj', bodyParser.json(), (req, res) => { res.send('') var data = req.body.data; if (data.text.match(/^д+а+[!.]*$/i)) { comment(data.content.id, data.id, "Звезда") } }) // Запускаем веб-сервер app.listen(process.env.PORT, () => { console.log(`Webapp started @ ${webappUrl}`) })

Подписываемся на комментарии как мы делали выше (или как сделано в следующем пункте) и проверяем.

Отвечает!

5. Автоматическая подписка на комментарии

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

Пишем функцию, которая будет добавлять вебхук на комменты, а так же добавляем ее вызов при старте и с определенным интервалом:

function addWebhook() { apiRequest('/webhooks/add', { "event": "new_comment", "url": webappUrl + '/new-comment/tj' }) } // Запускаем веб-сервер app.listen(process.env.PORT, () => { addWebhook() // Добавляем вебхук при старте setInterval(addWebhook, 3*60000) // Повторяем каждые 3 минуты console.log(`Webapp started @ ${webappUrl}`) })

6. Заключение

За довольно короткое время у нас получился простейший бот, который отвечает на комменты с определенным содержанием. Ну не чудо ли?

Дальше можно расширять бота пока хватает фантазии.

Спасибо за внимание, до встречи в срачиках.

{ "author_name": "Никита-Никита", "author_type": "self", "tags": [], "comments": 69, "likes": 63, "favorites": 78, "is_advertisement": false, "subsite_label": "unknown", "id": 391642, "is_wide": true, "is_ugc": true, "date": "Sat, 05 Jun 2021 12:02:15 +0300", "is_special": false }
0
69 комментариев
Популярные
По порядку
Написать комментарий...
Вертикальный ихтиандр

Спасибо

8
Вертикальный ихтиандр

В карман не положишь

8

У меня на Google Cloud Functions, 5 рублей в месяц примерно

5
Неподвижный татарин
15

У меня на ДОН Google Cloud Functions, ДОН 5 рублей в ДОН месяц примерно

5
Возможный Даниль
1

Не в те места ставит

1

Что за платные подсайты? Что там за контент??? Как туда попасть?

1
Неподвижный татарин

¡¡¡Не вопи, ОЛДина!!!¡

8

Ты был в платных подсайтах???

1
Неподвижный татарин

Да, Гендальф, 3000 лет назад

5
Неподвижный татарин
3
Возможный Даниль
3

Что за платные ДОН подсайты? Что там ДОН за контент??? Как ДОН туда попасть?

2

Что за плятные ДОН пёдсяйты? Что тям ДОН за контент??? Кяк ДОН тюда пёпясть?

2
Неподвижный татарин

@Кхалиси бот

1

Самое сложное это придумать смешную идею для бота (жизнь то грустная)

4

Самое сложное это придумать смешную ДОН идею для бота (жизнь то ДОН грустная)

1
Возможный Даниль
0

Переиграл и уничтожил

1
Неподвижный татарин

@Дитковский вот как сделать бота для ТЖ. Очень просто и понятно. Скоро тебе про кэшер расскажу, если ты тут 100 лайков сделаешь

4
Возможный Даниль

@ДОНбот

0

Нихуя ты программист

4
Газовый теркин30см

ну это пограмирования надо знать, как попроще сломать очобу?

3
Неподвижный татарин

Башкой оп стену постучись, поможет

Не забудь закрепить эффект просмотром ребилда Евангелиона

3
Возможный Даниль
0

Башкой оп стену постучись, ДОН поможет

Не забудь закрепить ДОН эффект просмотром ребилда Евангелиона

0

Респект

3
Возможный Даниль
0
Неподвижный татарин

Почему request, а не node-fetch? Ладно, это наброс.

Но вот не наброс: зачем ты дудосишь сервера комитета, повторяя подписку на хук каждые 180сек? У них же и так «очереди ломаются» каждую неделю – ни ботам, ни пользователям вовремя ничего не приходит!

0

 Почему request, а не node-fetch?

Так и знал, что кто-то напишет. Вообще это мое первое приложение на nodejs, он выбран для простоты. Сам я на нем не пишу :) Искать какой модуль актуальный и достаточно простой тупо лень.

 дудосишь

 каждые 180сек

Кек. Если сервера комитета не могу выдержать один лишний запрос каждые 3 минуты, то это очень странно. 

7

 Почему request, а ДОН не node-fetch?

Так и ДОН знал, что кто-то напишет. ДОН Вообще это мое первое ДОН приложение на nodejs, он ДОН выбран для простоты. Сам ДОН я на нем не ДОН пишу :) Искать какой модуль ДОН актуальный и достаточно простой ДОН тупо лень.

 дудосишь

 каждые ДОН 180сек

Кек. Если сервера ДОН комитета не могу выдержать ДОН один лишний запрос каждые ДОН 3 минуты, то это ДОН очень странно. 

3

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Комментарий удален

Возможный Даниль
1
Неподвижный татарин

Это твой бот?

0
Неподвижный татарин

Могут выдержать, конечно. Просто каждый раз ты желаешь запрос на добавление хука. Да, каждый раз там новый хук не создаётся (у них id одинаковый), но очереди-то лагают и уведомления не приходють!!

0
Неподвижный татарин

Я бы пожалел, если честно, и сделал бы повторную подписку только если пять минут не было коммента от хука. Да, ночью бы постоянно переподписывалось, но это меньше, чем 500 раз в день

3

Это сильно усложнит данный туториал. У меня все несколько по-другому работает.

Если настаиваешь, могу потом исправить. Но не вижу особой проблемы и в текущем виде.

4
Неподвижный татарин

Ладно, ты прав

0
Неподвижный татарин

Да???

0
Неподвижный татарин

Звезда

0
Технический будильник

Анимешница - качек 0-1

0
Собственный меч

Анимешница - качек - кофемашина 0-1-0

3
Неподвижный татарин

Сча

4

А есть читы для тж

2

Попробуй такой: nsgbljh

0
Невидимый волк

Ждём потока говноботов на тж.

1

Ждём потока говноботов на ДОН тж.

2
Возможный Даниль
0
Израильский каякер

По идее он должен в конце предложения ставить «Дон», или это не то, о чем я думаю дон

0

Шикарно, спасибо огргмное, я как раз к этой теме вернулся, почти все уже по ноуд джс монгодб вспомнил, сейчас телеграм апи изучаю, но и тж попробую)

1

Репостнула в @Сделал сам 👍🏻👍🏻👍🏻

1
Возможный Даниль
0
Символический браслет

Нихуя не понятно, но очень интересно.

А если сделать бота, который будет послать нахуй - за призыв бота в подсайды будут банить?

1
Символический браслет

@Вахтёр привет, что скажешь?

0

Скорее всего забанят бота в официальных подсайтах

0
Символический браслет

Тирания, узурпаторство. Это ущемление прав и свобод ботов с ограниченными возможностями, боты не могут знать правил сайтов потому что не умеют читать. Может возле офиса комитета ещё и пандуса нет для колясок?!

0
Непонятный динозавр

Комментарий удален по просьбе пользователя

0
Возможный Даниль

Класс

0

так, че тут

0

сделаю бота дедка из Антикиллера, "ГРЁБАНЫЙ ЭКИБАСТУЗ"

0

Хочешь стать программистом? 

0

Что значит "хочешь"?

0

Блядь ну это отсылка же, ну ебана :( 

0

Она слишком неочевидна

0

А обращения к боту типа "@botname" тоже только регуляркой выцеплять?

0

Да.

/\[@12345\|/

12345 заменить на id юзера.

0

сенкс

0
Читать все 69 комментариев
null