1. 程式人生 > >Java基於新浪微博SDK實現發微博的功能

Java基於新浪微博SDK實現發微博的功能

背景

最近用實現了一個簡單的發微博的功能。
新浪微博的SDK已經經歷了多次更新,而網上的資料、教程大多還是基於舊版本的,很多細節上有了一些變化。本文將基於最新的新浪微博SDK介紹發微博的過程。

簡介

首先,需要在新浪微博開放平臺建立自己的應用,獲取App Key與App Secret兩個字串。
然後,下載新浪微博SDK。在配置檔案中填入上一步獲得點的AppKey與App Secret,以及回撥地址。
執行例子程式中的weibo4j.examples.oauth2裡的Oauth4Code.java,將會引導使用者對你建立的應用授權。
授權完成後,一個code將會被傳到回撥地址。
將這個code輸入控制檯,會得到一個access_token。
利用這個access_token就可以呼叫發微博API了。

詳解

建立應用

進入新浪微博開放平臺
點選上方的微連線-其他,開始建立新應用。
填入應用名稱,選擇應用型別。在以前,”站內應用”是一個很方便的型別。但是現在已經沒了,我選擇的是”客戶端”-“桌面”-“windows”。
建立成功後,進入應用基本資訊頁面,其中,App Key和App Secret已經生成了。
然後要進入 應用資訊-高階資訊-Oauth2授權設定 設定回撥地址。如下圖所示。
這裡寫圖片描述
在這個簡單的發微博功能中,我們不會真正用到回撥地址。將回調地址設為百度是個不錯的選擇。

新浪微博SDK

新浪微博SDK下載
本以為新浪微博SDK會是一個jar包,結果卻是一堆原始碼與資原始檔,以及許多例子程式。
下載後,編輯Config.properties配置檔案。
client_ID :appkey
client_SERCRET :app secret
redirect_URI : 回撥地址
這三個引數都必須跟上一步得到的保持一致。
執行例子程式中的weibo4j.examples.oauth2裡的Oauth4Code.java,將會開啟預設瀏覽器,進入應用授權介面。
授權成功後,將會跳轉到回撥地址(我們填入的是百度),
位址列中顯示的是http://www.baidu.com/?code=******************


**************複製下來,填入控制檯。
code填入控制檯
輸入code。
如果輸入正確,access_token將被輸出。
access_token有多個鍵值對,閱讀原始碼可知道AccessToken.getAccessToken()方法可以取出其中的access_token字串。這個字串就是我們需要的“令牌”。
而傳送微博的功能只需要兩行程式碼即可實現

Timeline tm = new Timeline("前面得到的access_token");
tm.updateStatus("微博內容");

demo

這裡給出一個簡單的demo,執行後手動輸入code即可自動傳送微博。

public static void main(String[] args){
//TODO Auto-generated method stub
    try {
        Oauth oauth = new Oauth();
        BareBonesBrowserLaunch.openURL(oauth.authorize("code"));
        System.out.println(oauth.authorize("code"));
        System.out.print("Hit enter when it's done.[Enter]:");
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String code = br.readLine();
        String access_token =oauth.getAccessTokenByCode(code).getAccessToken();
        Timeline tm = new Timeline(access_token);
        tm.updateStatus("測試:自動傳送微博。");
    } catch (WeiboException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
} 

總結

到這裡,傳送微博的功能已經實現了。
但是其中有個問題,code必須手動從瀏覽器位址列取出後輸入我們的應用。而作為一個桌面應用,這個過程沒什麼簡單的辦法去掉。如果是網頁應用的話,倒是比較容易獲取。
有一個思路是通過程式碼模擬瀏覽器行為,但這很困難,因為新浪微博登入過程中對賬號密碼進行了比較複雜的加密,而加密演算法藏得比較深難以找到。網上倒是有不少文章分析了這一過程,但新浪微博的加密演算法也不是一成不變的,網上的方法基本上都已經過時。