Използване на Node.js, API на Twitter и Google Spreadsheets.

Аз съм президент на Студентската асоциация на Югоизточна Азия (SEASA) в Бостънския колеж. Искам да мога да споделям информация за предстоящите събития на SEASA и забавни факти от Югоизточна Азия, ноаз съм зает човек.

И така, какво направих? Създадох SEASA Twitter Bot.

Целта

За създаване и внедряване на Twitter Bot, който ще туитва факти от Югоизточна Азия веднъж на ден. Роботът ще приема тези туитове чрез достъп до Google Spreadsheet с факти от Югоизточна Азия, които цялата изпълнителна власт дъската има достъп до.

Настройката (основен 🔑🔑🔑)

Първо имах нужда от моите API ключове за Twitter. „Ето страхотно ръководство как да направите това“. След това инсталирах куп пакети чрез NPM, за да помогна в моето начинание.

  • twit: Twitter API клиент за Node. Twit се използва просто за процеса на отправяне на заявки към API на Twitter.
  • google-spreadsheet:Модул за подпомагане на четенето и манипулирането на данни в Google Spreadsheets.
  • base64-img:Преобразува изображения в base64, както подсказва името. Това е полезно, когато публикувате изображения в Twitter, тъй като Twitter приема само base64 кодиране на снимки.
  • async:Пакет, който помага за контролиране на потока от асинхронен код. Полезно, защото всички google-spreadsheet, twit и base64-imgса асинхронни.

Кодът

Честно казано, този проект не беше толкова труден, колкото очаквах, особено с помощта на пакетите. Всъщност имам чувството, че изневерявам малко, но само малко — в края на краищата, „Добрите програмисти кодират. Многократно използване на страхотни кодери“.

Пълният код може да бъде намерен в моя GitHub.

Работа с Google Електронни таблици

Работил съм с API на Google преди и съм бил изгарян от OAuth повече от веднъж, но google-spreadsheet опрости процеса на удостоверяване много.

Друга удобна функция е, че google-spreadsheet връща редовете на листа като JavaScript обекти, където ключовете са заглавките, а стойностите са съдържанието на този ред. Той също така предоставя функции за манипулиране на тези обекти и запазване на промените в Google.

Публикуване на туитове със снимки

Някои туитове имат публикувани снимки с тях. Бихте си помислили, че това ще бъде също толкова лесно, колкото публикуването на обикновен туит, но трябва да преминете през още няколко обръча, за да направите това.

Моята дъска вероятно ще постави URL от Google Images в електронната таблица. Така че, за да публикувам туит с медия, трябва първо да публикувам медията в кодиране base64 в Twitter. Затова първо трябва да преобразувам този URL в base64 с помощта на base64-img. Тъй като имаме работа с HTTP заявка, тази част е асинхронна. Когато това изображение се преобразува в base64, трябва да го публикуваме в Twitter. Обектът за връщане съдържа идентификатор на медия, който ни позволява да препращаме към публикуваното изображение. След това трябва да дефинираме метаданните, които съдържат факта и изображението. Тогава и само тогава можем да публикуваме статуса с медиите в Twitter.

Работа с асинхронен код

Единственото предизвикателство беше асинхронният аспект на twit, google-spreadsheet и base64-img.

Асинхронният код е страхотен (през повечето време). Позволява ви да правите няколко неща едновременно, без да се налага да чакате дадена функция да се върне. За съжаление моят бот трябва да изчака информацията, върната от twit, google-spreadsheets и base64-img, които са асинхронни.

Въведете async.waterfall(), async функция, която ме спаси от влизане в ада за обратно извикване.

Според документацията, async.waterfall():

„Изпълнява масив от функции последователно, като всяка предава своите резултати на следващата в масива. Въпреки това, ако някоя от функциите предаде грешка на обратното извикване, следващата функция не се изпълнява и основното обратно извикване веднага се извиква с грешката.”

Това ми позволи да разделя кода си на поредица от функции, които изпълняват определени задачи и предават резултатите (информацията за туитове) от една функция към друга. Като разбия кода си по този начин, можех да контролирам потока на програмата си и да се уверя, че нещата не излизат от ред.

Ето как го използвах:

var run = function() {
  async.waterfall([
    setGoogleAuth,
    getWorksheet,
    getTweet,
    tweet
  ],  
  function(err, tweetData) {
    if (err) {
      console.log("There was an error posting to Twitter: ", err);
    } else {
      console.log("Tweet successful.");
      console.log("Tweet: ", tweetData.tweet)
    }
  });
};

Разгръщането

Heroku идва на помощ. Всичко, което направих, беше просто да изпратя кода си към Heroku и използвах Heroku Scheduler, за да стартирам файла си веднъж на ден в 15:00 PST.

Крайният резултат

Напълно функциониращ Twitter бот, който:

  1. Взима факти от електронната таблица на Google
  2. Излага този факт в туитове.
  3. Маркира факта като туитнат в електронната таблица.

Не е нищо супер изискано, но е нещо и аз се гордея с това.

Следващите стъпки

Това е само началото за този бот. В бъдеще се надявам да го развия така, че да може сам да събира факти, да ретуитва новини от Югоизточна Азия и може би да го накарам сам да туитва някои смешни неща.