一、申請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則不起作用。