探索Google API与App Engine的结合使用

在开发应用程序时,经常需要使用各种API来丰富功能。Google提供了丰富的API服务,包括但不限于地图、日历、邮箱等。然而,当这些API不能满足特定需求时,就需要自己探索解决方案。作为一名多年的C#程序员,发现网络上有大量的教程和示例,几乎可以解决所有问题。但是,对于Google API和Google App Engine,这方面的资源似乎并不多。这可能是因为社区中愿意分享的人不多,但这并不是放弃的理由。

最近,正在开发一个运行在Google App Engine上的Web应用程序,它使用Picasa Web API。用户被重定向到OAuth站点以批准访问,然后会得到一个令牌,这很容易。获取相册、图片和视频的列表也很容易,但是获取用户信息呢?由于对Python和Google App Engine都不太熟悉,花了很长时间寻找解决方案,但一无所获。在睡前,不得不在StackOverflow上发布了一个问题,但这次并没有得到快速的回答。开始怀疑,难道只有一个人在做这样的事情吗?

问题是要获取用户的个人信息,如电子邮件、姓名等。开始阅读Picasa Web API的协议定义,但很快意识到需要的信息并没有被发送回来。因此,需要请求这些信息。在Google搜索了一番之后,发现了一些建议,比如使用Google Contacts API并获取联系人中的作者字段,这不是一个很漂亮的解决方案。

转向OAuth2.0 Playground,查看哪些Feed可以帮助获取用户信息。在Playground的列表中,没有找到太多有用的信息。其他一些服务确实提供了想要的信息,但想找的是直接回复想要的信息的服务。因此,转向了Google API Explorer。在那里,找到了几个符合需求的范围:

https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile

OAuthplayground中尝试这些范围,看看能从中获取哪些信息。

范围:https://www.googleapis.com/auth/userinfo.email

请求URL:

https://www.googleapis.com/userinfo/v2/me

响应:

{ "id": "113303504361682404626", "email": "puh.kallsbo@gmail.com", "verified_email": true }

这几乎正是在寻找的,需要电子邮件来获取gravatar。但为什么要在这里停止呢?让看看还有什么其他的信息。

范围:https://www.googleapis.com/auth/userinfo.profile

请求URL:

https://www.googleapis.com/userinfo/v2/me

响应:

{ "id": "113303504361682404626", "name": "Kristofer Källsbo", "given_name": "Kristofer", "family_name": "Källsbo", "link": "https://profiles.google.com/puh.kallsbo", "picture": "https://lh3.googleusercontent.com/-n6hDipRgm5k/AAAAAAAAAAI/AAAAAAAAVYY/XZd9zlnMmGk/photo.jpg", "gender": "male", "locale": "en" }

这几乎给了所有用户信息,但没有电子邮件。所以将这个与上面的结合使用是个好主意!

现在,知道在哪里可以找到信息。但是,如何访问它以及Picasa Web API呢?如果从这个示例开始:

def GetAuthSubUrl(): next = 'http://www.example.com/welcome.pyc' scope = 'https://picasaweb.google.com/data/' secure = False session = True gd_client = gdata.photos.service.PhotosService() return gd_client.GenerateAuthSubURL(next, scope, secure, session); authSubUrl = GetAuthSubUrl(); print '' % authSubUrl

需要为用户授权添加一个额外的范围。可以通过将字符串作为范围变量传递,而不是传递字符串列表,如下所示:

scope = ['https://picasaweb.google.com/data/', 'https://www.googleapis.com/auth/userinfo.email']

这将生成一个对两个范围都有效的令牌!按照Picasa Web API的示例,继续检索用户相册的列表,但然后呢?

#Setup a basic gdata client userClient = gdata.client.GDClient() #Create a gauth sub token object from the session token we already have in the gd_client oauthToken = gdata.gauth.AuthSubToken(gd_client.GetAuthSubToken()) #Get the request, this userinfo is in json response = userClient.request('GET','https://www.googleapis.com/userinfo/v2/me', oauthToken) #Parse the webresponse jobj = json.loads(response.read()) #Display self.response.write('Your email is: {0}'.format(jobj['email']))

开始一个gdata客户端,并使用它来检索JSON。逐行来看,实际上做了以下事情:

userClient = gdata.client.GDClient()

只是创建了一个Gdata客户端的实例。

oauthToken = gdata.gauth.AuthSubToken(gd_client.GetAuthSubToken())

检索已经在gd_client中使用的OAuth令牌,以便在Gdata客户端中使用,必须将其作为AuthSubToken或类似类型的对象传递。

response = userClient.request( 'GET', 'https://www.googleapis.com/userinfo/v2/me', oauthToken)

将返回一个标准的python httplib HTTPResponse,其中包含服务器返回的数据。

jobj = json.loads(response.read())

.read()函数返回HTTPResponse对象的主体,然后可以将其解析为json对象。

self.response.write( 'Your email is: {0}' .format(jobj[ 'email']))

最后,有了用户的电子邮件,可以显示个人信息等等...

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485