さて、私がやろうとしているのは、GoogleのプロビジョニングAPIを使用して、メンバーがGoogleコースビルダー(Google App Engineを搭載)内で登録/登録するときに、バックグラウンドでGoogleグループにメンバーを追加することです。
私が試した最初の方法は、 https://developers.google.com/google-apps/provisioning/#adding_a_member_to_a_groupに示すclientLoginメソッドを使用することでした。
groupClient = gdata.apps.groups.client.GroupsProvisioningClient(domain=domain)
groupClient.ClientLogin(email=email, password=password, source='apps')
groupClient.AddMemberToGroup(group_id, member_id)
これはAppEngineの外部で機能しましたが、実装後にいくつかのエラーが発生し、(http://stackoverflow.com/questions/13867535/python-import-gdata-google-apps-engine-course-builder) App Engineでの使用は廃止されたため、お勧めできませんでした。
私は今、ここにあるpythonプロビジョニングoAuthの例を使用してこれを達成しようとしています(https://developers.google.com/google-apps/help/libraries-samples#provisioningv2)
ソースは次のとおりです。
"""Sample for the Provisioning API and the Email Settings API with OAuth 2.0."""
__author__ = 'Shraddha Gupta <shraddhag@google.com>'
from optparse import OptionParser
import gdata.apps
import gdata.apps.emailsettings.client
import gdata.apps.groups.client
import gdata.client
import gdata.gauth
import httplib
API_VERSION = '2.0'
BASE_URL = '/a/feeds/group/%s' % API_VERSION
SCOPE = ('https://apps-apis.google.com/a/feeds/groups/')
HOST = 'apps-apis.google.com'
class OAuth2ClientSample(object):
"""OAuth2ClientSample object demos the use of OAuth2Token for retrieving
Members of a Group and updating Email Settings for them."""
def __init__(self, domain, client_id, client_secret):
"""
Args:
domain: string Domain name (e.g. domain.com)
client_id: string Client_id of domain admin account.
client_secret: string Client_secret of domain admin account.
"""
try:
self.token = gdata.gauth.OAuth2Token(client_id=client_id,
client_secret=client_secret,
scope=SCOPE,
user_agent='oauth2-provisioningv2')
self.uri = self.token.generate_authorize_url()
#print 'Please visit this URL to authorize the application:'
#print self.uri
# Get the verification code from the standard input.
#code = raw_input('What is the verification code? ').strip()
conn = httplib.HTTPConnection(self.uri)
conn.request("GET")
r1 = conn.getresponse()
print r1.read()
self.token.get_access_token(code)
except gdata.gauth.OAuth2AccessTokenError, e:
print 'Invalid Access token, Check your credentials %s' % e
exit(0)
self.domain = domain
self.baseuri = '%s/%s' % (BASE_URL, domain)
self.client = gdata.apps.groups.client.GroupsProvisioningClient(
domain=self.domain, auth_token=self.token)
# Authorize the client.
# This will add the Authorization header to all future requests.
self.token.authorize(self.client)
self.email_client = gdata.apps.emailsettings.client.EmailSettingsClient(
domain=self.domain, auth_token=self.token)
self.token.authorize(self.email_client)
def create_filter(self, feed):
"""Creates a mail filter that marks as read all messages not containing
Domain name as one of their words for each member of the group.
Args:
feed: GroupMemberFeed members whose emailsettings need to updated
"""
for entry in feed.entry:
user_name, domain = entry.member_id.split('@', 1)
if entry.member_type == 'User' and domain == self.domain:
print 'creating filter for %s' % entry.member_id
self.email_client.CreateFilter(user_name,
does_not_have_the_word=self.domain,
mark_as_read=True)
elif entry.member_type == 'User':
print 'User belongs to other Domain %s' %entry.member_id
else:
print 'Member is a group %s' %entry.member_id
def run(self, group):
feed = self.client.RetrieveAllMembers(group)
self.create_filter(feed)
def main():
sample = OAuth2ClientSample('mydomain.mygbiz.com',
'mydomain', 'My client secret')
sample.run('test')
if __name__ == '__main__':
main()
これは私のグループのメンバーをリストするだけだと思いますが、今は認証段階を通過しようとしています。
私が具体的に参照しているコードは次のとおりです。
#print 'Please visit this URL to authorize the application:'
#print self.uri
# Get the verification code from the standard input.
#code = raw_input('What is the verification code? ').strip()
conn = httplib.HTTPConnection(self.uri)
conn.request("GET")
r1 = conn.getresponse()
print r1.read()
self.token.get_access_token(code)
トークンの生の入力を受け取る元のコードをコメントアウトしました。これはバックグラウンドでシームレスに実行する必要があるため、トークンを自動的に取得する必要があります。httplibを使い始めましたが、URLにエラーが返されました。
いくつか質問があります。
まず、これは私がしなければならないことの最も簡単なアプローチですか、それはやり過ぎのようです。clientLoginは、はるかにエレガントでシンプルでした。
次に、この方法で行う必要がある場合、検証URLを取得したら、トークンをどのように正確に取得できますか?httplibを使用しますか?
Python内でブラウザをシミュレートすることを真剣に検討しています...なぜこのプロセスはそれほど複雑なのですか?
提供された助けは本当にありがたいです。
編集:私が最初にこれらすべてを行う理由は、これが数万から数十万のメンバーを持つことができるコースビルダーのMOOCの開発のためであることに注意したかっただけです。ディスカッションプラットフォームはGoogleグループになりますが、一般に公開することはできませんが、各メンバーを手動で承認することもできません。