python メソッド内で例外処理を行う方法
python3でTwitterAPIにリクエストを送り、返ってきた値を格納するというコードを書きました。
①ライブラリでOAuth認証をする
②twitterAPIにリクエストを送る
③APIのリクエスト上限をrequests_limitに格納する
という内容になっています。
この①のOAuth認証の例外処理の部分をメソッドにしたいのですがうまくかけません。例外処理でTwitterへのリクエストがうまくいかなかった時、OAuth認証をやり直し再度実行するメソッドを書きたいのです。
from requests_oauthlib import OAuth1Session
CK = "xxxxx" #Consumer key
CS = "xxxxx" #Consumer secret
AT = "xxxxx" #Access token
AS = "xxxxx" #Access token secret
twitter = OAuth1Session(CK, CS, AT, AS)#認証処理
request_status_url = "https://api.twitter.com/1.1/statuses/retweets/:id.json"#リクエストURL
for i in range(3):#適当に3回
#↓↓↓↓↓メソッドにしたいところ↓↓↓↓↓
try:
api_response = twitter.get(request_status_url )
except:
twitter = OAuth1Session(CK, CS, AT, AS)
continue
#↑↑↑↑↑メソッドにしたいところ↑↑↑↑↑
requests_limit = api_response.headers['x-rate-limit-remaining']#リクエスト可能残数の取得
print(str(i)+":"+str(requests_limit))
上記は正常に動作しますが下記のように認証部分メソッドにするとtry文が正常に動作しません。どのようにしたら正常に動くのか、書き方についてアドバイスをいただけたら幸いです。
from requests_oauthlib import OAuth1Session
def request_authorization (request_status_url,CK,CS,AT,AS):
try:
api_response = twitter.get(request_status_url)
except:
twitter = OAuth1Session(CK,CS,AT,AS)
api_response = request_authorization(request_status_url)
return api_response
CK = "xxxxx" #Consumer key
CS = "xxxxx" #Consumer secret
AT = "xxxxx" #Access token
AS = "xxxxx" #Access token secret
twitter = OAuth1Session(CK, CS, AT, AS)#認証処理
request_status_url =
"https://api.twitter.com/1.1/statuses/retweets/:id.json"#リクエストURL
for i in range(3):#適当に3回
api_response = request_authorization(request_status_url,CK, CS, AT, AS)
requests_limit = api_response.headers['x-rate-limit-remaining']#リクエスト可能残数の取得
print(str(i)+":"+str(requests_limit))
上記のコードを実行した時のエラーコード。
UnboundLocalError Traceback (most recent call last)
<ipython-input-7-25ff3a35d752> in request_authorization(request_status_url, CK, CS, AT, AS)
3 try:
----> 4 api_response = twitter.get(request_status_url)
5 except:
UnboundLocalError: local variable 'twitter' referenced before assignment
During handling of the above exception, another exception occurred:
TypeError Traceback (most recent call last)
<ipython-input-7-25ff3a35d752> in <module>()
15 for i in range(3):#適当に3回
16 #↓↓↓↓↓メソッドにしたいところ↓↓↓↓↓
---> 17 api_response = request_authorization(request_status_url,CK, CS, AT, AS)
18 #↑↑↑↑↑メソッドにしたいところ↑↑↑↑↑
19 requests_limit = api_response.headers['x-rate-limit-remaining']#リクエスト可能残数の取得
<ipython-input-7-25ff3a35d752> in request_authorization(request_status_url, CK, CS, AT, AS)
5 except:
6 twitter = OAuth1Session(CK,CS,AT,AS)
----> 7 api_response = request_authorization(request_status_url)
8 return api_response
9 CK = "yGWfCjVCS4uFHRA4q08RIWM2u" #Consumer key
TypeError: request_authorization() missing 4 required positional arguments: 'CK', 'CS', 'AT', and 'AS'
ちなみになぜOAuth認証が一回だけでないのかというと、APIからの大量の値の取得を行い、実行が数時間に及んだ時、OAuth認証が切れる時があるからです。認証が切れた時のエラーコードは以下です。
Traceback (most recent call last):
〜〜
〜〜
ConnectionResetError: [Errno 54] Connection reset by peer
During handling of the above exception, another exception occurred: