使用python呼叫新浪微博介面

pythontab發表於2013-04-25

微博很火啊,那python是不是可以呼叫微博的api做一個小應用呢?答案是:必須可以,哈哈

使用python呼叫weibo api
  
 # 呼叫的url地址  此為獲取某人的個人資訊的api  http://open.weibo.com/wiki/2/users/show
 the_url = 'https://api.weibo.com/2/users/show.json?uid=105729xxxx&access_token=2.xxx__YJBzk8g4Ddfd33f10237XXXXX'
  
 http_body = None
  
 # 傳送請求並讀取返回 返回的內容是真個html原始碼,或者json資料,可以透過檔案輸出或者包一層repr()來檢視內容
 req = urllib2.Request(the_url, data=http_body)
  
 #當然也可以用此來傳送請求,並讀取返回的內容是真個html原始碼,可以透過檔案輸出或者包一層repr()來檢視內容
 req = urllib2.Request("http://www.baidu.com", data=http_body)
  
 resp = urllib2.urlopen(req)
 print repr(resp.read())
  
  
  
 import json
 # 原配json工具
 json.loads(resp.read(), object_hook=_obj_hook)
  
  
 io = StringIO('["streaming API"]')
 print io.getvalue()
 # 輸出為 ["streaming API"] io輸出為一個StringIO物件 <cStringIO.StringI object at 0x1006aed80>
  
 # 注 json工具 提供load和loads2個方法
 json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
  
 json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
  
 其中fp 按照官方的解釋[http://docs.python.org/2/glossary.html#term-file-object]是面向檔案的系統,或者那種提供.read(),.write()方法的物件,比如上面的StringIO
 s 為普通的str或者unicode,相應json資料於python資料的對應如下
  
 [http://docs.python.org/2/library/json.html?highlight=object_hook#json-to-py-table]
 JSON    Python
 object    dict
 array    list
 string    unicode
 number (int)    int, long
 number (real)    float
 true    True
 false    False
 null    None
  
 # 轉換json資料
 如果json資料如此
 {
     "ip_limit": 1000,
     "limit_time_unit": "HOURS",
     "remaining_ip_hits": 1000,
     "remaining_user_hits": 146,
     "reset_time": "2013-04-19 15:00:00",
     "reset_time_in_seconds": 3286,
     "user_limit": 150
 }
 # 關於 object_hook 非必選函式 用於替換原本釣魚json.loads返回的一個dict,
 # json.loads返回的dict如果遇到一個不存在的量 比如"abc" 則會報錯,
 # 於是用object_hook 返回一個自己定義的dict 讓他在遇到"abc"這個不存在的變數時不直接反錯
 # 而是try catch一下 返回None  更穩定
  
 def _parse_json(s):
     ' parse str into JsonDict '
  
     def _obj_hook(pairs):
         ' convert json object to python object '
         o = JsonDict()
         # print pairs['list_id']
         print 'text' in pairs
         if 'text' in pairs:
             # it can output utf8
             print pairs['text']
         # --- 
         for k, v in pairs.iteritems():
             o[str(k)] = v
         return o
     #loads  is  different from load
     return json.loads(s, object_hook=_obj_hook)
  
 class JsonDict(dict):
     ' general json object that allows attributes to be bound to and also behaves like a dict '
  
     def __getattr__(self, attr):
         try:
             return self[attr]
         except KeyError:
             raise AttributeError(r"'JsonDict' object has no attribute '%s'" % attr)
  
     def __setattr__(self, attr, value):
         self[attr] = value
  
 # 此 JsonDict 是dict(字典物件)的子類 它重寫了 取索引的方法 __getattr__ 和 __setattr__
  
 # 這裡獲取dict裡的資料有個技巧 在獲取JsonDict的物件時有2中方法
 d1 = JsonDict();
  
 d1['a'] = 'strra'
 print d1['a']
 print d1.get('a')
 # 此 aaaa 並不在dict中
 print d1.get('aaaa')   # None
 print d1['aaaa']   # key error~
  
 # 使用get獲取dict裡的資料 遇到空的資料的話 可以避免error的產生 自動轉成None


相關文章