Google Spreadsheetに論文リストを作っておいて、gdata apiでダウンロードして整形するというワークフローにしているのだけど、気がついたらダウンロードできなくなっていた。。。ログインそのものに失敗する。ユーザ名とパスワードというログインは今どきちょっとどうかと思っていたところなので、しょうがないのかもしれない。
で、Drive APIに移行。
-
- developer console でプロジェクトを選ぶ。もしくは作る。
- 左のAPIs & authから APIsを選んで、 Drive API を on にする。
- 左でcredentials を選択。oauth と public api access の2択になるのでoauthのほうを選ぶ。そのなかで installed applicationを選択。
- するとClient_ID と Client_secret という情報が出てくるのでこれをメモっておく。
- ダウンロードするプログラムはこんな感じ。
- FILE_ID はdrive でファイルを表示したURLのkey= の後ろの文字列
- download_url は本来fileオブジェクトからcsvを指定して取れるはずなのだが、なぜかとれない。多分バグなのでURLを自分で組み立てている。ここ、そのうち動かなくなる可能性大。
- open XXX を使ってブラウザにOAuth用のページを表示している。ここでacceptすると出てくる文字列を端末から入力するという面倒臭さ。
#!/usr/bin/python
import os
import sys
import httplib2
import pprint
from apiclient.discovery import build
from apiclient.http import MediaFileUpload
from oauth2client.client import OAuth2WebServerFlow
from apiclient import errors
def download_file(service, drive_file):
"""Download a file's content.
Args:
service: Drive API service instance.
drive_file: Drive File instance.
Returns:
File's content if successful, None otherwise.
"""
# download_url = drive_file['exportLinks']['text/csv']
download_url = 'https://docs.google.com/feeds/download/spreadsheets/Export?key=' + drive_file['id'] + '&exportFormat=csv'
if download_url:
resp, content = service._http.request(download_url)
if resp.status == 200:
# print 'Status: %s' % resp
return content
else:
print 'An error occurred: %s' % resp
return None
else:
# The file doesn't have any content stored on Drive.
return None
# Copy your credentials from the console
CLIENT_ID = 'XXXX'
CLIENT_SECRET = 'XXXXXXX'
#FILE_ID
FILE_ID = 'XXXXXXXX'
# Check https://developers.google.com/drive/scopes for all available scopes
OAUTH_SCOPE = 'https://www.googleapis.com/auth/drive'
# Redirect URI for installed apps
REDIRECT_URI = 'urn:ietf:wg:oauth:2.0:oob'
# Path to the file to upload
FILENAME = 'document.txt'
# Run through the OAuth flow and retrieve credentials
flow = OAuth2WebServerFlow(CLIENT_ID, CLIENT_SECRET, OAUTH_SCOPE,
redirect_uri=REDIRECT_URI)
authorize_url = flow.step1_get_authorize_url()
print 'Go to the following link in your browser: ' + authorize_url
os.system("open '" + authorize_url + "'")
code = raw_input('Enter verification code: ').strip()
credentials = flow.step2_exchange(code)
# Create an httplib2.Http object and authorize it with our credentials
http = httplib2.Http()
http = credentials.authorize(http)
drive_service = build('drive', 'v2', http=http)
drive_file = drive_service.files().get(fileId=FILE_ID).execute()
c = download_file(drive_service, drive_file)
f = open(sys.argv[1], 'w')
f.write(c)
f.close()
しかし定期的に動かなくなるな。。これがクラウドというものか。面倒だ。
0 件のコメント:
コメントを投稿