1. 程式人生 > >Java呼叫 新浪微博API 介面發微博(包含js微博元件、springMVC新浪登入)詳解

Java呼叫 新浪微博API 介面發微博(包含js微博元件、springMVC新浪登入)詳解

參考自:http://www.myexception.cn/program/1930025.html

最近做了一個活動,要用到微博分享,就捉急忙慌的去研究,因為我們公司域名的問題還有專案的問題白白浪費我一天時間。。。

1、js微博元件分享

當然你再配置資訊的時候你肯定要先去申請成為開發者,申請應用,具體如下:

申請成為開發者
http://open.weibo.com/到這裡申請。點選“我的應用”就能看到 身份認證:未認證,自己把該做的做了,這裡不詳細講。稽核很快的,不到一天就通過。
之後應該是這樣的(哈哈,歡迎互粉哈):

重點提示:微博官方早在2017年3月份就調整了相關介面,取消了網上現有教程中的傳送微博的介面(updateStatus),導致如果再呼叫此介面都會提示許可權不足

一,登入開放平臺建立應用

首先需要去微博開放平臺申請開發者賬號建立新應用。可直接用用微博賬號登入,登入後點擊微連線選擇其他根據自己需要(客戶端,網頁應用和瀏覽器外掛)選擇建立新應用。

二,應用相關設定

首先在應用資訊中編輯應用的基本資訊包括應用介紹用途什麼的,一定要填寫安全域名,自己做測試可隨便填,企業應用時應填寫企業的相關域名。

還需要在應用高階資訊中設定OAuth2.0的授權回撥頁面,這個測試時也可以隨便填寫,當應用發起使用者授權時成功或則取消跳轉的頁面地址。

記下:APP Key和App Secret,後面有用。

然後提交申請,去配置前端分享元件,引用到專案中你的微博分享功能就完成了。

2、Java呼叫 新浪微博API 介面發微博

下載微博Java SDK
來這裡https://github.com/sunxiaowei2014/weibo4j-oauth2-beta3.1.1/

下載zip壓縮包:weibo4j-oauth2-beta3.1.1.zip

將SDK匯入Eclipse
什麼?你一直用文字編輯器寫Java?好吧,聽我一句勸,寫這玩意兒時還是換成Eclipse吧,不然會累死的。
開啟Eclipse,“File”——“Import”——“General下面Existing Projects into Workspace”——“Select archive File”——選擇剛才的SDK壓縮包——“Finish”。
至此匯入完成。
修改配置資訊

最重要的一步:開啟圖中這個config.properties檔案,修改config.properties檔案中的欄位值。“redirect_URI”的值改為https://api.weibo.com/oauth2/default.html,值的來源都是應用資訊中。

執行例項獲取授權碼

配置檔案修改完畢後,首先開啟examples包下的oauth2.0下的OAuth4Code.java檔案,直接用執行main方法即可。此刻預設瀏覽器會開啟使用者授權頁面,授權後瀏覽器地址最後會多出一個code=******,複製該code貼上到編輯器的控制檯,然後回車,就會返回授權資訊。

複製返回的授權資訊中的accessToken的值,該值為授權碼。

AccessToken [accessToken=2.00******, expireIn=11255**, refreshToken=,uid=****]有了該授權碼,接著我們就可以正式操作微博了。

注:在微博api中所有的操作都是需要經過OAuth2.0授權的,呼叫每個方法都需要一個授權碼,未經稽核的應用授權碼只有一天的有效期,通過後有30天的有效期,而如果是應用所屬的開發者授權時是5年。所以開發者需要在呼叫時應判斷授權碼有效期,過期應引導使用者重新授權。
 

api應用之發微博

在examples包下全是微博官方api例項,之前的傳送微博介面在weibo4j.examples.timeline下。其中UpdateStatus.java和Upload.java一個是傳送微博文字一個是傳送帶圖片的微博例項。開啟後發現微博傳送都是呼叫的weibo4j.Timeline.java的類。

但是微博官方已經取消了updateStatus等相關傳送微博介面,這些介面都不能再呼叫了,但是java的sdk由於是2014的版本,所以裡面還是存在這些方法。隨之替代以前updateStatus介面的是statuses/share(第三方分享連結到微博)

我們使用該介面傳送一條微博,由於java sdk是2014的版本所以該版本中並沒有該介面方法,所以我們需要自己按照他的呼叫方式寫一個新的介面。由於該介面只有個兩個是必須的引數一個微博文字和授權碼,和updateStatus的類似。所以我們可以開啟weibo4j.Timeline.java中找到updateStatus的方法,複製一份改掉方法名,將json替換掉即可。這樣一個不帶圖片的微博傳送就方法就完成了。

public Status updateStatus(String status) throws WeiboException {
    return new Status(client.post(WeiboConfig.getValue("baseURL")
            + "statuses/update.json",
            new PostParameter[] { new PostParameter("status", status) },
            access_token));
}
/**
 * 第三方分享微博
 * @param status
 * @return
 * @throws WeiboException
 */
public Status share(String status) throws WeiboException {
    return new Status(client.post(WeiboConfig.getValue("baseURL")
            + "statuses/share.json",
            new PostParameter[] { new PostParameter("status", status) },
            access_token));
}

接著我們呼叫一下該方法,由於該介面是第三方分享到微博,所以內容中必須帶一個第三方地址詳見該介面引數說明,地址必須是應用設定中的安全域名下的URL。(重點,要不然會報錯10017 : 錯誤:引數值非法,希望得到 (%s),實際得到 (%s),請參考API文件

public static void main(String[] args) {
String access_token = "2.00**********";
String statuses = "該條微博由JAVA程式傳送,目的測試其微博相關api,並無實際用途。https://baike.baidu.com/item/Java/85979?fr=aladdin";
Timeline tm = new Timeline(access_token);
try {
    Status share = tm.share(statuses);
    System.out.println(share);
} catch (WeiboException e) {
    e.printStackTrace();
}}

到這裡就可以發微博了,說一下常遇到的問題

重定向錯誤:不匹配主要是因為你的config裡面配置的回撥地址和我的應用高階應用中的回撥地址不匹配造成的

還有分享時出現了10004錯誤,分享失敗,應用資訊欄高階資訊裡的ip填寫的不對,現在和以前不一樣   在安全設定中應用的服務IP地址不需要填寫了

3、SpringMVC 整合新浪微博登入 Java SDK

 現在很多網站都整合了便捷的第三方登入,如QQ登入、新浪微博、搜狐、網易等,為使用者提供不少方便和節約時間。我們可以選擇使用JS或SDK實現第三方提供使用者授權API,本文主要講解 JAVA SDK 新浪微博登入授權以及獲取使用者資料。

注:本例子使用的是 SpringMVC,所以若想拷貝程式碼直接使用則需自己提前搭建好環境。

編輯config.properties配置檔案,改成成自己的資料。第一個填寫你申請的App Key值,第二個填寫App Secret值。
client_ID =     
client_SERCRET =
redirect_URI =

第三個redirect_URI,是你的重定向後的網址。對應一個控制器(Spring Controller)或 Servlet。在這裡我們需要兩個網址,第一個網址即使用者在頁面上點選的網址,能跳轉到新浪微博賬號登入介面,當用戶點選賬號登陸介面的登入按鈕時,新浪微博會去校驗資料正確性,一旦資料正確將會以 get 方式請求並且攜帶引數code重定向到你填寫的redirect_URI,此時就能獲取使用者的資料了。這也是和前面兩個不一樣的地方,如果你做過微信相關的分享或者使用者資訊的軟體,那麼這個對於你來說也是小意思的,流程一模一樣。

以小明部落格為例,首先使用者點選 http://www.bugxm.com/user/login-sian-weibo.html,我們接收請求後主要工作是重定向到新浪微博登入頁面。程式碼片段如下:

/**
*
* 新浪微博登入介面
*
* @param session
*  @return
* @throws WeiboException
*/
@RequestMapping(value = "/user/login-sian-weibo.html", method = RequestMethod.GET)
public String loginSinaWeibo(HttpServletRequest request, HttpSession session)
    throws WeiboException {
session.setAttribute("login_current_url", request.getHeader("Referer"));
weibo4j.Oauth oauth = new weibo4j.Oauth();
String url = oauth.authorize("code", "");
return "redirect:" + url;
}

程式碼片段中的session是為了獲取使用者登入前所在頁面URL,方便登入完後重定向到登入之前的頁面。其中url是新浪微博登入介面網址,我們只需要重定向過去就行了。

當用戶在新浪微博登入成功後,會重定向到我們剛才填寫的redirect_URI中,如我填寫的 http://www.bugxm.com/user/login-sina-weibo.do,對應邏輯程式碼片段如下:
    
/**
*
* 新浪微博登入操作
*
* @param session
*  @return
* @throws WeiboException
*/
@RequestMapping(value = "/user/login-sina-weibo.do", method = RequestMethod.GET)
public String loginSinaWeiboAction(HttpSession session,
    @RequestParam String code) throws WeiboException {
String url = (String) session.getAttribute("login_current_url");
session.removeAttribute("login_current_url");
User user = userService.sinaWeiboLoginAction(code,
    (User) session.getAttribute("user"));
if (null != user) {
    session.setAttribute("user", user);
}
return "redirect:" + url;
}

重定向過來會攜帶code引數我們把值取到用來獲取使用者的資料。本段程式碼中的除code、sinaWeiboLoginAction()外都是次要,對本文主題而言可有可無。我們來看看sinaWeiboLoginAction()程式碼片段:
/**
     * 新浪微博操作
     *
     * @param code
     * @param currentLoginUser
     *            當前登入使用者,可為 null
     *  @return
     * @throws WeiboException
     */
    public User sinaWeiboLoginAction(String code, User currentLoginUser)
            throws WeiboException {
        weibo4j.Oauth oauth = new weibo4j.Oauth();
        weibo4j.http.AccessToken accessToken = oauth.getAccessTokenByCode(code);
        String uid = accessToken.getUserUid();
 
        weibo4j.Users users = new weibo4j.Users();
        users.client.setToken(accessToken.getAccessToken());
        weibo4j.model.User user = users.showUserById(uid);
 
        String userDomain = user.getUserDomain(); // 使用者登入名
        String username = user.getScreenName(); // 使用者呢稱
        String avatar = user.getAvatarLarge(); // 使用者頭像
        String gender = null; // 性別
        if ("m".equals(user.getGender())) {
            gender = "男";
        } else if ("f".equals(user.getGender())) {
            gender = "女";
        } else {
            gender = "未知";
        }
 
        // …… 業務邏輯操作,程式碼略
        return currentLoginUser;
    }

其中String uid = accessToken.getUserUid();的getUserUid()方法本身是沒有的,我們需要修改新浪微博的原始碼,不然取uid非常麻煩。

編輯/src/weibo4j.http/AccessToken.java,在:
public String getRefreshToken() {
    return refreshToken;
}

下面新增:
public String getUserUid() {
    return uid;
}

到此就搞定了。使用者的其它資料已經很詳細的註釋在/src/weibo4j/model/User.java中了。

這個根據自己的需要,你只要拿到使用者的資訊了,那怎麼把使用者資訊拆解,獲取,入庫就很簡單了