1

友達。

個人の 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 機能と対話できる認証トークンを受け取るために、渡されたデータを含める必要があることです。

私の2つの質問

  1. Github が認識して受け入れるように、このデータをリクエストに追加するにはどうすればよいですか?
  2. 近いうちに、より大きなデータ セットを送信する必要がある同様の状況に陥ることが予想されます。より複雑な値のセット (ネストされた値を持つ大規模な辞書など) を渡すにはどうすればよいですか?

私が試したこと

値を送信する前に値をエンコードするために使用する必要があると言っているインターネットのことをいくつか見つけましたが、リストを期待し、タプルのリストを期待しurllib.urlencodeているため、それを機能させることができませんでした。scopesurlencode

私はここで何か愚かなことをしていると100%確信しているので、それが何であるか教えていただければ幸いです:)

ありがとう — さらに情報を提供すると回答が容易になるかどうか教えてください。

4

2 に答える 2

1

基本的に、あなたはすべてを正しくやっています。私はあなたのコードを試してみましたが、わずかな変更でうまく動作します。

何が起こるかは次のとおりです。

データを含めない場合、作成されるリクエストは実際には GET リクエストであり、承認のリストを取得します。これは、新しい承認を作成しないため、必要なものではありません。

データを含める場合、作成されるリクエストは POST リクエストであり、これが必要です。ただし、返されるステータス コードは 200 ではなく、201 です。そのため、コードを変更して 201 を確認し、JSON 本文からトークンを取得します。

于 2012-12-20T20:28:43.253 に答える
0

使用requestsするのは少し良いです:

app_name = 'your_app'

import requests, json

def create_github_oauth_token(user, password):

    # Check there isn't already an auth code for your app:
    r = requests.get('https://api.github.com/authorizations',
        auth=(user, password))
    for auth in r.json():
        if auth['note'] == app_name \
            and 'repo' in auth['scopes']:
            print "Retrieving existing token"
            print json.dumps(auth, indent=4)
            return auth['token']

    print "Creating new token"
    # Otherwise create a new token
    r = requests.post('https://api.github.com/authorizations',
        data=json.dumps({
            'scopes':['repo'],
            'note':app_name
            }),
        headers={'content-type':'application/json'},
        auth=(user, password)
    )
    return r.json()['token']
于 2013-01-06T14:51:42.533 に答える