java代码调用twitter-api用例实战

一、申请twitter开发者账号

首先先申请twitter开发者免费的API,要填写申请的内容,放心大胆地写,申请完,会提供免费的API接口。

以下是我申请到的三个免费API

申请完开始进行测试调用。

读官方文档账户认证那块:https://developer.twitter.com/en/docs/authentication/overview 四种鉴权方式读的我很懵逼,不知道如何去测试我的接口。

研究了很久才了解清楚正确的请求方式。

二、postman测试接口

以下是用postman请求示例:

1.先确定你开发者账户允许的请求方式

(网页进行了自动翻译)

2.查看自己的consumer key和 consumer secret、access token和token secret

3.在postman里进行配置,把对应的key和密钥填到指定的内容里。

4.填写请求地址和请求参数,进行Get请求。

postman请求完成,开始进行java代码编写。

三、java代码编写

官方提供了sdk,你可以引用官方提供的包。

<dependency>
		<groupId>com.twitter</groupId>
		<artifactId>twitter-api-java-sdk</artifactId>
		<version>1.1.4</version>
	</dependency>

但是我没有用到这个包,我引用进来发现包内部出现错误,虽然能编译但是错误提示很难受。

有大神知道这个问题怎么解决可以评论告诉我。

在不引用官方提供的SDK的情况下,需要引用到其他鉴权的包。

1.引用鉴权的SDK包。

在pom.xml里配置

	<dependency>
		<groupId>oauth.signpost</groupId>
		<artifactId>signpost-core</artifactId>
		<version>1.2.1.2</version>
	</dependency>
	
	<dependency>
		<groupId>oauth.signpost</groupId>
		<artifactId>signpost-commonshttp4</artifactId>
		<version>1.2.1.2</version>
	</dependency>

配置完成,开始写测试代码。

2. 编写测试代码

java 复制代码
 public static JSONObject getUserInfo(String token,String token_secret, String active){
        CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
        consumer.setTokenWithSecret(token, token_secret);
        // 创建HttpClient对象
        HttpClient httpClient = setProxy(active);
        // 创建API请求,例如获取用户的时间线
        try {
            URIBuilder uriBuilder = new URIBuilder("https://api.twitter.com/2/users/me");
            ArrayList<NameValuePair> queryParameters;
            queryParameters = new ArrayList<>();
            queryParameters.add(new BasicNameValuePair("user.fields", "id,name,username,profile_image_url,public_metrics"));
            queryParameters.add(new BasicNameValuePair("expansions", "pinned_tweet_id"));
            uriBuilder.addParameters(queryParameters);
            HttpGet request = new HttpGet(uriBuilder.build());
            request.setHeader("Content-Type","application/json");
            consumer.sign(request);
            // 创建参数列表
//            List<NameValuePair> bodypara = new ArrayList<>();
//            bodypara.add(new BasicNameValuePair("oauth_verifier", verifier));
            // 将参数转换为UrlEncodedFormEntity
//            StringEntity entity = new UrlEncodedFormEntity(bodypara,StandardCharsets.UTF_8);
//            // 设置HttpPost的实体
//            request.setEntity(entity);
            // 发起API请求
            HttpResponse response =  httpClient.execute(request);
            // 处理API响应
            int statusCode = response.getStatusLine().getStatusCode();
            String responseBody = EntityUtils.toString(response.getEntity());
            if (statusCode == 200) {
                System.out.println("API调用成功!");
                System.out.println("响应内容:");
                System.out.println(responseBody);
                return JSONObject.parseObject(responseBody);
            } else {
                System.out.println("API调用失败,状态码:" + statusCode);
                System.out.println("错误信息:");
                System.out.println(responseBody);
                return JSONObject.parseObject(responseBody);
            }
        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
   /**
     * 设置请求代理
     * @param active
     * @return
     */
    private static HttpClient  setProxy(String active){
        HttpClient client =null;
        // 创建HttpClientBuilder对象
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        if (null==active ||"dev".equals(active)){
            // 设置代理主机和端口
            HttpHost proxy = new HttpHost("127.0.0.1", 1080); // 替换为您的代理主机和端口
            httpClientBuilder.setProxy(proxy);
            client = httpClientBuilder.build();
        }
        if ("prod".equals(active)||"test".equals(active)){
            client = httpClientBuilder.build();;
        }
        return client;

    }

进行接口测试,测试成功。

java 复制代码
  public static void main(String[] args) {
	   String accessToken="1517001992861716480-xVY7MpIqQrH1XeFv5l6rOLxxxxxx";
	   String accessSecret="A52yWlrFd1MDIrYU0IcnmlnmimMOw0UXRJNxxxxxxx";
	   JSONObject jsonObject = getUserInfo(accessToken,accessSecret,"dev");
	   System.out.println(jsonObject);
   }

接口参数解析

在测试的接口:https://api.twitter.com/2/users/me 中没有必传的参数,但是有些选项参数。

user.fields、expansions、tweet.fields三个。

在xx.fields参数传值时,是要你指定返回集合List里含有哪些返回字段。

比如在user.fields里传值id,name,username,profile_image_url,public_metrics这五个字段,分别代表用户的ID、用户昵称、用户名、头像Url、和公开的信息数。

而expansions值默认都是传pinned_tweet_id。显示扩展的twitterID。

设置这个值之后,可以设置tweet.fields字段值。

如果不设置expansions的值,设置tweet.fields则不起作用。

相关推荐
Good Note6 分钟前
Golang的静态强类型、编译型、并发型
java·数据库·redis·后端·mysql·面试·golang
我就是我35243 分钟前
记录一次SpringMVC的406错误
java·后端·springmvc
向哆哆1 小时前
Java应用程序的跨平台性能优化研究
java·开发语言·性能优化
ekkcole1 小时前
windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
java·windows·jar
handsomestWei2 小时前
java实现多图合成mp4和视频附件下载
java·开发语言·音视频·wutool·图片合成视频·视频附件下载
全栈若城2 小时前
03 Python字符串与基础操作详解
java·开发语言·python
伯牙碎琴2 小时前
二、Spring Framework基础:IoC(控制反转)和DI(依赖注入)
java·spring·log4j
菲力蒲LY2 小时前
输入搜索、分组展示选项、下拉选取,全局跳转页,el-select 实现 —— 后端数据处理代码,抛砖引玉展思路
java·前端·mybatis
南宫生2 小时前
力扣每日一题【算法学习day.130】
java·学习·算法·leetcode
!!!5253 小时前
Java实现斗地主-做牌以及对牌排序
java·算法