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

題記:我的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)。

微博開放平臺(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)證身份惹谐。


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

這一驗(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

url

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


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

其中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è)多大合理沽翔?我有些困惑兢孝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仅偎,隨后出現(xiàn)的幾起案子跨蟹,更是在濱河造成了極大的恐慌,老刑警劉巖橘沥,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窗轩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡威恼,警方通過查閱死者的電腦和手機(jī)品姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門寝并,熙熙樓的掌柜王于貴愁眉苦臉地迎上來箫措,“玉大人,你說我怎么就攤上這事衬潦〗锫” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵镀岛,是天一觀的道長(zhǎng)弦牡。 經(jīng)常有香客問我友驮,道長(zhǎng),這世上最難降的妖魔是什么驾锰? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任卸留,我火速辦了婚禮,結(jié)果婚禮上椭豫,老公的妹妹穿的比我還像新娘耻瑟。我一直安慰自己,他們只是感情好赏酥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布喳整。 她就那樣靜靜地躺著,像睡著了一般裸扶。 火紅的嫁衣襯著肌膚如雪框都。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天呵晨,我揣著相機(jī)與錄音魏保,去河邊找鬼。 笑死何荚,一個(gè)胖子當(dāng)著我的面吹牛囱淋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播餐塘,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼妥衣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了戒傻?” 一聲冷哼從身側(cè)響起税手,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎需纳,沒想到半個(gè)月后芦倒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡不翩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年兵扬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片口蝠。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡器钟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妙蔗,到底是詐尸還是另有隱情傲霸,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站昙啄,受9級(jí)特大地震影響穆役,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梳凛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一耿币、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧韧拒,春花似錦掰读、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雇初,卻和暖如春拢肆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背靖诗。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工郭怪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人刊橘。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓鄙才,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親促绵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子攒庵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容