4

我有以下代码,它应该执行在 github 上创建新下载的第一部分。它应该使用 POST 发送 json 数据。

jsonstring = '{"name": "test", "size": "4"}'
req = urllib2.Request("https://api.github.com/repos/<user>/<repo>/downloads")
req.add_header('Authorization', 'token ' + '<token>')
result = urllib2.urlopen(req, jsonstring)

如果我, jsonstring从 中删除urlopen(),它不会失败,并为我提供可用下载列表。但是,如果我尝试发布 json 字符串,则会收到 404 错误。

问题必须与json有关,或者在我发送它的方式上,但我无法弄清楚问题是什么。的字符串在<...>实际代码中是正确的,我只是从帖子中删除了它们

我在命令行上尝试了大致相同curl的方法,但身份验证方法略有不同,并且成功了。

测试:

作品(返回想要的json):

curl -u "user:password" --data "json..." https://api.github.com/repos/<user>/<repo>/downloads

作品:

curl -H 'Authorization: token <token>' https://api.github.com/

不起作用(返回“无效凭据”):

curl -H 'Authorization: token <invalid_token>' https://api.github.com/

不起作用(“未找到”):

curl -H 'Authorization: token <valid_token>' --data "json..." https://api.github.com/repos/<user>/<repo>/downloads

这似乎不是特定于 python 代码的问题。json POST 数据似乎很好,OAuth 令牌授权似乎(至少部分)有效。但是当这些放在一起时,它就停止工作了。

4

4 回答 4

3

我终于可以解决了,为什么它不起作用。

我没有正确设置授权令牌的授权范围。我使用的令牌没有被“授权”进行任何修改,并且使用它的每个尝试修改某些内容(添加下载)的操作都失败了。

我必须在授权中添加正确的范围才能使其工作。

于 2012-07-17T21:03:03.390 回答
2

我已经提供了一个关于如何在没有任何身份验证的情况下将 JSON 数据发布到 V3 API 的答案,但是当您发现最初的问题是没有正确设置您的 OAUTH 令牌时,我想我会提供一个编程解决方案来获取一个(此实现在每次运行脚本时都会获得一个令牌,而实际上它只会执行一次,并且令牌将存储在本地)。

import urllib2
import json
import getpass
import base64

# Generate a token from the username and password.
# NOTE: this is a naive implementation. Store pre-retrieved tokens if possible.
username = 'pelson'
passwd = getpass.getpass() # <- this just puts a string in passwd (plaintext)

req = urllib2.Request("https://api.github.com/authorizations")

# add the username and password info to the request
base64string = base64.encodestring('%s:%s' % (username, passwd)).replace('\n', '')
req.add_header("Authorization", "Basic %s" % base64string)

data = json.dumps({"scopes":["repo"], "note":"Access to your repository."})
result = urllib2.urlopen(req, data)
result = json.loads('\n'.join(result.readlines()))
token = result['token']

一旦你有了这个令牌,它就可以用于任何“repo”范围的操作。让我们向存储库添加一个新问题:

# add an issue to the tracker using the new token
repo = 'name_of_repo'
data = json.dumps({'title': 'My automated issue.'})
req = urllib2.Request("https://api.github.com/repos/%s/%s/issues" % (username, repo))
req.add_header("Authorization", "token %s" % token)
result = urllib2.urlopen(req, data)

result = json.loads('\n'.join(result.readlines()))
print result['number']

希望对某人有所帮助。

于 2012-07-23T22:36:52.910 回答
1

v3 github api 有一个很好的功能,它可以将 markdown 转换为 html。请求此信息不需要身份验证,因此它是一个很好的示例,可以在深入研究更棘手的身份验证世界之前尝试。

API 文档状态:

渲染任意 Markdown 文档

POST /markdown 输入

text 必需的字符串 - 要呈现的 Markdown 文本

甚至给出一个要转换的降价字符串的例子:

{"text": "Hello world github/linguist#1 **cool**, and #1!"}

鉴于此信息,让我们为该降价的 html 化版本构建一个 urllib2 请求。

import urllib2
import json


data = {"text": "Hello world github/linguist#1 **cool**, and #1!"}
json_data = json.dumps(data)

req = urllib2.Request("https://api.github.com/markdown")
result = urllib2.urlopen(req, json_data)

print '\n'.join(result.readlines())

结果是一些代表降价的html。

鉴于此示例,在发布您的请求时导致 404 的不是 JSON,而是更可能是身份验证(正如您已经回答的那样)。

于 2012-07-23T22:01:15.937 回答
-1

数据不应该是 URL 编码的,而不是 JSON 吗?尝试:

data = {"name": "test", "size": "4"}
req = urllib2.Request("https://api.github.com/repos/<user>/<repo>/downloads")
req.add_header('Authorization', 'token ' + '<token>')
result = urllib2.urlopen(req, urllib.parse.urlencode(data))
于 2012-07-17T20:22:24.423 回答