本文實做如何使用 OAUTH2 PKCE 的方法,來取得不同帳號間的 access token,如此可以只用一支程式控制多個帳號。
由於需要回到 callback url ,所以使用 flask 以及搭配 tweepy 來實做整體的操作。
這份實做是參考 twauth_web 來做的,替我省了不少工夫。
首先在 twitter 上需進行以下設定
在程式一開始除了啟動 flask 外,我們還需要去連接 twitter server 來取得 handler。範例如下
oauth2_user_handler = tweepy.OAuth2UserHandler(
client_id=Client_ID,
redirect_uri="http://127.0.0.1:5000/callback",
scope=["tweet.read","tweet.write", "users.read", "follows.read", "follows.write", "like.read", "like.write", "offline.access"],
# Client Secret is only necessary if using a confidential client
client_secret=Client_Secret,
)
此外要在 flask 的首頁中開啟 session ,不然在頁面轉換時,會因為 session id 不同,而導致與 twitter 的認證無法通過。
@app.route('/')
def hello():
session_secret_key= os.urandom(24)
app.config['SECRET_KEY'] =session_secret_key
app.config['SESSION_COOKIE_NAME'] = "my_session"
return render_template('index.html', SECRET_KEY=session_secret_key)
@app.route('/callback')
def callback():
app.config['SECRET_KEY'] =session_secret_key
app.config['SESSION_COOKIE_NAME'] = "my_session"
然後透過下面這行,來產生連到 twitter 做驗證的連節
authorize_url= oauth2_user_handler.get_authorization_url()
點入連結後,可以看到以下畫面。
在點下 Authorize app 後,會回到你所提供的 callback 頁面,這時就可以用取得的 state 和 code ,再去要求 access token ,也因此重複此步驟,你可以得到不同 twitter 帳號的 token 來操作。
response= "http://127.0.0.1:5000/callback?state="+oauth_state+"&code="+oauth_code
access_token = oauth2_user_handler.fetch_token(response)
雖然我們有使用 offline.access 來取得 token ,但 twitter 仍只給這個 token 兩個小時的有效時間,所以可以用以下的方是來更新 token ,達到一直可以使用的目的,範例如下,
new_access_token= oauth2_user_handler.refresh_token(access_token["refresh_token"])
access_token= new_access_token
由於 ESSENTIAL 只能用 APIv2,且我們又用 ouath2 ,所以很多指令要多給 user_auth= False ,才能確保指令可以被執行。
client.like(tweet_id, user_auth= False)
client.retweet(tweet_id, user_auth= False)
如果你也遇到 oauthlib.oauth2.rfc6749.errors.InsecureTransportError 的問題,可以設定以下參數去避開。
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
最後要注意的是由於 ESSENTIAL 給與的流量不大,所以很容易不小心爆掉。以我自己為例,我剛上線時,應該是指令短時間內送太快,結果 app 整個被限制,並於八小時後被封鎖。還好可以砍掉重練。