Давайте вместе создадим Twitter-бота

У людей с ботами Твиттера отношения любви-ненависти. Они могут быть полезны для ретвитов контента, который имеет отношение к тому, что вы ищете, но они также могут раздражать, если они пишут слишком много или если они пишут о вещах, которые вам не интересны. Однако вы можете обойти эту проблему, создав своего собственного бота.

Создать бота для Twitter относительно просто. В истинном бессерверном стиле можно построить собственное решение с минимальными затратами. В этой статье речь пойдет о создании Twitter-бота в Узле, размещенном в AWS Lambda.

Почему бессерверный?

Использование бессерверных шаблонов для бота Twitter имеет полный смысл.

Триггер

Триггер будет основан на задании cron. В истинном бессерверном стиле я буду использовать Cloudwatch и использовать выражение, подобное cron, для запуска моей лямбды.

Вот мое мероприятие, проведенное через Терраформ:

resource aws_cloudwatch_event_rule every_one_hour {
  name                = "every-one-hour"  
  description         = "Fires every one hour"  
  schedule_expression = "rate(1 hour)"
}

Правило события Cloudwatch будет запускаться каждый час. Когда это выполняется, я хочу, чтобы он вызывал лямбду, поэтому мне также нужно настроить цель события.

resource aws_cloudwatch_event_target twitter_bot {  
  rule      = aws_cloudwatch_event_rule.every_one_hour.name 
  target_id = "lambda"  
  arn       = aws_lambda_function.lambda.arn
}

Не забывая настроить, чтобы функция могла выполняться:

resource aws_lambda_permission allow_cloudwatch_to_call_check_foo {
  statement_id  = "AllowExecutionFromCloudWatch"  
  action        = "lambda:InvokeFunction"  
  function_name = aws_lambda_function.lambda.function_name
  principal     = "events.amazonaws.com"  
  source_arn    = aws_cloudwatch_event_rule.every_one_hour.arn
}

Код

Итак, теперь есть метод для запуска лямбды, теперь нам нужен код для его запуска. Я выбрал Node для фреймворка, так как мне очень нравится JavaScript. Было бы так же легко написать это на множестве других языков.

В этом проекте я собираюсь использовать следующие зависимости (package.json):

Затем мне нужно создать точку входа, где AWS Lambda будет вызывать мою функцию (index.js):

Как видите, вся конфигурация вводится через переменные среды.

TwitterClient.js:

Я в основном ищу хэштег и пытаюсь отфильтровать больше спамовых твитов.

Зарегистрируйте учетную запись разработчика

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

Https://apps.twitter.com/

После регистрации обязательно сохраните:

  • Токен доступа
  • Секрет токена доступа
  • Ключ API
  • Секрет ключа API

Тестировать локально

Чтобы проверить, как все это работает, я в основном вызываю обработчик вручную, устанавливая переменные среды:

В конце index.js я добавляю:

exports.handler();

И запустите функцию как:

TWITTER_CONSUMER_KEY=xxxxU5FaJU3bgDz6nGt9xxxxx TWITTER_CONSUMER_SECRET=XXXXXXXXaQsdHuaC4h3oR3URRqYd0jnqoBVcd9HEV1XXXXXXXX TWITTER_ACCESS_KEY=0000000051433271300-XXXXXXXXRRUdtAMtHoAHIVXXXXXXXX TWITTER_ACCESS_SECRET=xxxxxxxxGalNApvG3yDwPtY2szibxW7TLEImXXXXXXXX FIND_HASHTAG=#serverless RETWEET_COUNT=5 npm start

Будет выполнено поиск до 30 твитов с хэштегом #serverless, и до пяти из них будет ретвититься.

Сборка для Lambda

Поскольку Node по умолчанию устанавливает свои пакеты в каталог node_modules, это всего лишь случай заархивирования каталога и его отправки в AWS.

Опять же, это довольно просто сделать с Terraform.

Заключение

И вот он: бот Twitter, который ретвитит определенный хэштег каждый час! Надеюсь, эта статья оказалась для вас полезной. Пожалуйста, оставьте любые отзывы или вопросы в разделе комментариев. Спасибо за прочтение.