一、申请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. 编写测试代码
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;
}
进行接口测试,测试成功。
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则不起作用。