[新]なんでも日記[新]なんでも日記ジャンル不定の日記です。APIを使ったバックアップを導入した。APIは、怪しいプログラムをインストールするよりも自分で作っちゃおう。考えたので、慣れたPerl使った。Consoleでプロジェクトを作成。APIを有効にして他は無効に。OAuth2.0クライアントIDを作成。(種類は「その他」で作った)"code"の取得。"refresh_token"の取得。さっきできなくてハマったが、DNS関連だと思うがタイミングが悪いと3.のクライアントIDの作成ができない。シークレット"が表示されるが、両方共プログラムで使うのでメモっとく。4.の"code"は、5.の"refresh_token"を取得するために必要でブラウザでURLにアクセスしてプログラムを許可すると表示される。ID]↑接続するURLはこんな感じ。リードオンリーとかもできる。response_typeは、"code"の場合はredirect_uriで指定したURLの末尾にクエリでつけられてリダイレクトされる。クライアントプログラムを作るのでリダイレクト用のページなど存在しないが、その場合は"urn:ietf:wg:oauth:2.0:oob"を指定するとGoogleのページでコードを表示してくれる。取得できたコードは5.の"refresh_token"を取得するために1回だけ必要。https://accounts.google.com/o/oauth2/tokenこんな感じでリクエストを投げるとJSON形式で返ってくる。"refresh_token"だけが必要。DriveにアップロードするPerlスクリプトを作った。$str=shift;$str=~s/([^\w\-\.\~])/'%'.uc(unpack('H2',$1))/eg;return($str);}###こんな感じ。赤字のとこは自分用に入力。普通にファイルシステムを使う感じとはだいぶ違ってて、把握するのが結構難しかった。普通のファイルシステムと一番違うのが、PATH的な概念がなくPATH指定で対象を選択できない。ローテートするのが面倒かと思ったんだが、PATHが無いので同じ場所に同名ファイルを置けるんで、同じ場所にアップロードして成功したら古いの削除しちゃうだけで良いことに気づいたんで、そうした。アップロードするファイルを置くフォルダは、PATHが無いので毎回検索クエリを投げなきゃダメかとも思ったが、フォルダのIDはブラウザでフォルダにアクセスした時のURL末尾の文字列と同じだったんで、プログラムに直接設定する仕様にした。%Typeで拡張子を設定しておけばアップロード時にファイルタイプを指定して送るが、未設定のファイル場合は"application/octet-stream"で送る。ファイルPATHをパラメータとして渡すとアップロードするけど、パラメータのPATHはスペース区切りで複数可。アップロードに1秒以上かかるだろうが、秒間10リクエストまでの制限があるようなので、1ファイル毎に1秒寝る。失敗した場合(idが取得できなかった場合)は、古いのそのままにしとく。Driveのアップロードスクリプトを使ってクラウドでバックアップするようにした。これで万が一自宅PCのデータがバックアップストレージからの復元すらできないような状況に陥っても、致命的な状況に陥るのは回避できそう。作ったプログラムはファイルをメモリに格納してからリクエストを作るからメモリ以上に大きいのは送れない。12:40:14http://all.rentafree.info/entry/725368↑読み込まずに直接送るように改良した。これで大きいファイルも転送できる。Driveでのバックアップを導入しようとしたが・・・[AD]rentafree.net。