在开发应用程序时,经常需要使用各种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']))
最后,有了用户的电子邮件,可以显示个人信息等等...