上一節中建立了一個initclient包,封裝了授權的過程,通過擷取的myAPIClient對象可以直接調用API介面進行微博操作,上一節中就調用了發微博的介面發了一條新微博。這一節還是直接使用initclient包,調用擷取關注好友或粉絲的API來擷取好友資料,並將實現的擷取好友資訊的功能封裝在getfriends.py中,然後實現了main.py調用了其中的介面,擷取了好友資訊並列印出來,啟動並執行結果1所示。
圖1
【說明】:
(1)可以看出,授權過程跟上一節完全一樣,是從檔案中讀取的上一次成功授權的access_token,沒有重新進行授權;
(2)以列表的形式輸出了好友的幾項主要資訊:uid,性別,螢幕名稱和個人描述。
下面看一下getfriends.py的源碼:
#! /usr/bin/pythonimport timePAGE_SIZE = 200def print_users_list(ul): """ 列印使用者列表的詳細資料 """index = 0for user in ul:uid = user["id"]ugen = user["gender"]uname = user["screen_name"]#uloc = user["location"]udesc = user["description"]print "%-6d%-12d%-3s%s%s" % (index, uid, ugen, uname.ljust(20), udesc.ljust(40))index += 1def get_friends(client, uid=None, maxlen=0): """ 讀取uid使用者的關注使用者列表,預設uid=None,此時uid賦值為client.uid,而client.uid表示的是當前授權使用者的uid. """if not uid:uid = client.uidreturn get_users(client, False, uid, maxlen)def get_followers(client, uid=None, maxlen=0): """ 讀取uid使用者的粉絲列表,預設uid=None,此時uid賦值為client.uid,而client.uid表示的是當前授權使用者的uid. """if not uid:uid = client.uidreturn get_users(client, True, uid, maxlen)def get_users(client, followersorfriends, uid, maxlen): """ 調用API讀取uid使用者的關注使用者列表或者粉絲列表,followersorfriends為True讀取粉絲列表,為False讀取關注好友名單, 參數maxlen設定要擷取的好友名單的最大長度,為0表示沒有設定最大長度,此時會嘗試讀取整個好友名單,但是API對於讀取的 好友名單的長度會有限制,測試等級最大隻能擷取一個使用者的5000條好友資訊。 """fl = []next_cursor = 0while True:if followersorfriends:raw_fl = client.friendships.followers.get(uid=uid, cursor=next_cursor, count=PAGE_SIZE)else:raw_fl = client.friendships.friends.get(uid=uid, cursor=next_cursor, count=PAGE_SIZE)fl.extend(raw_fl["users"])next_cursor = raw_fl["next_cursor"]if not next_cursor:breakif maxlen and len(fl) >= maxlen:breaktime.sleep(1)return fl
【說明】:
(1)該模組中一共4個函數,get_friends和get_followers分別為擷取關注好友和粉絲的介面,print_users_list為列印好友詳細資料的介面。get_users為調用API的實現函數;
(2)擷取關注好友和擷取粉絲的API非常相似,前者是client.friendships.friends.get,後者是client.friendships.followers.get,所以我二者封裝在get_users函數中,通過參數followersorfriends表示要擷取的類型,介面get_followers和get_friends調用該函數,分別傳入True和False;
(3)get_users函數的最後一個參數maxlen設定要擷取的好友名單的最大長度,因為使用者的好友名單有可能非常長,不需要全部擷取時就可以設定maxlen。如果maxlen為0表示沒有設定最大長度,此時會嘗試讀取整個好友名單,為什麼說是“嘗試”呢?因為API對於好友名單的擷取時有限制的,測試等級最大隻能擷取一個使用者的5000條好友資訊(這個在官方文檔中有說明);
(4)調用API時有一個參數count=PAGE_SIZE,因為該API讀取好友名單時是按頁讀取的,該參數表示頁的大小(即好友資訊條數),預設為50,最大為200,這裡設定為200,這些官方文檔中都有詳細說明;
(5)調用API時有一個參數cursor,表示要讀取下一頁的首條記錄序號,每成功讀取一頁資料,資料中都包含了next_cursor屬性,下次繼續讀取時從next_cursor開始讀,關於cursor的詳細情況可以閱讀官方的API手冊;
(6)print_users_list列印好友詳細資料,其實詳細資料項目非常的多,這裡只是列印了其中的幾項,可以根據自己的需要修改。
下面看一下main.py的原始碼:
#! /usr/bin/pythonfrom initclient import initclientimport getfriendsAPP_KEY = '2024******'APP_SECRET = '91a57*************************'CALLBACK = 'http://bingbingrobot.sinaapp.com/'def main():client = initclient.get_client(APP_KEY, APP_SECRET, CALLBACK)print "===> creat client successfully, authorised uid is : ", client.uidprint "============================== users ===========================" #讀取當前授權使用者的粉絲列表fl = getfriends.get_followers(client)#讀取當前授權使用者的關注好友名單#fl = getfriends.get_friends(client) #讀取uid為‘1497035431’的使用者的粉絲列表 #uid = '1497035431'#梁斌penny#fl = getfriends.get_followers(client, uid=uid)getfriends.print_users_list(fl)if __name__ == '__main__':main()
【說明】:
有了授權模組initclient和擷取好友模組getfriends.py,main.py的內容就非常簡單了。建立myAPIClient對象,調用getfriends模組的get_friends或get_followers介面擷取好友資料,然後調用print_users_lis介面列印。非常簡單,不在囉嗦了!
【總結】:
這兩節中建立的initclient模組和getfriends模組都可以複用,開發其他功能時都可以直接使用,例如要對好友資訊進行統計(如統計男女比例、興趣分布、地區分布等)時,先用getfriends模組擷取好友名單。
By: