新浪微博的API官方提供了很多種調用方式,支持編程的,歸根結底就是兩種:
1.基於Oauth協議,使用Open API。(http://open.weibo.com/wiki/%E6%8E%88%E6%9D%83%E6%9C%BA%E5%88%B6%E8%AF%B4%E6%98%8E)
2.使用Weibo JS-SDK(http://open.weibo.com/sdk/js )。
官方的方式總是顯得很麻煩。我們來探討一下,能不能通過非官方的方法,免AppKey、免認證、Ajax跨域調用新浪微博API呢?
Web 2.0時代,短鏈服務非常流行。新浪的短鏈服務域名是t.cn,這個域名實在是非常短,沒辦法更短了。
打開新浪微博API的官方文檔,關於短鏈服務是這樣的描述的:
以上列舉的方法調用都大同小異。我們再以第一個方法short_url/shorten為例。打開詳細說明:http://open.weibo.com/wiki/2/short_url/shorten
我們來分析一下這一段說明:
1.是否需要登錄:否。這很關鍵,既然不需要登錄,我們的“免認證”就好發揮了。
2.頻次限制:是。這也很關鍵,這意味着如果我們按照官方的方式,調用次數將非常受限。
3.支持格式:JSON。其實根據實驗,新浪微博不僅支持JSON,還支持JSONP,只是文檔沒告訴我們罷了。這也很關鍵。因為有了JSONP,就意味着可以方便的跨域了。
4.URL:https://api.weibo.com/2/short_url/shorten.json 。其實這也是騙人的。HTTPS必定會影響速度。經過實驗,直接把HTTPS改為HTTP,仍然是OK的。
接下來逐個攻破難點。
一,使用JQuery+JSONP跨域。
參考文檔:http://baike.baidu.com/view/2131174.htm
Jquery對JSONP非常友好,只需要在AJAX調用時指明dataType : jsonp就可以了。
二,頻次限制問題。
既然不需要登錄,頻次限制問題就可以繞過。因為AppKey本身是半公開的。我們可以很輕松地Google到一大堆牛逼應用的Appkey。
例如 :
iphone新浪微博客戶端 App Key:5786724301
iPad新浪客戶端App Key:2849184197
Google.Nexus浪客戶端App Key:1206405345
周博通微博管家App Key:202088835
Weico App Key:211160679
以上列舉的這些AppKey,都是來自於一些用戶量非常多的手機應用,它們的頻次限制非常寬松的,幾乎可以理解為“不限制”。為了解決頻次限制問題,我們用它們的Appkey就可以了。
另外:新浪微博API的頻次限制是有兩個維度的,服務IP維度和用戶IP維度。http://open.weibo.com/wiki/Rate-limiting 。這一點與本文無關,因為Javascript在客戶端運行。但如果您想對本文提到的方法進行改裝,使用C#或其他高級語言在服務器端進行調用的話,就要注意服務器IP維度了。
您現在可以直接在瀏覽器中訪問這個地址:
http://api.weibo.com/2/short_url/shorten.json?source=2849184197&url_long=http://www.cnblogs.com
瀏覽器中將顯示
{"urls":[ {"result":true,"url_short":"http://t.cn/h5FGy","url_long":"http://www.cnblogs.com","type":0} ]}
通過訪問上述的地址,您已經得到了http://www.cnblogs.com的段地址:http://t.cn/h5FGy
注意我們使用的是http而非https,不需要使用https,上文已經提到了。
四、最終代碼示例
最終代碼的示例參考這里http://haotaoqu.com/item-45.html
這個示例將一個又臭又長的淘寶客URL地址轉換為了新浪短地址。
Javascript代碼如下:
<script type="text/javascript">
$(document).ready( function(){
var j=$("#urlText");
var i=$("#goumai");
$.ajax({//使用iPad新浪微博客戶端的Appkey
url: 'http://api.weibo.com/2/short_url/shorten.json?source=2849184197&url_long='+i[0].href,
type: "GET",
dataType: "jsonp", //使用JSONP方法進行AJAX
cache: false,
success: function (data) {
j.val ( data.data.urls[0].url_short); //處理返回數據,顯示到網頁上
});
}});
});
</script>
五、除short_url/shorten外,其他可以用此方法調用的API
凡是標記為“是否需要登錄:否”的接口都可以通過本文的流氓方法進行調用。打開http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2 官方文檔慢慢選吧~