Sign in

Зарегистрируйтесь, чтобы стать полноправным участником сообщества Masterpro.ws.

Ruby on Rails: постинг твитов через Twitter API

К написанию этой статьи автора подтолкнуло закрытие проекта Twidium, случившееся аккурат в столетнюю годовщину Великой Октябрьской Социалистической революции.

Такое вот неприятное, поистине мистическое совпадение, приведшее к меланхолическим раздумьям и плотно поставившее перед необходимостью создания хоть какого-то, хотя б "домашнего", эквивалента знаменитому проекту Леонида Кофмана. Иных ассоциаций юбилейная дата ровным счетом не вызвала, пользуясь случаем, подчеркиваю этот момент. Мало ли кто прочтет, живем ведь в очередной раз в "сложное, но такое интересное время". Хотя... впрочем нет, займемся-ка лучше программированием на всегда модном и актуальном Ruby on Rails, позиционируемом как гибкая среда разработки веб-приложений.

 

 

Rails действительно flexible, не сомневайтесь. Когда на очередном собеседовании у вас осведомятся, сопроводив вопрос хитроумным прищуром, с какими такими MVC-фреймворками доводилось иметь дело, вам ведь необязательно козырять дальним знакомством с Ruby on Rails; достаточно назвать Joomla и с невинной улыбкой наблюдать, как многоопытный тестировщик начнет выкарабкиваться из неловкого положения. Все правильно, всеми горячо любимая и мало кому хорошо знакомая Joomla также реализует MVC, но попробуйте-ка собрать из ее бесплатных extensions то, что мы за десять минут сейчас с вами сделаем, используя Ruby on Rails и самое минимальное количество кода! - вероятнее всего, у вас это не получится, даже невзирая на mbabker · GitHub.

А на RoR все несложно. Правда, и задачу поставим себе для начала более чем несложную: наше новое приложение должно уметь в автоматическом режиме и через различные промежутки времени постить твиты посредством Twitter API в один-единственный тви-акаунт, на который мы предоставим все необходимые разрешения.

Создадим в rails-app новые контроллер и вьюху под наши эксперименты с твиттером (не имеет особого значения, как именно вы их обзовете), и сделаем контроллер похожим на примерно вот такой блок кода:

 

class TwitterController < ApplicationController
  def initialize
    @client = Twitter::REST::Client.new do |config|
  config.consumer_key = "********************"
  config.consumer_secret = "*************************"
  config.access_token = "**************************"
  config.access_token_secret = "********************************"
    end
  end
end

 

Профессиональным сисадминам, не привыкшим читать мануалы и разбираться в API, на этом месте необходимо отогнать шальную мысль о том, что имеет место та или иная аналогия с контроллером домена... все-таки неплохо бы чуток прогнуться и прочесть хотя б вводную статью Ruby on Rails - это просто?; тогда есть некоторая надежда, что все действительно будет не очень сложно.

Где взять переменные, условно обозначенные здесь звездочками? - опять-таки, ничего не может быть проще: идем сюда, на apps.twitter.com, и, залогинившись в свой твиттер, жмем Create new app. Что именно вы укажете в филдах Name, Description и Website - имеет очень мало значения, Callback URL, Privacy Policy URL, Terms of Service URL - нам с вами вообще не понадобятся, но вот на вкладке Permissions вашего new app рекомендую отметить чекбокс Read and Write, после чего копируем все четыре полученных ключа в контроллер.

Приводим наш index.html.erb (или как там он у вас называется) к следующему виду - так, как показано далее. Да, отредактируете потом как вам захочется; вверху у нас, как видите, самый обычный HTML, отдающий данные формы самому себе любимому (позаботьтесь, чтобы путь для form action соответствовал реальному):

 

<!DOCTYPE html>
<html>
<head>
  <title></title>
</head>
<body>
<form action='/twitter/index' method='get'>
  <fieldset><legend>Twitter Tweet</legend>
    <textarea type='text' placeholder='Tweet to post ...' name='tweet' ></textarea><br>
    <input type="submit" value = "tweet" />
  </fieldset>
</form>
</body>
</html>

<% if request.GET[:tweet].present? %>
<% @array = params[:tweet].split(/[\r\n]+/) %>
  <% @array.each do |i| %>
    <%= @client.update(i) %>
  <% sleep rand(1..10) %>
  <% end %>
   <% end %>



, ну и далее, опять-таки, все несложно: загоняем в массив твиты из формы, разделенные символом переноса строки и если существуют, далее через рандомные промежутки времени (от 1 до 10 секунд) итерируем и постим твиты. Все предельно ясно, непонятно лишь одно, что же означает этот самый пресловутый @client.update.

 

Продолжение разработки в материале Ruby on Rails: постинг твитов через Twitter API. Часть 2

 

Никаких проблем, сейчас все станет ясно и с этим. Открываем Gemfile, куда добавляем всего одну строчку:

 

gem 'twitter'

 

и затем, разумеется, bundle install. И вот теперь будет совсем нелишне перейти на GitHub и хотя бы мельком взглянуть на документацию The Twitter Ruby Gem (a Ruby interface to the Twitter API); в нашем с вами новом эксперименте мы используем лишь очень небольшую часть возможностей этого отличного гема. Ну, что же. Главное ведь "нАчать", как известно со слов всем известного российского политика, доживающего сегодня свои дни в довольстве и покое далеко вдали от некогда полностью подвластных ему родных пенатов, в то время как нам с вами, кхм... дым отечества по-прежнему сладок и приятен. Впрочем, не будем отвлекаться, каждый ведь экспериментирует как умеет.

Но, собственно, это уже все на сегодня. Вводим в нашу формочку твиты, один или несколько (после каждого твита - Enter, и затем с новой строчки), и жмем кнопку tweet. В зависимости от количества твитов - не забываем, наше новое rails-приложение делает паузы после публикации каждого из них - это займет некоторое время, затем страничка перезагрузится и мы получим в ответ на каждую успешную публикацию что-нибудь вот этакое:

 

#<Twitter::Tweet:0x007fc24c03f988>

 

Еще неплохо бы прикрутить ajax и внести ряд усовершенствований (так и просится на язык модное словечко "инновации") в наш rails-app, но давайте оставим это для следующего раза, ок?

Оставить комментарий

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