2017-10-29 115 views
0

我無法訪問twitter api。它給出了400個錯誤的請求。以前它給予未經授權的例外。有人可以幫我弄清楚我做錯了什麼?我正在編寫圖像上傳的代碼。我想我會先用普通方法後試圖再要補充文件上傳,但停留在錯誤的請求我在使用twitter api時遇到問題,它返回了400個不良請求

import oauth2 as oauth 
import json 
import urllib 
import urllib2 
from collections import namedtuple 
import time 
from hashlib import sha1 
import hmac 
import uuid 
import base64 


AUTHENTICATION="https://api.twitter.com/oauth2/token" 
REQUEST_TOKEN="https://api.twitter.com/oauth/request_token" 
AUTHORIZE_URL="https://api.twitter.com/oauth/authorize" 
ACCESS_TOKEN_URL="https://api.twitter.com/oauth/access_token" 


CONSUMER_KEY="" 
CONSUMER_SECRET="" 
ACCESS_KEY="" 
ACCESS_SECRET="" 

OAuth_Basic=namedtuple("OAuth_Basic", "oauth_consumer_key oauth_signature_method oauth_version") 
baseString=namedtuple("baseString", "timeStamp string nonce status") 
SendRequest=namedtuple("SendRequest", "method url timestamp upload") 



def basestring(oauth, access_key, body=None): 
    timestamp = str(int(time.time())) 
    nonce= base64.b64encode(str(uuid.uuid4().hex)) 
    basestring=percentencode("oauth_consumer_key") + "=" + percentencode(oauth.oauth_consumer_key) + "&" 
    basestring+=percentencode("oauth_nonce") + "=" + percentencode(nonce) + "&" 
    basestring+=percentencode("oauth_signature_method") + "=" + percentencode(oauth.oauth_signature_method) + "&" 
    basestring+=percentencode("oauth_timestamp") + "=" + percentencode(timestamp) + "&" 
    basestring+=percentencode("oauth_token") + "=" + percentencode(access_key) + "&" 
    basestring+=percentencode("oauth_version") + "=" + percentencode(oauth.oauth_version) 
    if body: 
     basestring+="&" + percentencode("status") + "=" + percentencode(body) 
    return baseString(timeStamp=timestamp, string=basestring, nonce=nonce, status=body) 

def sign_request(signature, consumer_secret, access_secret): 
    key = consumer_secret + "&" + access_secret 
    hashed = hmac.new(key, signature, sha1) 
    return hashed.digest().encode("base64").rstrip('\n') 


def signaturebasestring(request, basestr, upload=False): 
    if not upload: 
     return percentencode(request.method) + "&" + percentencode(request.url) + "&" + percentencode(basestr) 
    return percentencode(request.url) + "&" + percentencode(basestr) 


def sendrequest(s_oauth, s_basestring, s_request, s_signature): 
    oauth_header="OAuth oauth_consumer_key=\""+s_oauth.oauth_consumer_key+"\", oauth_nonce=\""+s_basestring.nonce+"\", oauth_signature=\""+percentencode(s_signature)+"\", oauth_signature_method=\""+s_oauth.oauth_signature_method+"\", oauth_timestamp=\""+s_request.timestamp+"\", oauth_token=\""+ACCESS_KEY+"\", oauth_version=\""+s_oauth.oauth_version+"\"" 
    headers = {"Authorization": oauth_header, "Content-type": "application/x-www-form-urlencoded", "Host":"api.twitter.com", "User-Agent":"OAuth gem v0.4.4", "oauth_consumer_key":s_oauth.oauth_consumer_key} 
    status = {"status":s_basestring.status} 
    encoded_args = urllib.urlencode(status) 
    req = urllib2.Request(s_request.url, encoded_args, headers) 
    try: 
     resp = urllib2.urlopen(req) 
     print resp 
    except urllib2.HTTPError, e: 
     print "httperror :" + str(e.code) 
     print e.reason 
    except urllib2.URLError, e: 
     print "urlerror :" + str(e.code) 
     print e.reason 
    except httplib.HTTPException, e: 
     print "httpexception :" + str(e.code) 
     print e.reason 


def percentencode(val): 
    return val.replace(" ", "%20").replace("!", "%21").replace("&", "%26").replace("/", "%2F").replace("=", "%3D").replace("+", "%2B").replace(",", "%2C").replace("-", "%2D").replace(".", "%2E") 

p_oauth=OAuth_Basic(oauth_consumer_key=CONSUMER_KEY, oauth_signature_method="HMAC-SHA1", oauth_version="1.0") 
p_basestring=basestring(p_oauth, ACCESS_KEY, "hello world") 
p_request = SendRequest(method="POST", url="https://api.twitter.com/1.1/statuses/update.json", timestamp=p_basestring.timeStamp, upload=False) 
signature=sign_request(signaturebasestring(p_request, p_basestring.string, False), CONSUMER_SECRET, ACCESS_SECRET) 
sendrequest(p_oauth, p_basestring, p_request, signature) 
+1

檢查響應主體,通常包含更詳細的錯誤信息。 – CBroe

+0

感謝Cbroe,{「錯誤」:[{「code」:215,「message」:「Bad Authentication data。」}}} 是我得到的錯誤。需要弄清楚出了什麼問題。 –

+0

400通常意味着您沒有正確登錄,或者您正在請求因權限而被禁止訪問的數據。昨天發生在我身上的是一個無效的令牌服務器。我希望提示有幫助。 – Saelyth

回答

0

我發現的錯誤。百分比編碼發生在小寫字母,改爲大寫字母,一切開始工作。有幾個網站幫助驗證了OAuth標題。 謝謝