Google Apps のGmailはドット('.') でメアドを増やせないので、とりあえずAliasでまとめて登録しようと思いました。
ドットでメアドを増やせない件
google appsのGmailは ドットでメアドを増やせない件について
Gmailのドットバリエーションを全部作る
このメアドをまとめて登録するのをAPIでやろうと思います。
google apps api の使い方
Google Apps のAPIは色々紆余曲折の後、ユーザ管理はProvisioningAPIからDirectoryAPIになって便利になった。RESTFulなAPIをOAuth2で認証して使うと簡単に使うことができる。
準備1 gem のインストール
google api を使うRubyモジュールがGoogle@github で公開されているのでソレを活用します。
gem install google-api-client
ローカルアプリ用のCredentialsを作る
google console で新規プロジェクト作成
Google Developer Console にアクセスして、新規プロジェクトを作ります。
コードサンプルを実行して感じをつかむ
サンプルプログラムの作成
client_secret.jsonと同じディレクトリに、ruby プログラムのファイルを作成し、テストしてみます。
このプログラムで、指定したユーザーのAlias.Listを取得します。
require 'pp' require 'google/api_client' require 'google/api_client/request' require 'google/api_client/client_secrets' require 'google/api_client/auth/installed_app' client = Google::APIClient.new( :application_name => 'Example Ruby application', :application_version => '1.0.0' ) directory = client.discovered_api('admin',"directory_v1") client_secrets = Google::APIClient::ClientSecrets.load("./client_secret.json") flow = Google::APIClient::InstalledAppFlow.new( :client_id => client_secrets.client_id, :client_secret => client_secrets.client_secret, :scope => ['https://www.googleapis.com/auth/admin.directory.user', 'https://www.googleapis.com/auth/admin.directory.user.alias'] ) client.authorization = flow.authorize(storage) req = Google::APIClient::Request.new({ :api_method => directory.users.aliases.list, :parameters => { 'userKey' => 'takuyaXXX@XXXXXx', }, }) req.headers['Content-Type']="application/json" result = client.execute(req) pp result.data
コレを実行すると、ブラウザが起動しOAuthのパーミッションを取得を聞いてきました。
Acceptしてプログラムを許可すると、localhost:9292 にリダイレクトされ、auth処理が完了。
APIが実行されUserKeyで指定したユーザーのAlias一覧が出てきます。
他にも幾つかAPIがあるので、それぞれを試して動作チェックしました。
APIのリファレンス
ユーザーの一覧取得、グループ一覧取得、Alias削除などなど。試してみると感じがつかめました。
APIのリファレンスの抜粋
https://developers.google.com/admin-sdk/directory/v1/reference/users/list
https://developers.google.com/admin-sdk/directory/v1/reference/users/aliases/list
APIのリファレンスには、OAuthが必須かどうか、OAuthで権限移譲するパーミッションのURLスコープが書かれているので、APIを利用時に適宜コード中の Scope を追加修正が必要。
Google のAPIにはOAuthが必要ないものもあるが、AdminAPIのDirectoryはOAuth必須だった。
まとめて登録。
OAuth結果の保存
まとめて登録するときに何度もパーミッションを聞いてくると、面倒なので。
OAuthの結果をファイルに保存してパーミッションが何度も聞かれることのないようにして、
連続処理できるように準備します。
Google::APIClient::FileStorage を使うと簡単にOAuthの状態を保存することが出来ました。MarshalとかJSONにしようと試みたけど、備え付けのライブラリを使うと簡単に出来来たので使うことにしました。
storage = Google::APIClient::FileStorage.new("auth_storage.json") storage.load_credentials() if storage.authorization then client.authorization = storage.authorization else client_secrets = Google::APIClient::ClientSecrets.load("./client_secret.json") flow = Google::APIClient::InstalledAppFlow.new( :client_id => client_secrets.client_id, :client_secret => client_secrets.client_secret, :scope => ['https://www.googleapis.com/auth/admin.directory.user', 'https://www.googleapis.com/auth/admin.directory.user.alias'] ) client.authorization = flow.authorize(storage) end
これで連続処理を出来るようになりました。
はまったエラー・メッセージ
invalid Email
POSTでメアド登録時にInvalid Email: alias_emailが何度も出るので、苦労した
req.headers['Content-Type']="application/json"
をつけて、POST時にはPOSTデータがJSONであることを明記しないと動かなった。
googleAppsを管理するGAM・・・
なぜか動かなかった。
APIを発見して指定する。
client.discovered_apis
require 'pp' require 'google/api_client' require 'google/api_client/request' require 'google/api_client/client_secrets' require 'google/api_client/auth/installed_app' require 'google/api_client/auth/file_storage' client = Google::APIClient.new( :application_name => 'Example Ruby application', :application_version => '1.0.0' ) client.discovered_apis client.discovered_apis.select{|e| e.name =~/admin/i} # => [ # #<Google::APIClient::API:0x3fdb292044c0 ID:admin:directory_v1>, # #<Google::APIClient::API:0x3fdb29203c3c ID:admin:email_migration_v2>, # #<Google::APIClient::API:0x3fdb29203444 ID:admin:reports_v1>, # #<Google::APIClient::API:0x3fdb292242fc ID:sqladmin:v1beta1>, # #<Google::APIClient::API:0x3fdb29223ce4 ID:sqladmin:v1beta3> # ]
このなかで、directory_v1 がそのまま名前になるのに気づかなくてハマった。
参考資料
Google の公式ドキュメント
https://developers.google.com/admin-sdk/groups-settings/downloads
https://developers.google.com/admin-sdk/directory/v1/get-start/getting-started
https://developers.google.com/admin-sdk/directory/v1/reference/users/aliases/list
https://developers.google.com/admin-sdk/directory/v1/reference/users/aliases/insert
https://developers.google.com/+/api/latest/activities
https://support.google.com/a/answer/60757?hl=en
Google API Ruby
Google APIをRubyで使う実装をGoogleが公開している(この他にもnodeやjavaなどもある→一覧
https://github.com/google/google-api-ruby-client-samples
https://github.com/google/google-api-ruby-client-samples/tree/master/googleplus
https://github.com/google/google-api-ruby-client-samples/tree/master/drive
GAM
GoogleApps Manager 関連ー今回のアイディアを思いついた元。だけど動かすの面倒だったし直接API叩くほうが楽だった。
GAMというPythonパッケージがAppsの管理に楽なコマンド類を提供してくれるが、仕組みがわかってないと使えないのでAPIを叩いて感じをつかんでない時に使うと、反って時間を無駄にした。
http://kimiyakitani.wordpress.com/2013/04/22/how-to-use-google-apps-manager/
https://code.google.com/p/google-apps-manager/wiki/GettingStarted