【问题标题】:Github-api giving 404 when passing json-data with python + urllib2使用 python + urllib2 传递 json-data 时,Github-api 给出 404
【发布时间】:2012-07-24 06:36:52
【问题描述】:

我有以下代码,它应该执行在 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)

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

问题一定出在 json 上,或者是我发送它的方式,但我无法弄清楚问题出在哪里。 &lt;...&gt; 的字符串在实际代码中是正确的,我只是从帖子中删除了它们

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

已测试:

Works(返回想要的 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 令牌授权似乎(至少部分)有效。但是当这些放在一起时,它就停止工作了。

【问题讨论】:

  • 对于 varesa 或@pelson,使用 curl 的“略有不同的方法”是什么?这里不能用那个方法吗?
  • @blahdiblah 不同的方法是使用 -u "user:passwd" 而不是授权令牌。我尝试了令牌和卷曲,同样的问题

标签: python json post urllib2 github-api


【解决方案1】:

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

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

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

【讨论】:

  • 哦,好吧,我以为我们遇到了同样的问题,因此获得了赏金。我将添加我自己的解决方案,这可能会在未来帮助其他人(包括我)。
【解决方案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']

希望对某人有所帮助。

【讨论】:

    【解决方案3】:

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

    API docs 状态:

    渲染任意 Markdown 文档

    POST /markdown 输入

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

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

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

    鉴于此信息,让我们为该 Markdown 的 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,而更可能是身份验证(正如您已经回答的那样)。

    【讨论】:

      【解决方案4】:

      数据不应该是 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))
      

      【讨论】:

      • AttributeError:“模块”对象没有“解析”属性。我正在运行 python 2.6.6
      • 不,v3 API 将 JSON 作为 POST 数据。文档的第一段 (developer.github.com/v3) 指出:“所有数据都以 JSON 格式发送和接收。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      相关资源
      最近更新 更多