【发布时间】:2012-12-19 20:23:29
【问题描述】:
朋友。
我正在编写一个简短的脚本,它将获取一个人的 Github 登录名并使用它来查询 Github API 以获取授权令牌。代码如下:
def getGithubAuth():
"Get a Github auth token and return it"
gist_data = json.dumps({"scopes":["gist"]})
req = urllib2.Request(auth_url)
base64str = base64.encodestring("%s:%s" % \
(github_user, github_pass)).replace('\n','') # user/pass vars are declared elsewhere
req.add_header("Authorization", "Basic %s" % base64str);
req.add_data(gist_data) # <- including this makes problems
try:
response = urllib2.urlopen(req)
except urllib2.URLError, e:
print "Something broke connecting to Github: %s" % e
return None
if response.getcode() == 200:
jresp = json.loads('\n'.join(response.readlines()))[0]
return jresp['token']
return None
如果我删除了add_data 调用,请求将起作用并返回一个身份验证令牌。问题是,我需要包含传递给 add_data 的数据,以便接收能够与 Github 的 gist 工具交互的身份验证令牌。
我的两个问题
- 如何将此数据添加到我的请求中,以便 Github 识别并接受它?
- 我预计很快会发现自己处于类似情况,需要发送大量数据;我将如何传递一组更复杂的值(例如带有嵌套值的大型字典等)?
我的尝试
我发现一些互联网上的东西说我应该在发送值之前使用urllib.urlencode 对值进行编码,但是我无法完成这项工作,因为scopes 需要一个列表而urlencode 需要一个列表元组列表。
我 100% 确定我在这里做了一些愚蠢的事情,所以如果你能告诉我那是什么,我将不胜感激 :)
谢谢——如果提供更多信息会使回答更容易,请告诉我。
【问题讨论】:
-
你遇到了什么错误?
-
当我在
add_data中包含这些内容时,API 会返回 404“未找到”错误。如果省略add_data,我会得到 200。
标签: python github urllib2 github-api