2012年3月23日金曜日

自分用のdropbox automatorが作れる!dropbox+herokuでtwitterに写真を自動投稿する方法

dropboxにファイルを上げると、自動的にfacebookやflickrに投稿するようにできるdropbox automatorというサービスがあります。
このサービスはtwitterへのphoto投稿が対応していないので、dropbox apiとherokuを使って、できるようにしてみたいと思います。
今回のファイルはgithubにあげておきました。

とりあえずgemをインストール
# vim Gemfile

下記を記述。
  1. source "http://rubygems.org"  
  2. gem "clockwork"  
  3. gem 'dropbox-sdk'  
  4. gem 'twitter'  


# bundle install

次にdropbox apiを使えるようにこちらから登録してください。
ログイン後、アプリ登録画面で「create an App」をクリック
適当にアプリ名と説明を入れて、「App folder」の方をチェックして、登録。

アプリの詳細画面でApp keyとApp secretを確認してください。
apiを使うためには、コレ以外にrequest_tokenとaccess_tokenが必要なのですが、
そのためにはブラウザでフォルダへの許可を取る必要があります。

なので、まずはその取得用のスクリプトを作成。

  1. # -*- coding: utf-8 -*-  
  2. require 'dropbox_sdk'  
  3.   
  4. APP_KEY = 'INSERT-APP-KEY-HERE'  
  5. APP_SECRET = 'INSERT-APP-SECRET-HERE'  
  6. ACCESS_TYPE = :app_folder  
  7. session = DropboxSession.new(APP_KEY, APP_SECRET)  
  8.   
  9. request_token = session.get_request_token  
  10.   
  11. authorize_url = session.get_authorize_url  
  12. puts "AUTHORIZING", authorize_url  
  13. gets  
  14.   
  15. access_token = session.get_access_token  
  16.   
  17. "request_token:", request_token  
  18. "access_token:", access_token  



上のスクリプトを一端起動してください。
途中urlが表示されると思いますので、それをブラウザに入力。
認証完了後、ターミナルに戻り、エンターを押してください。

request_tokenとaccess_tokenのkeyとsecretがそれぞれ表示されると思いますので、メモしておきます。

次に実際に動かすスクリプトの作成。

herokuのcedar stackでは、webの代わりにスクリプトを動かしっぱなしにできるので、それを利用します。
具体的には、clockworkというライブラリを使い、一定ごとにdropboxのapiを叩き、新規ファイルが登録されていれば、それを投稿という流れ。

設定用のファイルを作成。
# vim Procfile
  1. cron: bundle exec clockwork clock.rb  


コードは下記の通り。
  1. # -*- coding: utf-8 -*-  
  2. require 'clockwork'  
  3. require 'twitter'  
  4. require 'dropbox_sdk'  
  5. include Clockwork  
  6. @time = Time.now  
  7.   
  8. Twitter.configure do |config|  
  9.   config.consumer_key = 'XXXXXXXXXXXXXXXX'  
  10.   config.consumer_secret = 'XXXXXXXXXXXXXXXX'  
  11.   config.oauth_token = 'XXXXXXXXXXXXXXXX'  
  12.   config.oauth_token_secret = 'XXXXXXXXXXXXXXXX'  
  13. end  
  14.   
  15. APP_KEY = 'INSERT-APP-KEY-HERE'  
  16. APP_SECRET = 'INSERT-APP-SECRET-HERE'  
  17. ACCESS_TYPE = :app_folder  
  18. session = DropboxSession.new(APP_KEY, APP_SECRET)  
  19. session.set_request_token('REQUEST_TOKEN_KEY''REQUEST_TOKEN_SECRET')  
  20. session.set_access_token('ACCESS_TOKEN_KEY''ACCESS_TOKEN_SECRET')  
  21. client = DropboxClient.new(session, ACCESS_TYPE)  
  22.   
  23. handler do |job|  
  24.   filedata = nil  
  25.   file_metadata = client.metadata('/')  
  26.   filedata = file_metadata["contents"].map { |x| x if Time.parse( x["modified"]) > @time }  
  27.   filedata.each do |f|  
  28.    unless f == nil  
  29.     file = client.get_file(f["path"])  
  30.     filename = Time.now.to_i.to_s  
  31.     File.open("/tmp/" + filename, "w") {|f| f.write file}  
  32.     tmp = File.open("/tmp/" + filename, "rb")  
  33.     p tmp  
  34.     Twitter.update_with_media(@time.strftime("%F %H:%M"), tmp)  
  35.    end  
  36.   end  
  37.   @time = Time.now  
  38. end  
  39.   
  40. every(1.minutes, 'check')  


apiのキーはそれぞれ先程メモったものなどを入力してください。

あとはherokuに上げるだけ。
# git init
# git add .
# git commit -m 'first commit'

# heroku create --stack cedar
# git push heroku master
# heroku scale cron=1

ちゃんと動いているかどうか確認します。
# heroku ps
起動しているプロセスがcron.1だけのはず。

# heroku logs --tail
Triggering checkみたいなログがでているはずです。

あとは、dropboxに先程登録したアプリ名のファイルができているので、画像をコピーしてみます。(なぜかgitがうまく投稿できませんでした。。。)
twitterに自動投稿されていれば成功です。

ファイル名や種類、アップするフォルダで処理を変えるようにすれば、自分なりの「dropbox automator」がつくれます。

0 件のコメント:

コメントを投稿