このサービスはtwitterへのphoto投稿が対応していないので、dropbox apiとherokuを使って、できるようにしてみたいと思います。
今回のファイルはgithubにあげておきました。
とりあえずgemをインストール
# vim Gemfile
下記を記述。
source "http://rubygems.org"
gem "clockwork"
gem 'dropbox-sdk'
gem 'twitter'
# bundle install
次にdropbox apiを使えるようにこちらから登録してください。
ログイン後、アプリ登録画面で「create an App」をクリック
適当にアプリ名と説明を入れて、「App folder」の方をチェックして、登録。
アプリの詳細画面でApp keyとApp secretを確認してください。
apiを使うためには、コレ以外にrequest_tokenとaccess_tokenが必要なのですが、
そのためにはブラウザでフォルダへの許可を取る必要があります。
なので、まずはその取得用のスクリプトを作成。
# -*- coding: utf-8 -*-
require 'dropbox_sdk'
APP_KEY = 'INSERT-APP-KEY-HERE'
APP_SECRET = 'INSERT-APP-SECRET-HERE'
ACCESS_TYPE = :app_folder
session = DropboxSession.new(APP_KEY, APP_SECRET)
request_token = session.get_request_token
authorize_url = session.get_authorize_url
puts "AUTHORIZING", authorize_url
gets
access_token = session.get_access_token
p "request_token:", request_token
p "access_token:", access_token
上のスクリプトを一端起動してください。
途中urlが表示されると思いますので、それをブラウザに入力。
認証完了後、ターミナルに戻り、エンターを押してください。
request_tokenとaccess_tokenのkeyとsecretがそれぞれ表示されると思いますので、メモしておきます。
次に実際に動かすスクリプトの作成。
herokuのcedar stackでは、webの代わりにスクリプトを動かしっぱなしにできるので、それを利用します。
具体的には、clockworkというライブラリを使い、一定ごとにdropboxのapiを叩き、新規ファイルが登録されていれば、それを投稿という流れ。
設定用のファイルを作成。
# vim Procfile
cron: bundle exec clockwork clock.rb
コードは下記の通り。
# -*- coding: utf-8 -*-
require 'clockwork'
require 'twitter'
require 'dropbox_sdk'
include Clockwork
@time = Time.now
Twitter.configure do |config|
config.consumer_key = 'XXXXXXXXXXXXXXXX'
config.consumer_secret = 'XXXXXXXXXXXXXXXX'
config.oauth_token = 'XXXXXXXXXXXXXXXX'
config.oauth_token_secret = 'XXXXXXXXXXXXXXXX'
end
APP_KEY = 'INSERT-APP-KEY-HERE'
APP_SECRET = 'INSERT-APP-SECRET-HERE'
ACCESS_TYPE = :app_folder
session = DropboxSession.new(APP_KEY, APP_SECRET)
session.set_request_token('REQUEST_TOKEN_KEY', 'REQUEST_TOKEN_SECRET')
session.set_access_token('ACCESS_TOKEN_KEY', 'ACCESS_TOKEN_SECRET')
client = DropboxClient.new(session, ACCESS_TYPE)
handler do |job|
filedata = nil
file_metadata = client.metadata('/')
filedata = file_metadata["contents"].map { |x| x if Time.parse( x["modified"]) > @time }
filedata.each do |f|
unless f == nil
file = client.get_file(f["path"])
filename = Time.now.to_i.to_s
File.open("/tmp/" + filename, "w") {|f| f.write file}
tmp = File.open("/tmp/" + filename, "rb")
p tmp
Twitter.update_with_media(@time.strftime("%F %H:%M"), tmp)
end
end
@time = Time.now
end
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」がつくれます。