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

題記:我的API入門(mén)學(xué)習(xí)筆記,歡迎交流指正。本文在博客園也有發(fā)布:https://www.cnblogs.com/codestack123/p/10816013.html,簡(jiǎn)書(shū)里增加了一些配圖。

回顧API使用的流程

通過(guò)百度地圖API的使用,我理解API調(diào)用的一般流程為:生成API規(guī)定格式的url->通過(guò)urllib讀取url中數(shù)據(jù)->對(duì)json格式的數(shù)據(jù)進(jìn)行解析。下一步,開(kāi)始研究新浪微博API的使用。

準(zhǔn)備

新浪微博開(kāi)放平臺(tái)是新浪微博API的使用平臺(tái)。

微博開(kāi)放平臺(tái)界面

用微博賬號(hào)登錄該平臺(tái)后,申請(qǐng)成為開(kāi)發(fā)者,創(chuàng)建一個(gè)新應(yīng)用后會(huì)得到唯一的App Key和App Secret。(注:應(yīng)用不需要提交審核,只要?jiǎng)?chuàng)建新應(yīng)用系統(tǒng)就會(huì)分配Key和Secret)在"我的應(yīng)用/應(yīng)用信息/基本信息"中也可以查到這兩個(gè)信息。在這一頁(yè)面中還有”我的應(yīng)用/應(yīng)用信息/高級(jí)信息“一項(xiàng),點(diǎn)擊進(jìn)入并設(shè)置OAuth2.0授權(quán)回調(diào)頁(yè)相關(guān)信息,如果不知道填什么好,可以設(shè)置為默認(rèn)回調(diào)頁(yè):https://api.weibo.com/oauth2/default.html。這三項(xiàng)信息都是后面需要用到的,請(qǐng)復(fù)制保存到文檔。

微博API新特點(diǎn)

與百度地圖API相比,新浪微博API增加了OAuth2.0協(xié)議用于用戶身份驗(yàn)證和授權(quán)。這里僅作簡(jiǎn)要說(shuō)明(感興趣的同學(xué)請(qǐng)查看網(wǎng)上文檔示意圖):通過(guò)該協(xié)議,第三方應(yīng)用可以獲得用戶授權(quán),然后用該許可從授權(quán)服務(wù)器獲得令牌(Token),用于后續(xù)從API服務(wù)器查詢數(shù)據(jù)時(shí)驗(yàn)證身份。


OAuth2—圖片來(lái)源:新浪微博開(kāi)放平臺(tái)

這一驗(yàn)證環(huán)節(jié)增加了url生成的復(fù)雜度,好在網(wǎng)站上已經(jīng)有廖雪峰老師提供的SDK工具包:sinaweibopy(廖老師的github地址好像改過(guò)名字,因此網(wǎng)上很多舊鏈接無(wú)效,這個(gè)是新的有效鏈接),但是這一程序是基于python2環(huán)境編寫(xiě)的,python3有些系統(tǒng)庫(kù)有更改,程序調(diào)用時(shí)經(jīng)常報(bào)錯(cuò)。而作為python入門(mén)者,改寫(xiě)程序以適應(yīng)python3環(huán)境無(wú)疑是一件困難的事。幸好有大神做了這一工作,感謝owolf針對(duì)python3改寫(xiě)的SDK:sinaweibopy3,我使用過(guò),正常運(yùn)行,大家可以下載。在這里同時(shí)推薦owolf的文章全網(wǎng)最詳:python3調(diào)用新浪微博API接口獲取數(shù)據(jù)。

簡(jiǎn)單示例

下面介紹一下我使用新浪微博API的過(guò)程,為新入門(mén)的同學(xué)提供參考。

1.參數(shù)設(shè)置
import sinaweibopy3
import webbrowser
import json
APP_KEY =' 填入你的App Key'  
APP_SECRET=' 填入你的App Secret'
REDIRECT_URL =' 填入你的授權(quán)回調(diào)頁(yè)'

注:

  • 該文件需要和sinaweibopy3.py放在同一個(gè)文件夾里。
  • 填寫(xiě)的三項(xiàng)信息都是在準(zhǔn)備中提到的信息。

這里談?wù)勎掖中拇笠庠斐傻囊粋€(gè)bug,也給大家提個(gè)醒。一開(kāi)始我運(yùn)行程序時(shí),每次都出現(xiàn)“重定向地址不匹配”的錯(cuò)誤信息:

用微博帳號(hào)登錄出錯(cuò)了!對(duì)第三方應(yīng)用進(jìn)行授權(quán)時(shí)出現(xiàn)錯(cuò)誤,請(qǐng)您聯(lián)系第三方應(yīng)用的開(kāi)發(fā)者:XXX 或者稍后再試。
錯(cuò)誤碼:21322 重定向地址不匹配

查找網(wǎng)上的解決方法,要設(shè)置回調(diào)頁(yè),但是在前面的步驟里我已經(jīng)設(shè)置了,怎么還會(huì)有這個(gè)問(wèn)題?后來(lái)看到一篇文章中提到回調(diào)頁(yè)地址和程序中的REDIRECT_URL要一致,我想到了程序示例是http://api.weibo.com/oauth2/default.html,用的是http:開(kāi)頭,我在填寫(xiě)時(shí)看到地址一樣,就沒(méi)有改動(dòng),而網(wǎng)站上是https:開(kāi)頭,一個(gè)'s'之差,當(dāng)時(shí)覺(jué)得是一個(gè)地址,沒(méi)想到相差大矣!

2.OAuth2.0驗(yàn)證生成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)

注意:這就是調(diào)用sinaweibopy3,實(shí)現(xiàn)OAuth2.0中用戶授權(quán)->獲取Token這一過(guò)程。當(dāng)程序運(yùn)行到client.request_access_token時(shí),會(huì)彈出輸入提示"please input code: ",要求輸入code?這是什么意思呢?打開(kāi)瀏覽器就會(huì)看到出現(xiàn)了OAuth2.0驗(yàn)證回調(diào)頁(yè),地址欄一項(xiàng)'code='后面有一串字符,這就是我們要的Token信息,把它復(fù)制后粘貼輸入,程序繼續(xù)運(yùn)行。

3.從API讀取數(shù)據(jù)

運(yùn)行下列代碼,可以讀取公共微博的數(shù)據(jù)并顯示結(jié)果。

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

而通過(guò)查看數(shù)據(jù)結(jié)構(gòu),可以提取特定信息。例如用以下代碼輸出用戶微博昵稱(chēng)、地點(diǎn)和最新微博正文。

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

進(jìn)階

如果要查詢其他信息,比如獲取用戶的關(guān)注列表,怎么辦呢?讓我們來(lái)試著編寫(xiě)出相應(yīng)的函數(shù)。
1.查看新浪微博API定義的url: https://api.weibo.com/2/friendships/friends.json

url

以及定義的請(qǐng)求參數(shù):access_token, uid, screen_name, count, cursor, time_status。


請(qǐng)求參數(shù)

其中access_token需要填寫(xiě),uid和screen_name分別是用戶id和昵稱(chēng),二者必填且只填一項(xiàng)。(注:接口升級(jí)后,只能為當(dāng)前授權(quán)用戶) count, cursor可使用默認(rèn)參數(shù)。count是單頁(yè)返回記錄條數(shù),默認(rèn)為5,最大不超過(guò)5,cursor返回結(jié)果的游標(biāo)。trim_status是顯示status字段的開(kāi)關(guān),0:返回完整status字段,1:僅返回status_id,默認(rèn)為1。
2.在sinaweibopy3.py中是如何實(shí)現(xiàn)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

對(duì)照代碼發(fā)現(xiàn)%s'% (self.api_url)就是https://api.weibo.com/2,我們只需要把 'statuses/public_timeline.json'改成'friendships/friends.json',并添加必填的請(qǐng)求參數(shù),可以寫(xiě)出一個(gè)類(lèi)似的函數(shù):

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

注:trim_status默認(rèn)為1,設(shè)置為0才會(huì)得到完整status字段(其中包括最新微博正文)。
3.在自己的主程序中調(diào)用fs_friends()函數(shù)
參考原有的client.public_timeline(),得到以下代碼:

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

這樣就可以看到關(guān)注的人的列表,包括基本信息及最新微博。編寫(xiě)以下代碼,提取最新微博內(nèi)容:

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'])

以下是我還在思考的問(wèn)題,歡迎交流指教,謝謝!
1、請(qǐng)求參數(shù)設(shè)置里count不大于5,我在實(shí)際運(yùn)行程序時(shí)只看到4個(gè)關(guān)注用戶及微博正文,能否讀取更多用戶,如何讀?。?br> 2、我還嘗試了編寫(xiě)statuses/home_timeline(獲取當(dāng)前登錄用戶及其所關(guān)注(授權(quán))用戶的最新微博)的查詢函數(shù),但是因?yàn)閰?shù)設(shè)置問(wèn)題,顯示結(jié)果為Null(空)。我認(rèn)為問(wèn)題出在max_id參數(shù)上,說(shuō)明中指出:若指定此參數(shù),則返回ID小于或等于max_id的微博,默認(rèn)為0,但是設(shè)多大合理?我有些困惑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容