Python
Chrome

Chrome Web Store Publish APIを使ってみようよ

More than 3 years have passed since last update.

Chrome Web Storeに拡張機能等を公開する場合, manifest.jsonやら一式をzipで固めてフォームからアップロードして公開する必要があります.

この作業, 適当なシェルスクリプトを書いておけば済むんですけどもどうにも億劫で, デプロイする度に"うまいこと自動で出来たらいいのになー"と思ってたんですが, 最近調べたら公開作業とか自動で出来そうなAPIがありました.

Using the Chrome Web Store Publish API - Google Chrome

軽くみたところChrome Web Store向けのzipのアップロードや公開用のAPIが用意されているようです.

これはもう試すしかないっしょということで, さっそくコードを書いて動かしてみます.

コードの部分はPythonで書いていくよ.


準備はGoogle Developer Consoleから

APIはGoogle Developer ConsoleにAPIの有効化とアプリケーションの登録を行った後, OAuth2で認証してから使えるようです.

まずはドキュメント通り, 以下の手順でAPIを有効化します.



  • Google Developer CenterへGo

  • 新しくプロジェクトを作るか, 既存のプロジェクトを1つ選択

  • 左サイドバーの APIと認証 をクリック

  • さらに項目が表示されるので, API をクリック

  • 有効なAPIを選択するページが開くので, Chrome Web Store API をONに

select-api.png

これでAPIの有効化は終わりです.

次はアプリケーションの登録を行いましょう.


アプリケーションの登録

クライアントIDを発行するわけですが, その前に 同意画面 にてサービスの情報を設定する必要があります.

agreement.png

最低限必要な内容はメールアドレスとサービス名だけです.

設定が済んだら 認証情報 から 新しいクライアントIDを発行 をクリックしてクライアントIDを発行しましょう.

(同意画面で設定を行っていない場合は同意画面の設定が表示されるようです)

いくつか種類を問われますが, 今回はスクリプトから動きを確認したいだけなので, "アプリケーションの種類"は インストールされているアプリケーション, "インストールされているアプリケーションの種類"は その他 を選択します.

最後に"クライアントIDを作成"をクリックすればアプリケーションの登録は完了です!

さらに, このあと使うので必要な認証情報をJSONでダウンロードしておきましょう.

画面右側表示されているクライアントID等の下部に JSONをダウンロード という項目があるため, そこから認証情報をJSONでダウンロードしておきます.


Python + oauth2clientでアクセストークンを取得

アプリケーションの登録が済んだら, あとはコードを書くだけです.

OAuth2の認証をしなければなりませんが, 今回はPythonと, ライブラリに oauth2client を使います.

ドキュメントは以下. インストールはpipで簡単に行えます.

OAuth 2.0 - Google APIs Client Library for Python — Google Developers

さて, まずはOAuthお決まりのアクセストークンの取得を行わないといけません.

oauth2clientでは, oauth2client.client.flow_from_clientsecrets() を使って一連の認証処理を行うクラスのインスタンスを生成できるようです.

第1引数に認証情報が記述されたJSONファイルを取り, ここで 先ほどダウンロードした認証情報のファイルパス を渡してあげます.

インスタンスを生成したら step1_get_authorize_url() でユーザーの同意を得るためのページのURLを生成し, そのページで同意を得て code を取得します.

取得したcodeを最後に step2_exchange() に渡してあげれば, 戻り値としてアクセストークンを得られる, というのが基本の使い方のようです.

取得したアクセストークンの保存には色々あるようですが, oauth2client.client.Storage を使ってローカルにファイルとして保存するのが手軽で良さそうです.

というわけで, アクセストークンを取得するコードはこんな感じになります.

同階層にある client_secrets.json を認証情報として使用し, 取得したアクセストークンを credentials.json として吐き出すようになってます.


get_access_token.py

# -*- coding: utf-8 -*-

from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage

flow = flow_from_clientsecrets(
'./client_secrets.json',
scope = 'https://www.googleapis.com/auth/chromewebstore', # 今回はChrome Web Storeだよ
redirect_uri = 'urn:ietf:wg:oauth:2.0:oob' # リファレンスより
)

print 'AUTHORIZE URL: ' + flow.step1_get_authorize_url()

code = raw_input('CODE: ')
credentials = flow.step2_exchange(code)

storage = Storage('./credentials.json')
storage.put(credentials)

print 'OK!'


実行すると認証用ページのURLが表示されるため, 遷移すると以下のようなページが開きます.

auth.png

ちなみに"同意画面"でメールアドレスの設定を忘れていたりすると, "no support email"等のエラーが表示されます.

その場合は各種設定を見直しましょう.

"承認する"をクリックすると, code の値となる文字列が画面に表示されます.

この値を実行中のスクリプトに渡してあげればOK.

これでアクセストークンの取得は完了です.

次はAPIを叩きますよ!


Chrome Web Store Publish APIを使う

アクセストークンを取得したら, いよいよAPIを叩くことができます.

APIのドキュメントは以下. 詳細なレスポンスについてはリンクを辿れば見ることができます.

https://developer.chrome.com/webstore/using_webstore_api#usingtheapi

リクエスト時のOAuth認証ですが, アクセストークンは保存時と同様, oauth2client.client.Storage を使用することで簡単に復元できます.

また, httplib2.Http を使うのであれば, authorize() を使って認証に必要な情報をリクエストに簡単に付加することができます.

これらを踏まえて書いた, Chrome Web Storeに拡張機能をアップロードするコードがコレ


upload.py

# -*- coding: utf-8 -*-

import sys
import httplib2
import json
from oauth2client.file import Storage

storage = Storage('./credentials.json') # 取得したアクセストークン
credentials = storage.get()

http = credentials.authorize(httplib2.Http())

with open(sys.argv[2], 'rb') as f:

# PUTでzipを送りつければアップロードできる
response = http.request(
'https://www.googleapis.com/upload/chromewebstore/v1.1/items/' + sys.argv[1],
method = 'PUT',
body = f
)

json = json.loads(response[1])

# 結果の表示
print 'State: ' + json['uploadState']
if 'itemError' in json:
print 'Error:'
for err in json['itemError']:
print err
else:
print 'Success!'


コマンドの引数にアプリケーションのIDとzipファイルのパスを取ります.

アップロードは, 自分が公開しているこいつでやってみましょう. アプリケーションのIDは, "lccmehdakcppjfimdcmkfadglefkkede"ですね

Stocking - Chrome ウェブストア

bonono/stocking - GitHub

公開しているコードをそのまま"extension.zip"で固め, スクリプトを実行してみます.

$ python upload.py "lccmehdakcppjfimdcmkfadglefkkede" extension.zip

State: FAILURE
Error:
{u'error_detail': u'Invalid version number in manifest: 0.4. Please make sure the newly uploaded package has a larger version in file manifest.json than the published package: 0.5.', u'error_code': u'PKG_INVALID_VERSION_NUMBER'}
$

すでにアップロードされているコードよりもバージョン番号を新しくするよう怒られてしまいました.

バージョンを少し上げて再度アップロードしてみます.

$ python upload.py "lccmehdakcppjfimdcmkfadglefkkede" extension.zip

State: SUCCESS
Success!
$

できたような.

stocking.png

ドラフト版としてアップロードされてますね.

今回は使ってませんが, 全員/テスター用に公開するAPIもアップロードと同じくらい簡単に使えそうですよ.

GitHubでPRがマージされたらテスター用に公開したりとか, 色々出来そうですね.