4

次のコードがあります。これは、githubで新しいダウンロードを作成する最初の部分を実行する必要があります。POSTを使用してjson-dataを送信する必要があります。

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-stringをPOSTしようとすると、404エラーが発生します。

問題はjsonにあるか、送信方法にあるはずですが、問題が何であるかを理解できません。の文字列<...>は実際のコードに含まれています。投稿から削除しました。

コマンドラインでもほぼ同じように試し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トークン認証は(少なくとも部分的に)機能しているようです。しかし、これらを組み合わせると、機能しなくなります。

4

4 に答える 4

3

なぜうまくいかなかったのか、ようやく解決できました。

認証トークンの認証スコープが正しく設定されていませんでした。私が使用していたトークンは、変更を行うことを「承認」されておらず、それを使用して何かを変更しようとする (ダウンロードを追加する) すべてのアクションが失敗しました。

それを機能させるには、正しいスコープを承認に追加する必要がありました。

于 2012-07-17T21:03:03.390 に答える
2

認証なしでJSONデータをV3APIにPOSTする方法について回答しましたが、元の問題はOAUTHトークンを正しく設定していないことにあることがわかったので、プログラムで解決策を提供すると思いました。 1つ(この実装は、スクリプトが実行されるたびにトークンを取得しますが、実際には1回だけ実行され、トークンはローカルに保存されます)。

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']

それが誰かを助けることを願っています。

于 2012-07-23T22:36:52.910 に答える
1

v3 github api には、マークダウンを html に変換できる優れた機能があります。この情報を要求するのに認証は必要ないため、よりトリッキーな認証の世界に入る前に試してみる良い例になります。

API ドキュメントの状態:

任意の Markdown ドキュメントをレンダリングする

POST /マークダウン入力

text 必須 string - レンダリングする 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

データは JSON ではなく、URL エンコードされることを意図していませんか? 試す:

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 に答える