Создаем простого бота Twitter с Node.js

Опубликовано 1 сентября 2021 в 19:25 (Обновлено 2 ноября 2023 в 03:12)

Время чтения: 7 мин

Создадим простого бота в Twitter с использованием Javascript и Node.js и 38 строк кода.

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

Twitter на смартфоне
Twitter на смартфоне

Создаем приложение

Готовы? Давай сделаем это. Вот что нам понадобится:

  • API Twitter: если у вас есть учетная запись Twitter, вы можете использовать API Twitter. Вы можете прочитать документацию по API здесь.
  • Node.js: посетите официальный сайт Node.js, чтобы загрузить и установить Node, если вы этого еще не сделали.
  • Twitter NPM: модуль NPM Twitter, который позволяет легко взаимодействовать с API Twitter.

Основная причина, по которой этот бот будет работать, это API Twitter. На самых базовых уровнях API - это просто способ взаимодействия одной программы с другой.

Мы будем создавать приложение Node.js, которое взаимодействует с API Twitter. В этом приложении API позволит нам искать твиты и добавлять их в избранное.

Чтобы использовать Twitter API, нам нужна информация! Зайдите в Twitter API и создайте новое приложение.

Вам нужно будет заполнить некоторую информацию, а затем найти лополнительную информацию на вкладке Ключи и токены доступа (Keys и Access Tokens). Возможно, вам придется нажать «Создать токен доступа» (Generate Access Token), чтобы создать свой токен доступа.

  • Consumer Key
  • Consumer Secret
  • Access Token Key
  • Access Token Secret

Как только вы увидите эти ключи, вы будете готовы перейти к следующему разделу.

Конфигурация

Теперь, когда у нас есть необходимая информация о приложении, давайте настроим нашего бота.

1. Создайте пустой каталог с именем twitter-bot и запустите:

$ npm init

2. Заполните необходимую информацию для инициализации нашего проекта.

Вот как выглядел мой файл package.json после инициализации моего проекта. Примечание: ваш может выглядеть немного иначе, это нормально.

{
  "name": "twitter-bot",
  "version": "1.0.0",
  "description": "Nodejs Twitter Bot",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/bmorelli25/Twitter-Bot.git"
  },
  "author": "Brandon Morelli",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/bmorelli25/Twitter-Bot/issues"
  },
  "homepage": "https://github.com/bmorelli25/Twitter-Bot#readme"
}

3. Затем мы сохраним нашу необходимую зависимость, выполнив:

$ npm install --save twitter

4. Создайте два файла, config.js и app.js

Наш файл config.js будет хранить информацию о конфигурации. Файл app.js будет содержать код нашего бота твиттера.

5. Давайте добавим информацию о приложении Twitter сверху в наш файл config.js. Замените каждое из полей ниже соответствующими данными приложения, которые вы получили в Twitter.

// config.js

module.exports = {
  consumer_key: '',
  consumer_secret: '',
  access_token_key: '',
  access_token_secret: ''
}

6. Теперь мы можем запросить (require) две зависимости в файле app.js:

// app.js

var Twitter = require('twitter');
var config = require('./config.js');

7. Теперь, когда у нас есть уже кое-что, пришло время собрать все воедино. Мы делаем это, передавая наши детали конфигурации в Twitter. Добавьте следующий код в app.js:

var T = new Twitter(config);

На данный момент у нас сделаны все настройки. Детали нашего приложения (которые необходимы для взаимодействия с API Twitter) передаются в npm модуль Twitter.

Этот модуль npm упрощает процесс взаимодействия с API Twitter. Теперь мы можем отправлять и получать запросы к API, что позволит нам совершать действия в Twitter через нашего бота!

Делаем бота

Давайте представим как работают "лайки" в Твиттере: Есть две составляющие. Сначала вы ищете твиты, а затем выбираете один и добавляете его в избранное. Давайте сначала поработаем с функцией поиска.

Мы собираемся установить переменную params, которая будет содержать параметры поиска. Есть много параметров, которые мы можем использовать. Вы можете увидеть полный список в документации API Twitter по этой ссылке.

var Twitter = require('twitter');
var config = require('./config.js');
var T = new Twitter(config);

// Настройка параметров поиска

var params = {
  q: '#nodejs',
  count: 10,
  result_type: 'recent',
  lang: 'en'
}

q является единственным обязательным параметром,который хранит наш поисковый запрос. В этом примере мы ищем твиты, содержащие #nodejs. Не стесняйтесь изменять его на любой запрос, который вы хотите.

Я также использую три дополнительных параметра поиска:

count - укажите количество твитов, которые вы хотите вернуть

result_type: 'recent' - возвращает только самые последние результаты

lang: 'en' - возвращает только результаты на английском языке

Теперь, когда у нас есть параметры поиска, мы подключаем их к запросу get, чтобы мы могли найти некоторые твиты.

T.get('search/tweets', params, function(err, data, response) {
  if(!err){
    // This is where the magic will happen
  } else {
    console.log(err);
  }
})

Чтобы глубже понять, что здесь происходит, вам нужно прочитать документацию по API Twitter для поиска/твитов GET, но я постараюсь ниже описать базовые понятия.

С помощью модуля Twitter npm мы можем сделать запрос get ‘search/tweets’ (поиск/твиты) и передать в params, который мы установили ранее. Этот запрос get возвращает обратный вызов. Если в этом обратном вызове нет ошибок, мы запустим наш код, чтобы добавить твит в избранное. Если есть ошибка, мы создадим лог и всё.

Отлично, теперь нам просто нужно добавить код в оператор if(!err) выше.

Наш get запрос возвращает массив из нескольких твитов через объект data.statuses. Таким образом, нам нужно пройтись по всем твитам в этом массиве и выбрать каждый из них в отдельности. Вот как мы это делаем:

// Loop through the returned tweets
    for(let i = 0; i < data.statuses.length; i++){
      // Get the tweet Id from the returned data
      let id = { id: data.statuses[i].id_str }
      // Try to Favorite the selected Tweet
      T.post('favorites/create', id, function(err, response){
        // If the favorite fails, log the error message
        if(err){
          console.log(err[0].message);
        }
        // If the favorite is successful, log the url of the tweet
        else{
          let username = response.user.screen_name;
          let tweetId = response.id_str;
          console.log('Favorited: ', `https://twitter.com/${username}/status/${tweetId}`)
        }
      });
    }
  1. Мы создаем цикл for и проходим каждый твит (пока не достигнем длины data.statuses).
  2. Внутри нашего цикла for мы фиксируем идентификатор твита, используя data.statuses[i].id_str. Нам нужен этот идентификатор для нашего post запроса.
  3. Создаем post запрос 'favorites/create' (избранное/создать). Этот роут API, который используется для добавления твита в избранное. Мы передаем наш идентификатор твита и запрос возвращает обратный вызов (колбек или callback).
  4. В нашем колбеке мы ищем ошибку. Если есть ошибка, мы фиксируем логи с сообщением об ошибке. В большинстве случаев появляется сообщение об ошибке, потому что мы пытаемся добавить в избранное твит, который мы уже добавили в избранное.
  5. Если ошибки нет, бот будет добавлять твит в избранное. В качестве дополнительного бонуса я использую возвращенный объект для создания URL нового избранного твита. Этот URL-адрес затем записывается в консоль, что позволяет легко увидеть, какие твиты предпочитает бот.

Запуск бота

Готово! Запустите вашего бота через командную строку:

$ node app.js

Вот и всё! Наш бот добавляет в избранное и записывает URL каждого твита.

Код бота целиком

Вот как выглядит итоговый файл app.js. Также код можно посмотреть на GitHub автора идеи, так что заходите туда, если вы хотите скачать и поиграть с ботом!

var Twitter = require('twitter');
var config = require('./config.js');
var T = new Twitter(config);

// Set up your search parameters
var params = {
  q: '#nodejs',
  count: 10,
  result_type: 'recent',
  lang: 'en'
}

// Initiate your search using the above paramaters
T.get('search/tweets', params, function(err, data, response) {
  // If there is no error, proceed
  if(!err){
    // Loop through the returned tweets
    for(let i = 0; i < data.statuses.length; i++){
      // Get the tweet Id from the returned data
      let id = { id: data.statuses[i].id_str }
      // Try to Favorite the selected Tweet
      T.post('favorites/create', id, function(err, response){
        // If the favorite fails, log the error message
        if(err){
          console.log(err[0].message);
        }
        // If the favorite is successful, log the url of the tweet
        else{
          let username = response.user.screen_name;
          let tweetId = response.id_str;
          console.log('Favorited: ', `https://twitter.com/${username}/status/${tweetId}`)
        }
      });
    }
  } else {
    console.log(err);
  }
})

Вот список возможных улучшений и дополнений, которые мы можем сделать для нашего Twitter бота в будущем:

  • Добавить ретвит функциональности
  • Ответ на твиты на определенную тему / хэштег
  • Ответить пользователям, если они подписались на вас
  • Следить за людьми
  • Запуск бота на сервере, а не локально

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.