Twitter x OAuth x Python = Tweepy

先說一句,我不喜歡 Twitter 廢除其 API 原有只使用 username/password 的 Basic User Authentication 方法。

因為我覺得 twitter 在宣佈有關功能停用日子之時,不太多 twitter 程序使用 twitter oauth (FAQ)。加上我所使用的 python-twitter 版本並不支援 oauth,一直也找不到任何包含 oauth 的 python-twitter 開發版本 (dev version)。也是說我除了需要改 @weatherhk@tctrack@tropicalhk 的程式之外,也需要另找一個 python lib 取代 python-twitter。(氣!)

Tweepy 與 Twitter OAuth

訴苦完後,讓我進入正題了。

試過不同的 twitter oauth python library,到最後一刻才發現 joshthecoder 寫的 tweepy,而我也可以容易地把 tweepy 在我原來的 python code 上 get it work。

在開發 Twitter oauth 應用軟件前,要先到 Twitter 登記自己的應用軟件,來取得代表自己應用軟件本身一對的 consumer key 和 consumer secret。在以下程式例子,我用了 appkey 和 appsecret 變數來代表這 pair key 和 secret。

然後,應用軟件需要問 Twiiter 取得用某戶帳號的存取權限,那麼再需要另一 pair key 和 secret,稱為 access token。取得用戶授權自己應用軟件的 token,可以先透過 get_authorization_url() 來提供「要求授權」的網址給某用戶 (如本文最頂的圖片)。

在用戶准許後,Twitter 回傳一個「授權碼」給用戶。然後應用程式取得「授權碼」後,可以透過 get_access_token() 來取得 access token。應用程式自行儲存這 access token 後,每次只需重新使用這 token,便可取得用某戶帳號的存取權限。

OAuth 與 Twitter OAuth 的好處

OAuth 相比 username/password 除了不用儲存用戶名稱和密碼外,就算用戶變更帳號密碼,也不用修改應用程式中的用戶密碼。而且 Twitter 的 OAuth 提供大一倍的 rate limit。以往除了知名 twitter clients 外,經 twitter API 發出的 tweet 只會標明 via API。但現在經由 twitter oauth api 發出,則可以如本文下圖一樣,標明應用程式的名稱 (例如 via sammy.hk)。

由舊 Twitter API 轉換至新 Twitter OAuth API

最後,我在原有以上三個會在 twitter 發 tweets 的氣象程式中,大約作了類似以下修改。為了更方便大家明白,所以以下程式是從我的程式改動過的。

首先載入 library 一行….

把:

import twitter

換為:

import tweepy

Twitter 用戶認證部份由簡單一兩行……

把:

if config.tweeting_feature = yes:
tweetit = twitter.Api(username=config.myusername, password=config.mypassword)

換為:

if config.tweeting_feature = yes:
tweetauth = tweepy.OAuthHandler(config.appkey, config.appsecret)
if (config.userkey == ”):
print ‘Authorization URL: ‘ + tweetauth.get_authorization_url()
verifier = raw_input(‘Verifier:’)
tweetauth.get_access_token(verifier)
print ‘config.userkey = ‘ + tweetauth.access_token.key
print ‘config.usersecret = ‘ + tweetauth.access_token.secret
else:
tweetauth.set_access_token(config.userkey, config.usersecret)
tweetit = tweepy.API(tweetauth)

到出 tweet 時……

把:

tweetit.PostUpdate(u”今天天氣好好好!”)

換為:

tweetit.update_status(u”根據李氏力場理論,發出八號烈風或暴風信號機會為零! XDDD”)