Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解

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

https://blog.csdn.net/qq_36580777/article/details/77532760?locationNum=3&fps=1

https://blog.csdn.net/fly_du_/article/details/43562033

最近做了一个活动,要用到微博分享,就捉急忙慌的去研究,因为我们公司域名的问题还有项目的问题白白浪费我一天时间。。。

1、js微博组件分享

首先,你如果只是想单单做一个微博分享功能,我建议你直接使用微博提供的分享组件,只需要前端加几行代码,很容易的就完成了,http://open.weibo.com/sharebutton,请参考微博的文档,在下面完善必要的信息。

当然你再配置信息的时候你肯定要先去申请成为开发者,申请应用,具体如下:

申请成为开发者
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中了。

这个根据自己的需要,你只要拿到用户的信息了,那怎么把用户信息拆解,获取,入库就很简单了

猜你喜欢

转载自blog.csdn.net/guojun13598079464/article/details/81222056