Медиум полон сообщений о твиттер-ботах. Зачем еще один пост бота? 🤔 🤔 Chill 😎 мы будем учиться создавать полнофункциональный Twitter Bot, который может захватывать случайные цитаты и твитнуть их самостоятельно. Мы развернем нашего бота на heroku и встроим временную шкалу твиттера на наш статический веб-сайт.

Что будет делать этот бот?

Это простой бот для Twitter, который будет извлекать цитаты из Formastic Api и публиковать цитаты с # кавычками и смайликами. Этот бот любит пост #Nature и транслирует твит о Непале в командной строке.

Что вам нужно?

  • В вашей системе должен быть установлен Node.js.
  • Учетная запись Twitter.
  • Ваш бот будет использовать node-twitter, который представляет собой модуль npm для управления твитами и потоками, а также для связи с Twitter API.
  • Учетная запись Heroku, которая представляет собой платформу как услугу (PaaS), без особых усилий обслуживает и размещает наши веб-приложения.

Давайте начнем

Создайте новую папку и инициализируйте ее с помощью npm init -f, который инициализирует файл package.json с настройками по умолчанию, или используйте npm init.

Создайте index.js и tweet.js, которые будут нашим сервером и сценарием твита соответственно.

Ваша текущая структура каталогов должна выглядеть так:

root/Twitter_bot
|- index.js
|- tweet.js
|- package.json

Создайте папку внутри Twitter_bot в качестве конфигурации, в которой у нас будет секрет нашего приложения от Twitter API.

Папка config выглядит так:

root/Twitter_bot/config
|- dev.js
|- keys.js
|- prod.js

Настройка и предоставление разрешений из Twitter API

После входа в свою учетную запись Twitter перейдите по этой ссылке: https://apps.twitter.com/app/new, чтобы создать новое приложение. Заполните необходимые поля в форме, нажмите кнопку Create Your Twitter Application. После создания приложения найдите Ключи и токены доступа под панелями навигации и нажмите Создать действия с токенами, а затем скопируйте:

  • Потребительский ключ
  • Потребительский секрет
  • Токен доступа
  • Секрет токена доступа

Откройте dev.js file и вставьте в него все четыре значения. Выставьте эти значения с помощью module.export:

//config.js
/** TWITTER APP CONFIGURATION
 * consumer_key
 * consumer_secret
 * access_token
 * access_token_secret
 */
module.exports = {
  consumer_key: '',  
  consumer_secret: '',
  access_token: '',  
  access_token_secret: ''
};

Откройте prod.js file и вставьте в него все четыре значения.

//prod.js
/** TWITTER APP CONFIGURATION
 * consumer_key
 * consumer_secret
 * access_token
 * access_token_secret
 */
 module.exports={
  consumer_key: process.env.TWITTER_CONSUMER_KEY,
  consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
  access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
  access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET
};

Мы будем использовать это значение позже, чтобы развернуть нашего бота на heroku.

В keys.js file вставьте эти:

if(process.env.NODE_ENV === 'production'){
 module.exports = require('./prod');
} else{
 module.exports=require('./dev');
}

Это все, что касается нашего файла конфигурации. Давайте двигаться дальше.

Сборка сервера

При развертывании на heroku и автоматизации твитов нашего твиттер-бота нам понадобится экспресс-сервер.

index.js
const express = require('express');
const app = express();
const port = process.env.PORT||5000;
app.listen(port,()=>{
 console.log(`Server is running at port ${port}`);
})

Теперь наш сервер запущен и работает. Теперь мы переключаемся на основную задачу использования twitter API для создания Quote Bot.

Цитата Бот

Мы начнем с установки зависимости, которая нам нужна для нашего приложения.

$ npm install --save twitter

После завершения установки зависимости перейдите к файлу tweet.js и потребуйте зависимость и файл config..

const Hero= require(’twit’);
const Keys= require(’.config/keys’);

Передайте конфигурацию (потребителя и токены доступа) нашего приложения Twitter в dev.js twitter:

const Hero = new Twitter(Keys);

Все идет нормально?

Давайте напишем функциональное выражение, которое находит случайные цитаты из Formastic Api, и разместим эту цитату в Твиттере.

Давайте установим дополнительную зависимость, чтобы получить доступ к Formastic API.

const request = require('request');
const requestPromise = require('request-promise');
const API_URL = 'https://api.forismatic.com/api/1.0/?method=getQuote&lang=en&format=json';

Напишем функцию, которая будет фактически получать информацию из API и публиковать твиты.

const getQuote = (() => {
 
 /* request options */
 const OPTIONS = {
 uri: API_URL,
 json: true
 };
 requestPromise( OPTIONS )
 /* Successful call */
 .then( (response) => {
 if ( !response )
 getQuote();
let quoteText = response.quoteText;
 let author = response.quoteAuthor || “Unknown”;
 let fullQuote = `”${quoteText}”` + “ — “ +` ${author}`
 
 printQuote( fullQuote );
 Hero.post(‘statuses/update’, {status: fullQuote+’😊😊 #Quotes’}, function(error, tweet, response){
 if(error){
 console.log(error);
 }
 console.log(tweet); // Tweet body.
 console.log(response); // Raw response object.
});
 })
/* Handling errors */
 .catch( (err) => {
 console.log(“Unable to retrieve quote, try again”);
 })
})();
let printQuote = (fullQuote) => {
 console.log( fullQuote )
}

Любимый бот

Мы инициализируем объект params, который будет содержать различные свойства для поиска твита, но, что наиболее важно, свойство query или q, которое уточнит наш поиск. Какое бы значение вы ни указали в этом свойстве, наш бот будет искать твиты в избранное на основе этого критерия. Для нашего примера бота мы нашли последние твиты на #nature. result_type:'mixed recent' найдет недавний и популярный твит в параметрах поиска и добавит его в избранное.

const params = {
 q: ‘#Nature’,
 result_type: ‘mixed recent’,
 lang: ‘en’ 
 }

Функциональная часть Favorite Bot

Hero.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
      Hero.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);
  }
})

Тада, ты создал своего твиттер-бота !!

Теперь в вашем index.js файле просто укажите tweet.js as:

require('./app');

index.js должен выглядеть так

const express = require('express');
const app = express();
require('./app');

app.use(express.static('public'));
const port = process.env.PORT||5000;
app.listen(port,()=>{
 console.log(`Server is running at port ${port}`);
})

В файле package.json добавьте стартовый скрипт как

"scripts": {
    "start": "node index.js"
  },

Затем из терминала запускаем npm start

Для развертывания ботов в Heroku

Я предполагаю, что вы знакомы с платформой Heroku. Если не парьтесь, можете прочитать Здесь.

Создайте public в корневом каталоге и добавьте файл index.html, а затем внутри index.html добавьте следующий скрипт встраивания внутри тега body, который просто добавит вашу временную шкалу твиттера.

</style>
<a class="twitter-timeline" href="https://twitter.com/CoastQuote?ref_src=twsrc%5Etfw">Tweets by CoastQuote</a> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
<script>

Обратите внимание, что

app.use(express.static('public'));

Это будет служить нашему статическому HTML. Вы также можете сделать полностью динамическим.

GIT и HEROKU

Инициализируйте git для своего проекта, если вы еще этого не сделали.

$ git init
$ git add remote origin //From your repo
$ git add .
$ git commit -m "Quote Bot Finished"
$ git push origin master
$ heroku create
$ git push heroku master
$ heroku open //your bot will be live on your browser

Это мой первый средний пост, так что я не вижу ошибок.

Вы можете найти исходный код здесь.