Создадим простого бота в Twitter с использованием Javascript и Node.js и 38 строк кода.
Это первый урок в серии из нескольких частей. В следующих статьях я покажу вам, как добавить более продвинутую функциональность нашему боту. На данный момент мы собираемся создать очень простого бота в 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}`)
}
});
}
- Мы создаем цикл
for
и проходим каждый твит (пока не достигнем длиныdata.statuses
). - Внутри нашего цикла
for
мы фиксируем идентификатор твита, используяdata.statuses[i].id_str
. Нам нужен этот идентификатор для нашегоpost
запроса. - Создаем post запрос
'favorites/create'
(избранное/создать). Этот роут API, который используется для добавления твита в избранное. Мы передаем наш идентификатор твита и запрос возвращает обратный вызов (колбек или callback). - В нашем колбеке мы ищем ошибку. Если есть ошибка, мы фиксируем логи с сообщением об ошибке. В большинстве случаев появляется сообщение об ошибке, потому что мы пытаемся добавить в избранное твит, который мы уже добавили в избранное.
- Если ошибки нет, бот будет добавлять твит в избранное. В качестве дополнительного бонуса я использую возвращенный объект для создания 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 бота в будущем:
- Добавить ретвит функциональности
- Ответ на твиты на определенную тему / хэштег
- Ответить пользователям, если они подписались на вас
- Следить за людьми
- Запуск бота на сервере, а не локально