{"id":778,"title":"\u041f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0434 \u043f\u0435\u0440\u0435\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0430\u043b\u044c\u0431\u043e\u043c\u044b PJ Harvey","url":"\/redirect?component=advertising&id=778&url=https:\/\/tjournal.ru\/umg\/409290&hash=1d76a9de76197182b829a3caf8c744f76e1c6c2e28cf9d9780881819d0250715","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": 76, "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

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

Ответить
5

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

Ответить

Изящный Данила

Лига
15
Ответить
5

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

Ответить

Ответный каякер

Лига
1
Ответить
1

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

Ответить
1

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

Ответить

Изящный Данила

Иван
8

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

Ответить
1

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

Ответить

Изящный Данила

Иван
5

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

Ответить

Изящный Данила

Изящный
3
Ответить

Ответный каякер

Иван
3
Ответить
2

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

Ответить
2

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

Ответить

Изящный Данила

Дон
1

@Кхалиси бот

Ответить
4

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

Ответить
1

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

Ответить

Ответный каякер

Азат
0
Ответить
1

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

Ответить

Изящный Данила

4

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

Ответить

Ответный каякер

Изящный
0

@ДОНбот

Ответить
4

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

Ответить

Нравственный волк

3

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

Ответить
3

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

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

Ответить

Ответный каякер

Изящный
0
Ответить
0

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

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

Ответить
3

Респект

Ответить

Ответный каякер

Сергей
0
Ответить

Изящный Данила

0

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

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

Ответить
7

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

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

 дудосишь

 каждые 180сек

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

Ответить
3

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

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

 дудосишь

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

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

Ответить

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ответный каякер

Многолетний
1
Ответить

Изящный Данила

Ответный
0

Это твой бот?

Ответить

Изящный Данила

Многолетний
0

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

Ответить

Изящный Данила

Изящный
3

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

Ответить
4

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

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

Ответить

Изящный Данила

Многоле…
0

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

Ответить

Изящный Данила

Изящный
0

Да???

Ответить
0

Звезда

Ответить

Настоящий кофе

Многолетний
0

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

Ответить

Примитивный Влад

Настоящ…
3

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

Ответить
4

Сча

Ответить
2

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

Ответить
0

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

Ответить

Подлинный химик

1

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

Ответить
2

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

Ответить

Ответный каякер

Подлинный
0
Ответить

Автоматический теркин30см

Ответный
0

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

Ответить
1

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

Ответить
1

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

Ответить

Ответный каякер

alien
0
Ответить

Уличный Филипп

1

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

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

Ответить

Уличный Филипп

Уличный
0

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

Ответить
0

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

Ответить

Уличный Филипп

Многолетний
0

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

Ответить

Мужской щит

0

Статистику нужно ещё захреначить, пример  Chart.js, https://www.chartjs.org/docs/latest/charts/line.html

Ответить

Ответный каякер

0

Класс

Ответить
0

так, че тут

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

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

Ответить
0

Да.

/\[@12345\|/

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

Ответить
Читать все 69 комментариев
Обсуждаемое
Новости
В Таганроге при обыске у сотрудника ГИБДД нашли его портрет в форме маршала и с орденом «Победа»
Такие награды были у Сталина, Жукова и военачальников времён Великой Отечественной войны.
Спорт
Российские спортсмены выиграли шесть медалей за четвёртый день Олимпиады в Токио
По общему числу наград Россия сравнялась с хозяйкой Игр Японией.
Новости
Роскомнадзор потребовал от YouTube заблокировать каналы соратников Навального: Волкова, Албурова и Милова
По мнению Генпрокуратуры Волков распространяет «недостоверную общественно значимую информацию под видом достоверных сообщений».
Популярное за три дня
Интернет
«Вы продаёте рыбов? Красивое...»: фраза из абсурдной картинки с котами стала мемом
Просто показываю.
Новости
«Дети непонятно какие»: в Петербурге женщина пыталась выгнать с площадки детей с аутизмом. СК проведёт проверку
Женщине пришлось удалить страницу в «ВКонтакте» из-за наплыва гневных сообщений.
Беларусь
Фото: Встреча Светланы Тихановской с Джо Байденом в Белом доме
По её словам, со встречи она вышла с уверенностью, что «голос миллионов жителей страны был услышан».
null