LoginSignup
13

More than 5 years have passed since last update.

Dropbox PaperにMarkdownファイルをアップロードする

Last updated at Posted at 2017-10-06

概要

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

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13