使用微博SDK工具weibo4j进行java微博自动回复

  • 微博SDK介绍
  • SDK使用方法
  • 申请应用
  • 应用开发
  • 代码导入
  • 代码结构
  • 回复代码
  • 代码构建
  • 整体思路
  • 回复代码


微博SDK介绍

项目需求,需要开发一个新浪微博回复机器人的小工具。通过调研,使用新浪微博开放的公共API接口是最方便的。

使用新浪微博开放平台的API接口,可以轻松实现微博的查询,用户的查询,微博的回复等各项功能。使用官方提供的SDK工具,可以实现代码自动进行微博的模拟操作行为。官方提供了多种语言的SDK工具,包括Python包(由廖雪峰老师提供),本文使用的Java包等。

SDK使用方法

申请应用

  • 申请应用:由于需要进行页面接口的开发,到微博开放平台-微连接申请网站接入。如下图:
  • java如何根据使用新浪微博接口登录app_spring

  • 开发者资料完善:在创建应用后,需要完善个人身份,填写开发者资料,如下图所示。这里注意,后续的身份认证步骤可以根据自身需要完成,不一定必须认证。
  • java如何根据使用新浪微博接口登录app_java_02

  • 填写回调地址:在应用申请之后,需要到完成的应用里将信息进一步完善才可以使用java SDK工具。具体的,点击“我的应用”-选中创建好的应用-点击“应用信息”-“高级信息”-填写“OAuth2.0 授权设置”,这里可以填写如下。授权回调页会在之后的授权过程中用到,不填写这一项程序无法执行。取消授权回调页功能并不支持,因此可以随意填写。
  • java如何根据使用新浪微博接口登录app_微博_03

  • 应用申请结束,将几个关键信息记住,用于代码中参数的设置。包括App Key, App Secret, 回调地址等。如下图:
  • java如何根据使用新浪微博接口登录app_微博_04

应用开发

接口的开发可以参考官方wiki,或者在自己的“接口管理”模块中查看目前可以使用的API接口信息。

代码导入

原作者使用eclipse进行开发,使用intelliJ IDEA开发的同学可以直接进行导入,选择eclipse导入即可。

代码中使用的jar包直接放到了lib目录下,我们可以使用maven进行相应jar包的导入,主要包含日志包和一个http包。具体依赖如下:

<dependencies>
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>2.0.0-alpha1</version>
        </dependency>
    </dependencies>

将用于参数设置的properties文件放到resources目录下,并重新设置参数值,将申请到的应用具体参数填入。具体如下:

java如何根据使用新浪微博接口登录app_微博_05

代码结构

java如何根据使用新浪微博接口登录app_微博_06


如上图所示,

  • http包下代码主要用于发送和接收请求
  • model包将weibo中用到的实体对象进行了封装。包括Comment、MySSLSocketFactory、Trend等对象
  • oauth包是我自己添加的,其中的代码用于设置accessToken,具体的,在将config.properties文件中参数进行修改后,运行包下面的OAuth4Code.java,会自动跳转到授权页面,在重定向的URL最后会携带code参数,将code参数填入,将会产生最终的accessToken,这个accessToken值将会是我们之后进行查询、回复等接口开发的身份认证信息。
  • org.json包下用于查询、回复等步骤的JSON数据的解析
  • utils包下的代码包含数据的封装类、数据编码转换类等实用类。

回复代码

代码构建

完成上述步骤之后,我们进行工程的编译和构建。使用maven进行install,将编译完成的jar包放到本地的maven仓库中,用于后续接口的调用。

整体思路

在pom文件中,将我们之前编译好的maven项目导入。要想回复别人的微博,主要需要获取目标微博的ID。微博ID无法进行直接查询,我们必须通过目标用户进行间接的查询。想要获取目标用户,我们需要首先将开发用的微博账号对目标账号进行关注,这样我们就可以获取目标用户的时间线。通过将时间线中的微博进行存储,我们就可以完成对目标微博的评论工作。

回复代码

具体代码如下:

package xx.xxx.xxx.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import weibo4j.Comments;
import weibo4j.Timeline;
import weibo4j.Users;
import weibo4j.model.Comment;
import weibo4j.model.CommentWapper;
import weibo4j.model.Status;
import weibo4j.model.StatusWapper;
import weibo4j.model.User;
import weibo4j.model.WeiboException;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2020/4/28.
 * 应用开发者需要对待评论用户进行关注
 * 获取开发者时间线上的微博,这样就可以获取所有带评论的微博ID
 * 将所有历史微博的正文信息以及mid保存到数据库中
 * 通过回复程序进行回复
 */

@Service
public class WeiboReplyService {
    private static final Logger LOGGER = LoggerFactory.getLogger(WeiboReplyService.class);

    @Value("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
    private String accessToken;

    public WeiboReplyService(String accessToken) {
        this.accessToken = accessToken;
    }

    public WeiboReplyService() {
    }

    /**
     * 根据用户昵称获取用户uid
     * @param accessToken
     * @param userNickName  用户昵称
     * @return              用户信息
     * @throws WeiboException
     */
    public User userSearch(String accessToken, String userNickName) throws WeiboException {
        Users users = new Users(accessToken);
        User user = users.showUserByScreenName(userNickName);
        LOGGER.info(user.toString());
        return user;
    }

    public List<String> getFriendsTimeline() throws WeiboException {
//        String uID = user.getId();
        Timeline timeline = new Timeline(this.accessToken);
        StatusWapper friendsTimeline = timeline.getFriendsTimeline();
        LOGGER.info(friendsTimeline.toString());
        List<Status> statuses = friendsTimeline.getStatuses();
        ArrayList<String> StatusIDs = new ArrayList<>();
        if (!statuses.isEmpty()) {
            for (Status status : statuses) {
                LOGGER.info(status.toString());
                StatusIDs.add(status.getId());
            }
        }
        return StatusIDs;
    }

    /**
     * 对目标微博进行评论
     * @param commentContent    评论内容
     * @param targetMessageID   目标微博ID
     */
    public void commentCreate(String commentContent, String targetMessageID) {
        Comments cm = new Comments(accessToken);
        try {
            Comment comment = cm.createComment(commentContent, targetMessageID);
            LOGGER.info(comment.toString());
        } catch (WeiboException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取当前登录用户的最新评论包括接收到的与发出的
     * @param accessToken
     */
    public void getCommentTimeline(String accessToken) {
        Comments cm = new Comments(accessToken);
        try {
            CommentWapper commentTimeline = cm.getCommentTimeline();
            List<Comment> comments = commentTimeline.getComments();
            for (Comment comment : comments) {
                LOGGER.info(comment.toString());
            }
        } catch (WeiboException e) {
            e.printStackTrace();
        }
    }
}

测试程序如下:

package xx.xxx.xxx.dao;

import xx.xxx.xxx.service.WeiboReplyService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import weibo4j.model.WeiboException;

import java.io.UnsupportedEncodingException;
import java.util.List;

/**
 * Created by Administrator on 2020/4/13.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class ServiceTest {
    private static Logger LOGGER = LoggerFactory.getLogger(ServiceTest.class);

    @Autowired
    private WeiboReplyService weiboReplyService;

    @Test
    public void autoReplyTest() throws UnsupportedEncodingException {
        String commentContent = "Hello World!这是一条来自IntelliJ IDEA客户端的JAVA回复...";
//        这里的targetMessageID用你想要回复的微博ID进行替换
        String targetMessageID = "XXXXXXXXXXXXXXXX";
        weiboReplyService.commentCreate(commentContent, targetMessageID);
    }

    @Test
    public void weiboTest() throws WeiboException {
        String content = "么么哒!~";
        List<String> friendsTimelineStatusIDs = weiboReplyService.getFriendsTimeline();
        for (String statusID : friendsTimelineStatusIDs) {
            weiboReplyService.commentCreate(content, statusID);
        }
        LOGGER.info("回复结束...");
    }
}

运行测试程序,有以下日志输出:

[DEBUG] 2020-04-30 01:32:49,585 method:org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$ConnectionPool.notifyWaitingThread(MultiThreadedHttpConnectionManager.java:961)
Notifying no-one, there are no waiting threads
[DEBUG] 2020-04-30 01:32:49,588 method:weibo4j.http.HttpClient.log(HttpClient.java:155)
...评论对象的JSON串...

最后,到页面上查看一下

java如何根据使用新浪微博接口登录app_List_07


大功告成!!!