Github api在使用python传递json数据时提供404+;urllib2

Github api在使用python传递json数据时提供404+;urllib2,python,json,post,urllib2,github-api,Python,Json,Post,Urllib2,Github Api,我有以下代码,它应该执行在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

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

curl -H 'Authorization: token <token>' https://api.github.com/
curl-H“授权:令牌”https://api.github.com/
不工作(返回“无效凭据”):

curl-H“授权:令牌”https://api.github.com/
不工作(“未找到”):

curl-H'Authorization:token'--data“json…”https://api.github.com/repos///downloads

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

数据不是应该是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))
data={“name”:“test”,“size”:“4”}
req=urllib2.请求(“https://api.github.com/repos///downloads")
请求添加标题(“授权”、“令牌”+“”)
结果=urllib2.urlopen(req,urllib.parse.urlencode(数据))

我终于能够明白为什么它不起作用了

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


我必须向授权中添加正确的作用域才能使其工作。

v3 github api有一个很好的特性,可以将标记转换为html。请求此信息不需要身份验证,因此在深入研究更复杂的身份验证世界之前,它是一个很好的示例

国家:

呈现任意标记文档

后期/降价输入

文本必需字符串-要呈现的标记文本

甚至给出一个要转换的标记字符串的示例:

{"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


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

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


希望这对某些人有所帮助。

对于varesa或@pelson来说,使用curl的“稍微不同的方法”是什么?你不能在这里使用该方法吗?@blahdiblah不同的方法使用-u“user:passwd”而不是授权令牌。我尝试使用token和curl,同样的问题AttributeError:“module”对象没有属性“parse”。我运行的是Python2.6.6No,V3API将JSON作为POST数据。文档()的第一段指出:“所有数据都以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))
{"text": "Hello world github/linguist#1 **cool**, and #1!"}
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())
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']
# 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']