6

http://developer.linkedin.com/documents/authenticationで LinkedIn 認証を使用しており、投稿する必要があります。たとえば、次のようなGETリクエストを作成することに精通しています。

client = oauth.Client(consumer, access_token)
resp,content = client.request("http://api.linkedin.com/v1/people/~?format=json", "GET", "")

Oauth認証を使用したもの。ただし、認証の Post 部分では、次のような文字列の例を POST する必要があります。

https://www.linkedin.com/uas/oauth2/accessToken?grant_type=authorization_code
                                           &code=AUTHORIZATION_CODE
                                           &redirect_uri=YOUR_REDIRECT_URI
                                           &client_id=YOUR_API_KEY
                                           &client_secret=YOUR_SECRET_KEY

私の簡単な質問は、AUTHORIZATION_CODEを返したので、Oauthを使用せずに(それが正しいアプローチであると仮定して)これを行うための最良の方法を理解することに関連しています。これが簡単な質問である場合はお詫び申し上げます。

言い換えれば、上記の形式の文字列があります。投稿を実行するにはどうすればよいですか?

cURL を使ってみました。しかし、ポスト行でコードが失敗することがわかりました: c.perform()。私が使用しているコードは次のとおりです。

   accesscode = request.GET.get('code')
    redirect_uri = 'http://www.example.com'
    url_post = 'https://www.linkedin.com/uas/oauth2/accessToken'
    postdata = urllib2.quote('grant_type=authorization_code&code='+accesscode+'&redirect_uri='+redirect_uri+'&client_id='+consumer_key+'&client_secret='+consumer_secret)
    #return HttpResponse(postdata)

    c = pycurl.Curl()
    c.setopt(c.URL, url_post)
    c.setopt(c.POSTFIELDS, postdata)
    c.setopt(c.VERBOSE, True)
    c.setopt(c.FAILONERROR, True)
    c.perform()

次のエラーが表示されます。

error at /loginsuccess/
(22, 'The requested URL returned error: 400 Bad Request')

認証の最初の段階を取得する方法のコードを次に示します (LI ドキュメントで提案されているように)。

def login(request):
    redirect_uri       =   urllib2.quote('http://127.0.0.1:8080/loginsuccess')
    codeURL = "https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=c3skrqz5wqmm&scope=r_fullprofile&state=DCEEFWF45453sdffef425&redirect_uri=" + redirect_uri
    return HttpResponseRedirect(codeURL)

これは、以下に提案されているコードを使用してデータを投稿した後に取得した最新のトレースバックです。トレース後に概説するいくつかの質問があります。

エラー:

HTTPConnectionPool(host='127.0.0.1', port=8888): URL: https://api.linkedin.com/uas/oauth/accessTokenで最大再試行回数を超えました(原因: [Errno 111] 接続が拒否されました)

環境:

Request Method: GET
Request URL: http://127.0.0.1:9000/loginsuccess/?code=AQQKMnhjMNKFEu08DkftejkNLQgSz-mIsMZtE36rGxrLfycx331iLXeC3LdAq63OTQeATAEXrA7FxgHSJWVHyh_iWyIEzVR6jp4zJsz41tpRipS14RE&state=DCEEFWF45453sdffef425

Django Version: 1.4.5
Python Version: 2.7.4
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/brett/LinkedIn/brett/brett/views.py" in loginsuccess
  68.   r = requests.post(access_token_url, data=postdata)
File "/usr/local/lib/python2.7/dist-packages/requests/api.py" in post
  88.     return request('post', url, data=data, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/api.py" in request
  44.     return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py" in request
  335.         resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py" in send
  438.         r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py" in send
  327.             raise ConnectionError(e)

Exception Type: ConnectionError at /loginsuccess/
Exception Value: HTTPConnectionPool(host='127.0.0.1', port=8888): Max retries exceeded with url: https://api.linkedin.com/uas/oauth/accessToken (Caused by <class 'socket.error'>: [Errno 111] Connection refused)

さらに、リクエスト情報にはまだ POST データがないように見えます。

要請情報

GET 変数 値 状態
u'XX' コード
u'XX' POST POST データなし FILES FILES データなし

詳細はこちら。

Request Method: GET
Request URL:    http://127.0.0.1:9000/loginsuccess/?code=XXX&state=XXX
Django Version: 1.4.5
Exception Type: ConnectionError
Exception Value:    
HTTPConnectionPool(host='127.0.0.1', port=8888): Max retries exceeded with url: https://api.linkedin.com/uas/oauth/accessToken (Caused by <class 'socket.error'>: [Errno 111] Connection refused)
Exception Location: /usr/local/lib/python2.7/dist-packages/requests/adapters.py in send, line 327
Python Executable:  /usr/bin/python

Fiddler results:

HTTP/1.1 302 Found
Server: Apache-Coyote/1.1
P3P: CP="CAO DSP COR CUR ADMi DEVi TAIi PSAi PSDi IVAi IVDi CONi OUR DELi SAMi UNRi PUBi OTRi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT POL PRE"
X-LI-UUID: dI14TYAfd/RHJ8mVmAN8Gg==
Location: http://127.0.0.1:9000/loginsuccess?code=XX=XX
Content-Language: en-US
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Thu, 05 Sep 2013 19:26:48 GMT
X-Li-Fabric: PROD-ELA4
Set-Cookie: _lipt=deleteMe; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Set-Cookie: leo_auth_token="XX"; Version=1; Max-Age=1799; Expires=Thu, 05-Sep-2013 19:56:47 GMT; Path=/
Set-Cookie: sl="delete me"; Version=1; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Set-Cookie: sl="delete me"; Version=1; Domain=.www.linkedin.com; Max-Age=0; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
Set-Cookie: lang="v=2&lang=en-us"; Version=1; Domain=linkedin.com; Path=/
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Cache-Control: no-cache, no-store
Age: 1
Transfer-Encoding: chunked
Connection: keep-alive
X-Li-Pop: PROD-IDB2

14
�����������������
0
4

1 に答える 1

20

requests (install with )を見てみましょpip install requestsう。わずか数行のコードで簡単に POST リクエストを作成できます。

import requests

accesscode = request.GET.get('code')
redirect_uri = 'http://www.example.com'
url = 'https://www.linkedin.com/uas/oauth2/accessToken'
# ... your code ...

postdata = {
    'grant_type': 'authorization_code',
    'code': accesscode,
    'redirect_uri': redirect_uri,
    'client_id': consumer_key,
    'client_secret': consumer_secret,
}

r = requests.post(url, data=postdata)
print(r.status_code)
print(r.text)

Python シェルでこれを試すことができます。これは十分に簡単だと思うからです。

于 2013-08-19T18:56:53.820 に答える