{"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

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

Ответить
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 комментариев
Обсуждаемое
Новости
В Петербурге ввели обязательную вакцинацию 80% сотрудников сферы услуг, чиновников и госпредприятий
Со 2 августа в городе разрешили работу фуд-кортов и аттракционов при 100% вакцинации сотрудников.
Дизайн и архитектура
Как попытки сделать «город для людей» разбиваются о некомпетентность чиновников. Показательная история из Краснодара
Архитекторы планировали отдать приоритет пешеходам и велосипедистам, однако губернатор сдался перед автомобилистами.
Наука
«Роскосмос» объявил о планах построить новую орбитальную космическую станцию
Эксплуатацию МКС планируется завершить к 2028 году.
Популярное за три дня
Новости
Роскомнадзор потребовал от YouTube заблокировать канал «Навальный Live»
Также регулятор требует ограничения доступа к личному каналу Любови Соболь.
Новости
Квартиру Юрия Хованского выставили на Avito. Она продаётся за 45 миллионов рублей
Блогер находится в СИЗО по обвинению в оправдании терроризма.
Интернет
Hello darkness, my old friend: история бесконечной грусти Бена Аффлека, увековеченная интернетом в мемах
За годы в сети настолько привыкли ассоциировать себя с депрессивными снимками актёра, что даже в безмятежных моментах вроде отдыха с Дженнифер Лопес видят тоску.
null