題記:我的API入門學(xué)習(xí)筆記牧嫉,歡迎交流指正牡彻。本文在博客園也有發(fā)布:https://www.cnblogs.com/codestack123/p/10816013.html乎澄,簡(jiǎn)書里增加了一些配圖囚灼。
回顧API使用的流程
通過百度地圖API的使用特铝,我理解API調(diào)用的一般流程為:生成API規(guī)定格式的url->通過urllib讀取url中數(shù)據(jù)->對(duì)json格式的數(shù)據(jù)進(jìn)行解析。下一步棍郎,開始研究新浪微博API的使用其障。
準(zhǔn)備
新浪微博開放平臺(tái)是新浪微博API的使用平臺(tái)。
用微博賬號(hào)登錄該平臺(tái)后涂佃,申請(qǐng)成為開發(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īng)用/應(yīng)用信息/高級(jí)信息“一項(xiàng),點(diǎn)擊進(jìn)入并設(shè)置OAuth2.0授權(quán)回調(diào)頁相關(guān)信息伯病,如果不知道填什么好造烁,可以設(shè)置為默認(rèn)回調(diào)頁: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)要說明(感興趣的同學(xué)請(qǐng)查看網(wǎng)上文檔示意圖):通過該協(xié)議敞葛,第三方應(yīng)用可以獲得用戶授權(quán),然后用該許可從授權(quán)服務(wù)器獲得令牌(Token)与涡,用于后續(xù)從API服務(wù)器查詢數(shù)據(jù)時(shí)驗(yàn)證身份惹谐。
這一驗(yàn)證環(huán)節(jié)增加了url生成的復(fù)雜度持偏,好在網(wǎng)站上已經(jīng)有廖雪峰老師提供的SDK工具包:sinaweibopy(廖老師的github地址好像改過名字,因此網(wǎng)上很多舊鏈接無效氨肌,這個(gè)是新的有效鏈接)鸿秆,但是這一程序是基于python2環(huán)境編寫的,python3有些系統(tǒng)庫有更改怎囚,程序調(diào)用時(shí)經(jīng)常報(bào)錯(cuò)卿叽。而作為python入門者,改寫程序以適應(yīng)python3環(huán)境無疑是一件困難的事恳守。幸好有大神做了這一工作考婴,感謝owolf針對(duì)python3改寫的SDK:sinaweibopy3,我使用過催烘,正常運(yùn)行沥阱,大家可以下載赋咽。在這里同時(shí)推薦owolf的文章全網(wǎng)最詳:python3調(diào)用新浪微博API接口獲取數(shù)據(jù)拉鹃。
簡(jiǎn)單示例
下面介紹一下我使用新浪微博API的過程,為新入門的同學(xué)提供參考揭斧。
1.參數(shù)設(shè)置
import sinaweibopy3
import webbrowser
import json
APP_KEY =' 填入你的App Key'
APP_SECRET=' 填入你的App Secret'
REDIRECT_URL =' 填入你的授權(quán)回調(diào)頁'
注:
- 該文件需要和sinaweibopy3.py放在同一個(gè)文件夾里舰始。
- 填寫的三項(xiàng)信息都是在準(zhǔn)備中提到的信息崇棠。
這里談?wù)勎掖中拇笠庠斐傻囊粋€(gè)bug,也給大家提個(gè)醒丸卷。一開始我運(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)用的開發(fā)者:XXX 或者稍后再試。
錯(cuò)誤碼:21322 重定向地址不匹配
查找網(wǎng)上的解決方法范抓,要設(shè)置回調(diào)頁骄恶,但是在前面的步驟里我已經(jīng)設(shè)置了,怎么還會(huì)有這個(gè)問題匕垫?后來看到一篇文章中提到回調(diào)頁地址和程序中的REDIRECT_URL要一致僧鲁,我想到了程序示例是http://api.weibo.com/oauth2/default.html,用的是http:
開頭象泵,我在填寫時(shí)看到地址一樣寞秃,就沒有改動(dòng),而網(wǎng)站上是https:
開頭偶惠,一個(gè)'s'
之差春寿,當(dāng)時(shí)覺得是一個(gè)地址,沒想到相差大矣忽孽!
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這一過程谢床。當(dāng)程序運(yùn)行到client.request_access_token
時(shí),會(huì)彈出輸入提示"please input code: "厘线,要求輸入code识腿?這是什么意思呢?打開瀏覽器就會(huì)看到出現(xiàn)了OAuth2.0驗(yàn)證回調(diào)頁造壮,地址欄一項(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))
而通過查看數(shù)據(jù)結(jié)構(gòu)伟众,可以提取特定信息。例如用以下代碼輸出用戶微博昵稱召廷、地點(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)注列表竞慢,怎么辦呢先紫?讓我們來試著編寫出相應(yīng)的函數(shù)。
1.查看新浪微博API定義的url: https://api.weibo.com/2/friendships/friends.json
以及定義的請(qǐng)求參數(shù):access_token, uid, screen_name, count, cursor, time_status筹煮。
其中access_token需要填寫遮精,uid和screen_name分別是用戶id和昵稱,二者必填且只填一項(xiàng)败潦。(注:接口升級(jí)后本冲,只能為當(dāng)前授權(quán)用戶) count, cursor可使用默認(rèn)參數(shù)。count是單頁返回記錄條數(shù)劫扒,默認(rèn)為5檬洞,最大不超過5,cursor返回結(jié)果的游標(biāo)沟饥。trim_status是顯示status字段的開關(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ù)艾杏,可以寫出一個(gè)類似的函數(shù):
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默認(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)注的人的列表汹族,包括基本信息及最新微博。編寫以下代碼其兴,提取最新微博內(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'])
以下是我還在思考的問題顶瞒,歡迎交流指教,謝謝元旬!
1榴徐、請(qǐng)求參數(shù)設(shè)置里count不大于5,我在實(shí)際運(yùn)行程序時(shí)只看到4個(gè)關(guān)注用戶及微博正文匀归,能否讀取更多用戶坑资,如何讀取穆端?
2袱贮、我還嘗試了編寫statuses/home_timeline(獲取當(dāng)前登錄用戶及其所關(guān)注(授權(quán))用戶的最新微博)的查詢函數(shù),但是因?yàn)閰?shù)設(shè)置問題体啰,顯示結(jié)果為Null(空)攒巍。我認(rèn)為問題出在max_id參數(shù)上,說明中指出:若指定此參數(shù)荒勇,則返回ID小于或等于max_id的微博柒莉,默認(rèn)為0,但是設(shè)多大合理沽翔?我有些困惑兢孝。