14
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

概要

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

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
14
Help us understand the problem. What are the problem?