前言:微博開放平台提供了微博數據的api接口,不僅可以直接通過api調用微博服務發布微博查詢微博,更重要的是,可以在自己的網站上獲得新浪微博api的授權,調用微博的某些內容,就好像我們再網站中看到好文章要分享到微博或者其他社交網站中一樣,非常方便。
下面就來探秘一番。
1.注冊開發者並獲取app key 和 app secret
百度很容易找到微博開放平台的入口,登錄自己的微博賬號,點擊賬號頭像,會提示編輯開發者信息。

可以看到如下的頁面,只需要按照提示填寫,其中緊急聯系人可以填自己,網站無所謂,填百度也行。

提交之后,你需要在我的應用下實名認證,上傳圖片時請耐心等待,有點慢而且沒有上傳進度。上傳之后點擊返回,可以跳轉到新頁面:

按照需要選擇,然后創建自己的應用。至於這里面各種應用名詞是什么意思我也不是很清楚,用着用着就熟了。我選擇的是其他應用


創建之后,會收到郵件,含有app key 和 app secret 。這是獲取授權的關鍵。
2.獲取token
首頁
http://open.weibo.com/ 點擊api接口,會跳轉到api接口說明文檔頁面,你會發現api有很多功能,包括創建微博,刪除微博,關注/取消關注等非常多的接口,但是每個接口都需要token才能訪問。token從何而來?
首先你需要獲取一個code碼,其次你需要有個調用接口的網址(因為我申請的是網頁應用)。
設置關聯的網址:

點擊你的應用名,然后在左邊的菜單中找到高級信息,然后就可以編輯了。

點擊api接口下
,進入授權接口查看用法


按照實例,你需要發一個get請求包含client_id和redirect_uri。可以直接拼接。
https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com/response&response_type=code
其中,client_id是你申請的app key,redirect_uri是自己要回調接口的地址,api會原樣返回。可以直接在瀏覽器輸入url,如下圖所示:

這個頁面是否有些熟悉呢?授權之后,網頁會跳回redirect_uri頁面,並且在url后面拼上code。於是code就有了
接下來獲取授權token,授權接口第二個:
頁面上有詳細的用法,發送http post請求,我用java的http-client4.5來做的,事實上其他方式也行。

代碼寫的比較爛,但是多少是可用的。5個必備參數值。我們已經獲取了最后兩個,前面兩個在郵件中。代碼就不貼出來了。看管自己敲一敲有利於熟悉用法,以后少不了發各種請求。
至此,我們成功授權,返回值里有需要的token值,如果返回error,請查看錯誤提示,或者百度錯誤信息。
此后只需要帶着token,就可以請求到各種接口,雖然有次數限制,不過如果正常使用應該足夠了。
后記:
1.本來我是想做一些類似於爬蟲的功能,想在微博開放接口中,拿點數據,不過縱覽api,多數是基於網頁應用的微博分享的功能,
比如獲取自己的微博,獲取粉絲,發微博,關注等,不是自己需要的。

2.前面提了,微博開放api主要是用於第三方網站或者app接入微博,用微博登陸或者通過api做微博分享,所以有這方面需求的完全可以深入研究一下api接口。
3.api接口中,get請求都可以直接拼接字符串獲取,但是對於剛剛請求授權的get請求來說,它是需要用戶的賬號同意授權給應用,所以必須要登錄用戶賬號,如果瀏覽器保有微博登陸后的cookie,那么瀏覽器能自動登錄從而拿到目標code,如果沒有就會提示登錄

因而這個請求適合在瀏覽器上做,因為用代碼發請求還要模擬登錄,或者使用登錄后的cookie,非常麻煩。不過api中其他get請求不會有這個問題,直接帶token即可。模擬登錄可以使用selenium的webdriver 拿到 cookie,其他模擬登錄的方式普遍非常麻煩。
當然,如果你內嵌到網站上,那登錄就是用戶的事了。
4.以發送微博 為例:
@Test public void test2() throws IOException { CloseableHttpClient client = HttpClients.createDefault(); CloseableHttpResponse response = null; RequestConfig config = RequestConfig.custom().setConnectTimeout(10000) .setSocketTimeout(10000).build(); HttpPost post = new HttpPost("https://api.weibo.com/2/statuses/update.json"); post.setConfig(config); List<NameValuePair> pairs = new ArrayList<>(); BasicNameValuePair p1 = new BasicNameValuePair("access_token",""); String content = "本條微博通過微博開放接口發送"; BasicNameValuePair p2 = new BasicNameValuePair("status", content); BasicNameValuePair p3 = new BasicNameValuePair("visible","0"); pairs.add(p1); pairs.add(p2); pairs.add(p3); post.setEntity(new UrlEncodedFormEntity(pairs,"utf-8")); response = client.execute(post); HttpEntity entities = response.getEntity(); System.out.println(EntityUtils.toString(entities,"UTF-8")); }
5.如果將開放api嵌入自己的網站中,大概做法是:在分享微博按鈕(第三方登陸按鈕)上,發送微博授權認證,用戶在網頁上點擊授權后,后台就獲得了code,以及能根據code獲取token。此后如果需要提取微博的用戶名,也就可以直接在后台發請求。如果是分享到微博,也可以通過api來做到。
如果以后實踐中用到了這些功能,再做記錄,本文到此為止。