Создание бота для Twitter в NodeJS

Я знаю, что в последнее время я немного притих, я в значительной степени сделал перерыв в программировании во время Хануки. Итак, вчера вечером я подумал, что вместо того, чтобы приобщиться к древней еврейской традиции наслаждаться лучшими блюдами китайской кухни, я останусь дома и буду работать над проектом, который собирался исследовать; написание Twitter-бота.

Я выбрал для начала что-нибудь простое. Любой, кто владеет автомобилем в Нью-Йорке, знает, какую боль представляет собой альтернативная боковая парковка (ASP). В определенные дни недели нам не разрешается парковать автомобили на определенных сторонах улицы в течение произвольных полутора часов. В назначенную минуту армия стервятников в синих мундирах набрасывается на город, и любой автомобиль, владелец которого опоздал даже на несколько минут, украшается оранжевым конвертом с дорогостоящим штрафом.

К счастью, есть несколько дней в году (в основном официальные праздники и дни после сильных снежных бурь), когда мы получаем отсрочку. Я решил сделать бота, который будет твитнуть в те дни.

По правде говоря, в Нью-Йорке уже есть учетная запись в Твиттере, которая публикует твиты о статусе ASP (@NYCASP), но эта учетная запись каждый день публикует твиты о статусе. Я не хотел, чтобы мой канал был загроможден в те дни, когда действуют правила ASP (а это бывает большую часть дней), поэтому я решил написать бота, который будет следовать за мной @NYCASP и ретвитить его только в те дни, когда ASP правила приостановлены.

К счастью, есть пакет Node под названием twit, который предоставляет клиент Twitter API, который довольно прост в использовании.

Чтобы настроить своего бота, я использовал это замечательное руководство моего друга и коллеги, выпускника Flatiron School, Бена Гринберга. Если вы хотите написать своего собственного бота, я предлагаю следовать его посту для начальной настройки, а также инструкциям по развертыванию на Heroku, чтобы ваш бот мог работать. В этом посте я просто опишу, как я создал самого бота.

В итоге мой бот выглядел так:

const twit = require('twit');
require('dotenv').config()                                              
const config = {
    consumer_key: process.env.consumer_key,
    consumer_secret: process.env.consumer_secret,
    access_token: process.env.access_token,
    access_token_secret: process.env.access_token_secret
}
const Twitter = new twit(config)
const userID = "102773464"
const stream = Twitter.stream('statuses/filter', {follow: [userID]})
stream.on('tweet', function (tweet) {
    if(tweet.text.includes("suspended")) {
        retweet(tweet.id_str)
    }
})
const retweet = function(id) {
   Twitter.post('statuses/retweet/:id', {id: id}, function(err,res){
      if(res){
         console.log("Successfully Retweeted")
      } else {
         console.log(error.message)
      }
   })
}

В первой строке я импортировал пакет twit, а затем определил конфигурацию, необходимую для публикации моего бота. Я спрятал секретные ключи в переменных среды, к которым получил доступ с помощью dotenv.

Затем я определил несколько переменных: переменную Twitter для нового экземпляра twit, используя мою конфигурацию, переменную userID, которая содержит идентификатор пользователя учетной записи Twitter @NYCASP, и, наконец, я открыл твит stream, который прослушивал все активность, связанная с учетной записью Twitter @NYCASP.

Теперь, когда мой поток запущен, я прикрепил к потоку прослушиватель событий, который запускает функцию обратного вызова каждый раз, когда в поток добавляется твит. Функция просматривает текст твита и, если он содержит слово "suspended", запускает другую функцию, которая ретвитит его.

На самом деле довольно просто!

Теперь все, что осталось, - это развернуться на Heroku, дождаться рождественского утра и посмотреть, ретвитнет ли мой бот о утренней приостановке:

Джекпот! Это сработало!

Если вы житель Нью-Йорка и хотите подписаться на моего бота, вы можете найти его на @AlterSideBot