python編程之API入門: (二)python3中使用新浪微博API


回顧API使用的流程

通過百度地圖API的使用,我理解API調用的一般流程為:生成API規定格式的url->通過urllib讀取url中數據->對json格式的數據進行解析。下一步,開始研究新浪微博API的使用。

准備

新浪微博開放平台是新浪微博API的使用平台。用微博賬號登錄該平台后,申請成為開發者,創建一個新應用后會得到唯一的App Key和App Secret。(注:應用不需要提交審核,只要創建新應用系統就會分配Key和Secret)在"我的應用/應用信息/基本信息"中也可以查到這兩個信息。在這一頁面中還有”我的應用/應用信息/高級信息“一項,點擊進入並設置OAuth2.0授權回調頁相關信息,如果不知道填什么好,可以設置為默認回調頁:https://api.weibo.com/oauth2/default.html。這三項信息都是后面需要用到的,請復制保存到文檔。

微博API新特點

與百度地圖API相比,新浪微博API增加了OAuth2.0協議用於用戶身份驗證和授權。這里僅作簡要說明(感興趣的同學請查看網上文檔示意圖):通過該協議,第三方應用可以獲得用戶授權,然后用該許可從授權服務器獲得令牌(Token),用於后續從API服務器查詢數據時驗證身份。

這一驗證環節增加了url生成的復雜度,好在網站上已經有廖雪峰老師提供的SDK工具包:sinaweibopy(廖老師的github地址好像改過名字,因此網上很多舊鏈接無效,這個是新的有效鏈接),但是這一程序是基於python2環境編寫的,python3有些系統庫有更改,程序調用時經常報錯。而作為python入門者,改寫程序以適應python3環境無疑是一件困難的事。幸好有大神做了這一工作,感謝owolf針對python3改寫的SDK:sinaweibopy3,我使用過,正常運行,大家可以下載。在這里同時推薦owolf的文章全網最詳:python3調用新浪微博API接口獲取數據

簡單示例

下面介紹一下我使用新浪微博API的過程,為新入門的同學提供參考。

1.參數設置
import sinaweibopy3
import webbrowser
import json
APP_KEY =' 填入你的App Key'  
APP_SECRET=' 填入你的App Secret'
REDIRECT_URL =' 填入你的授權回調頁'

注:

  • 該文件需要和sinaweibopy3.py放在同一個文件夾里。
  • 填寫的三項信息都是在准備中提到的信息。

這里談談我粗心大意造成的一個bug,也給大家提個醒。一開始我運行程序時,每次都出現“重定向地址不匹配”的錯誤信息:

用微博帳號登錄出錯了!對第三方應用進行授權時出現錯誤,請您聯系第三方應用的開發者:XXX 或者稍后再試。
錯誤碼:21322 重定向地址不匹配

查找網上的解決方法,要設置回調頁,但是在前面的步驟里我已經設置了,怎么還會有這個問題?后來看到一篇文章中提到回調頁地址和程序中的REDIRECT_URL要一致,我想到了程序示例是http://api.weibo.com/oauth2/default.html,用的是http:開頭,我在填寫時看到地址一樣,就沒有改動,而網站上是https:開頭,一個's'之差,當時覺得是一個地址,沒想到相差大矣!

2.OAuth2.0驗證生成url
client = sinaweibopy3.APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)
url = client.get_authorize_url()
webbrowser.open_new(url)
result = client.request_access_token(input("please input code : "))
client.set_access_token(result.access_token, result.expires_in)

注意:這就是調用sinaweibopy3,實現OAuth2.0中用戶授權->獲取Token這一過程。當程序運行到client.request_access_token時,會彈出輸入提示"please input code : ",要求輸入code?這是什么意思呢?打開瀏覽器就會看到出現了OAuth2.0驗證回調頁,地址欄一項'code='后面有一串字符,這就是我們要的Token信息,把它復制后粘貼輸入,程序繼續運行。

3.從API讀取數據

運行下列代碼,可以讀取公共微博的數據並顯示結果。

result=client.public_timeline()
print(json.dumps(result,indent=2,ensure_ascii=False))

而通過查看數據結構,可以提取特定信息。例如用以下代碼輸出用戶微博昵稱、地點和最新微博正文。

number=result["total_number"]
print(number,"users:")
for u in result["statuses"]:
    print(u["user"]["screen_name"])
    print(u["user"]["location"])
    print(u["text"])

進階

如果要查詢其他信息,比如獲取用戶的關注列表,怎么辦呢?讓我們來試着編寫出相應的函數。
1.查看新浪微博API定義的url: https://api.weibo.com/2/friendships/friends.json 以及定義的請求參數:access_token, uid, screen_name, count, cursor, time_status。其中access_token需要填寫,uid和screen_name分別是用戶id和昵稱,二者必填且只填一項。(注:接口升級后,只能為當前授權用戶) count, cursor可使用默認參數。count是單頁返回記錄條數,默認為5,最大不超過5,cursor返回結果的游標。trim_status是顯示status字段的開關,0:返回完整status字段,1:僅返回status_id,默認為1。

2.在sinaweibopy3.py中是如何實現public_timeline()呢:

def public_timeline(self):       
        result = _http_get('%s'% (self.api_url)  + 'statuses/public_timeline.json',
                           access_token=self.access_token, 
                           count=50, 
                           page=1, 
                           base_app=0,
                )
        return result

對照代碼發現%s'% (self.api_url)就是https://api.weibo.com/2,我們只需要把 'statuses/public_timeline.json'改成'friendships/friends.json',並添加必填的請求參數,可以寫出一個類似的函數:

def fs_friends(self):
        result=_http_get('%s'% (self.api_url)  + 'friendships/friends.json', 
                             access_token=self.access_token, 
                             screen_name='填入你自己的微博昵稱' ,
                             trim_status=0,
        )
        return result

注:trim_status默認為1,設置為0才會得到完整status字段(其中包括最新微博正文)。

3.在自己的主程序中調用fs_friends()函數
參考原有的client.public_timeline(),得到以下代碼:

result = client.fs_friends()
print(json.dumps(result,indent=2,ensure_ascii=False))

這樣就可以看到關注的人的列表,包括基本信息及最新微博。編寫以下代碼,提取用戶昵稱、地點及最新微博內容:

for u in result['users']:
    print("\n",u['screen_name'])
    print(u['location'])
    if('status' not in u):
        print('not found\n')
        continue
    print(u['status']['text'])

以下是我還在思考的問題,歡迎交流指教,謝謝!

1.請求參數設置里count不大於5,我在實際運行程序時只看到4個關注用戶及微博正文,能否讀取更多用戶,如何讀取?
2.我還嘗試了編寫statuses/home_timeline(獲取當前登錄用戶及其所關注(授權)用戶的最新微博)的查詢函數,但是因為參數設置問題,顯示結果為Null(空)。我認為問題出在max_id參數上,說明中指出:若指定此參數,則返回ID小於或等於max_id的微博,默認為0,但是設多大合理?我有些困惑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM