這兩天陸續使用了好幾個網站的 API ,很是不爽 ,所以寫一個簡單的小結在這裏 ,僅供參考 ,如有錯誤 ,請在回覆中指出 。
注意: 寫下這段文字的時間是 2012 年 12 月 9 日 ,這些內容的變化是非常快的 。
OAuth 版本
這是最令人頭疼的問題 ,不同的網站使用不同版本的 OAuth ,而 OAuth 1.0 和 2.0 不互相兼容 。甚至即便使用 OAuth 2.0 的網站 ,也有不同的 API 調用方法 。
在我使用的幾個網站中 ,Twitter 、Fitbit 和飯否使用的是 OAuth 1.0 。而 foursquare 、人人網和新浪微博使用的是 OAuth 2.0 標準 。 (注: 這些信息來自它們的文檔)
按照 OAuth 工作組 Hourse Luke 的說法 ,兩個版本相比 ,對開發者來說最大的不同是 ,OAuth 2.0 中 ,access token 不是長期有效的了 。但實際上 ,通過查閱 foursquare 、人人網和新浪微博的文檔 ,它們的對 token 的描述各有不同:
- foursquare 說 ,它的 access token 是不會過期的
- 新浪微博說 ,對於普通應用 ,access token 的有效期是 7 天 ,過期之後用戶必須 重新授權
- 人人網說 ,它的 access token 會在一定時間內過期 ,但是可以用 refresh token 來換新的 access token ,而 refresh token 是長期有效的
這簡直是蛋疼的要死 。
解決方案
對我來說 ,寫這個程序的目的是把 fitbit 和 foursquare 的信息同步到國內的網站上 ,它們本身支持同步信息到 Twitter 和 facebook 。所以我起初的思路是想辦法把信息從 Twiiter 同步到飯否等網站上 ,於是我找到了月光博客的這篇文章 ,作者寫了一個以 Twitter 爲中心的同步工具 。遺憾的是 ,這個工具是將近三年前的了 ,由於各網站的更新 ,代碼已經完全無法使用了 。
所以只能設法自己寫一個了 。
對於我的需求 ,其實是不需要寫一個多麼複雜的應用的 。因爲只是寫給自己用的 。遺憾的是 ,在這麼多網站中 ,只有 Twitter 考慮到了用戶的這種需求 ,Twitter 提供了 「Single-user OAuth」 ,這樣無需使用任何工具 ,即可得到供自己使用的 access token 和 access secret 。
對於其他網站 ,則必須自己來生成了 。在此 ,推薦使用 python-oauth2 這個項目 。項目的 README
中有一個 OAuth 的示例 。使用這個程序即可非常方便的獲得 OAuth 1.0 網站 (fitbit 和飯否) 的 access token 。而且文檔中同樣給出了非常簡潔的使用示例 ,可以直接拿來使用 。
對於 OAuth 2.0 則沒有這麼方便了 。剛纔說過 ,不同網站的策略不一樣 。這裏簡單描述一下:
foursquare
可以通過 foursquare-app-framework 迅速得到一個應用框架 ,我們需要做的就是根據文檔去修改參數 ,然後填充自己的代碼即可 。
人人網
人人網則要相對麻煩一些 。
要解決的第一個問題是 ,如何得到 access token 和 refresh token 。我的做法是 ,從它的開發手冊中下載一個 php-connect 程序 ,然後部署到一個 php 服務器上 ,得到 refresh token 和 access token 。
然後 ,我們可以在人人網的開發指南中找到 Python SDK ,這樣我們就可以通過 access token 去訪問數據了 。
但是這裏有一個問題 ,人人的 access token 是會過期的 ,所以方便起見 ,在每次調用 API 前 ,可以用長期有效的 refresh token 先換取 access token ,再訪問 API 。
新浪微博
這貨竟然要每 7 天授權一次 ,還是不用比較好 。
小結
前文提到的 Hourse Luke 這個人在 2012 年 7 月辭掉了 OAuth 2.0 的首席作和和校訂者 ,從標準中刪掉了自己的名字 ,然後離開了工作組 。
他說: 如果你現在用 1.0 用得很成功 ,就忽略掉 2.0 吧 。