概要
Dropbox APIがV2になってAPIを使ってDropboxPaperのドキュメントの作成ができるようになりました!
esaなどの別のサービスからエクスポートしたmdファイルを簡単にDropboxPaperにインポートできそうなので試してみました。
これはDropbox Paperへの移行が捗りそう\(^o^)/
事前準備
https://www.dropbox.com/developers/apps
上のページからappを作成し、アクセス トークンを生成、取得します。
スクリプト
特定のフォルダにアップロードするには、Dropbox-API-Argで parent_folder_id
を指定します。
HTTPクライアントにFaradayを使ってrubyスクリプトを書いてみました。
conn = Faraday.new(url: 'https://api.dropboxapi.com') do |faraday|
faraday.authorization :Bearer, '**token**'
faraday.response :logger
faraday.adapter Faraday.default_adapter
end
conn.post do |req|
req.url '/2/paper/docs/create'
req.headers['Dropbox-API-Arg'] = { 'import_format': 'markdown', 'parent_folder_id': 'e.iXXXXXXXXXXXXXXXXX12345XXXXXXXXXXXXXXXX' }.to_json
req.headers['Content-Type'] = 'application/octet-stream'
req.body = File.binread('hoge.md')
end
注意点として
一度に大量にはアップロードできません。
100件ほど連続してアップロードするとAPI利用回数制限のエラーが返ってきます。(100回/日の利用制限)
アップロードしたmdファイルが数100件あったので、実際には以下のような感じの実装になりました。
Dir.glob("/**/*.md").each do |file_name|
begin
response = conn.post do |req|
req.url '/2/paper/docs/create'
req.headers['Dropbox-API-Arg'] = { 'import_format': 'markdown', 'parent_folder_id': 'e.iXXXXXXXXXXXXXXXXX12345XXXXXXXXXXXXXXXX' }.to_json
req.headers['Content-Type'] = 'application/octet-stream'
req.body = File.binread(file_name)
end
if response.status == 429
duration = response.headers['retry-after'].to_i
puts "RateLimit!! sleep...#{duration}"
sleep duration
fail RateLimitError
end
rescue RateLimitError
puts "Retry!!"
retry
end
end