• 推特API(Twitter API)V2 查询用户信息


            前面章节已经介绍使用code换取Token的整个流程了,这里不再重复阐述了,下面我们介绍如何使用Token查询用户信息等操作。

    1.引入相关依赖Maven


        oauth.signpost
        signpost-core
        1.2.1.2


        oauth.signpost
        signpost-commonshttp4
        1.2.1.2


        com.twitter
        twitter-api-java-sdk
        1.1.4


        commons-httpclient
        commons-httpclient
        3.1

        com.google.guava
        guava
        29.0-jre

    2.相关的配置类

    1. /**
    2. * 推特相关配置
    3. */
    4. public class TwitterConfig {
    5. /**
    6. * 客户id和客户私钥
    7. */
    8. public static final String CLIENT_ID = "c3dqY111tjbnFPNDM6MTpjaQ";
    9. public static final String CLIENT_SECRET = "kf1119fmdeXZHpOV-fjv9umx55ZdccCkNONjea";
    10. /**
    11. * 应用KYE和私钥
    12. */
    13. public static final String CONSUMER_KEY = "lhyfiD111MffGeHMR";
    14. public static final String CONSUMER_SECRET = "BRNxnV5Lx111jtptduIkcwjB";
    15. /**
    16. * 应用的TOKEN
    17. */
    18. public static final String ACCESS_TOKEN = "14821111633-A8xyN5111FgkbStu";
    19. public static final String ACCESS_TOKEN_SECRET = "oZaKBphpoo111SZvzoXPAQ";
    20. }

    3.查询开发者账号的推特信息

    1. public JSONObject getUserInfo(){
    2. //下面需要开发者门户里面的key和私钥,还包括Token和私钥
    3. CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(TwitterConfig.CONSUMER_KEY, TwitterConfig.CONSUMER_SECRET);
    4. consumer.setTokenWithSecret(TwitterConfig.ACCESS_TOKEN, TwitterConfig.ACCESS_TOKEN_SECRET);
    5. // 创建HttpClient对象
    6. HttpClient httpClient = this.setProxy();
    7. // 创建API请求,例如获取用户的时间线
    8. try {
    9. //请求的地址
    10. URIBuilder uriBuilder = new URIBuilder("https://api.twitter.com/2/users/me");
    11. ArrayList queryParameters;
    12. queryParameters = new ArrayList<>();
    13. //我们需要查询用户的那些信息
    14. queryParameters.add(new BasicNameValuePair("user.fields", "id,name,username,profile_image_url,public_metrics"));
    15. queryParameters.add(new BasicNameValuePair("expansions", "pinned_tweet_id"));
    16. uriBuilder.addParameters(queryParameters);
    17. HttpGet request = new HttpGet(uriBuilder.build());
    18. request.setHeader("Content-Type","application/json");
    19. consumer.sign(request);
    20. // 创建参数列表
    21. HttpResponse response = httpClient.execute(request);
    22. // 处理API响应
    23. int statusCode = response.getStatusLine().getStatusCode();
    24. String responseBody = EntityUtils.toString(response.getEntity());
    25. if (statusCode == 200) {
    26. System.out.println(responseBody);
    27. return JSONObject.parseObject(responseBody);
    28. } else {
    29. System.out.println(responseBody);
    30. return JSONObject.parseObject(responseBody);
    31. }
    32. } catch (OAuthMessageSignerException e) {
    33. e.printStackTrace();
    34. } catch (OAuthExpectationFailedException e) {
    35. e.printStackTrace();
    36. } catch (OAuthCommunicationException e) {
    37. e.printStackTrace();
    38. } catch (URISyntaxException e) {
    39. e.printStackTrace();
    40. }catch (IOException e) {
    41. e.printStackTrace();
    42. }
    43. return null;
    44. }

    4.根据用户Token查询授权用户基本信息

    1. /**
    2. * 根据用户token换取用户信息
    3. * @return
    4. */
    5. public TwitterUserDto getUserInfoByToken(String token){
    6. StringBuilder result = new StringBuilder();
    7. BufferedReader in = null;
    8. try {
    9. // Twitter API endpoint
    10. String endpoint = "https://api.twitter.com/2/users/me";
    11. // 构造带有参数的 URL
    12. String urlWithParams = endpoint + "?user.fields=name,pinned_tweet_id,profile_image_url";
    13. // 创建 URL 对象
    14. URL url = new URL(urlWithParams);
    15. URLConnection connection = url.openConnection();
    16. connection.setRequestProperty("Authorization", "Bearer " + token);
    17. connection.setRequestProperty("Content-Type","application/json");
    18. connection.connect();
    19. in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    20. String line;
    21. while ((line = in.readLine()) != null)
    22. {
    23. result.append(line);
    24. }
    25. TwitterUserDto dto = new TwitterUserDto();
    26. JSONObject json = JSONObject.parseObject(result.toString());
    27. JSONObject user = (JSONObject)json.get("data");
    28. if(user != null){
    29. dto.setId(user.get("id").toString());
    30. dto.setName(user.get("name").toString());
    31. dto.setUsername(user.get("username").toString());
    32. }
    33. return dto;
    34. } catch (Exception e) {
    35. e.printStackTrace();
    36. }
    37. return null;
    38. }
    1. @Data
    2. @Accessors(chain = true)
    3. public class TwitterUserDto {
    4. /**
    5. * 推特名 @xxxx
    6. */
    7. private String username;
    8. /**
    9. * 推特用户名
    10. */
    11. private String name;
    12. /**
    13. * 推特用户ID
    14. */
    15. private String id;
    16. }

    5.根据用户名查询用户推特信息 

    1. /**
    2. * 根据用户名查询用户推特数据
    3. * @return
    4. */
    5. public TwitterUserDto getTwitterUserByUserName(String userName){
    6. //推特应用里面的相关私钥和Token
    7. CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(TwitterConfig.CONSUMER_KEY, TwitterConfig.CONSUMER_SECRET);
    8. consumer.setTokenWithSecret(TwitterConfig.ACCESS_TOKEN, TwitterConfig.ACCESS_TOKEN_SECRET);
    9. // 创建HttpClient对象
    10. HttpClient httpClient = this.setProxy();
    11. // 创建API请求,例如获取用户的时间线
    12. try {
    13. URIBuilder uriBuilder = new URIBuilder("https://api.twitter.com/2/users/by");
    14. ArrayList queryParameters;
    15. queryParameters = new ArrayList<>();
    16. //需要查询的用户名 多个用户名称用逗号隔开(例如:张三,李四,王五 如果不行用:张三%20李四%20王五)
    17. queryParameters.add(new BasicNameValuePair("usernames", userName));
    18. queryParameters.add(new BasicNameValuePair("expansions", "pinned_tweet_id"));
    19. uriBuilder.addParameters(queryParameters);
    20. HttpGet request = new HttpGet(uriBuilder.build());
    21. request.setHeader("Content-Type","application/json");
    22. consumer.sign(request);
    23. // 创建参数列表
    24. HttpResponse response = httpClient.execute(request);
    25. // 处理API响应
    26. int statusCode = response.getStatusLine().getStatusCode();
    27. String responseBody = EntityUtils.toString(response.getEntity());
    28. if (statusCode == 200) {
    29. TwitterUserDto dto = new TwitterUserDto();
    30. JSONObject json = JSONObject.parseObject(responseBody);
    31. JSONArray user = (JSONArray)json.get("data");
    32. if(user != null){
    33. json = (JSONObject)user.get(0);
    34. dto.setId(json.get("id").toString());
    35. dto.setName(json.get("name").toString());
    36. dto.setUsername(json.get("username").toString());
    37. }
    38. return dto;
    39. } else {
    40. return null;
    41. }
    42. } catch (OAuthMessageSignerException e) {
    43. e.printStackTrace();
    44. } catch (OAuthExpectationFailedException e) {
    45. e.printStackTrace();
    46. } catch (OAuthCommunicationException e) {
    47. e.printStackTrace();
    48. } catch (URISyntaxException e) {
    49. e.printStackTrace();
    50. }catch (IOException e) {
    51. e.printStackTrace();
    52. }
    53. return null;
    54. }
    55. /**
    56. * 设置请求代理
    57. * @param
    58. * @return
    59. */
    60. private HttpClient setProxy(){
    61. // 创建HttpClientBuilder对象
    62. HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
    63. HttpClient client = httpClientBuilder.build();;
    64. return client;
    65. }

     

    注意事项:如果推特报401的话请检查Token是否过期,如果报400的话需要好好检查一下参数问题,它不会给你特别明显错误的提示,细节问题只能自己注意一下了。

  • 相关阅读:
    Request之获取请求数据的方法 [JavaWeb][Servlet]
    【线上问题】Jedis Could not get a resource from the pool
    性能问题从发现到优化一般思路
    Server Name Indication(SNI),HTTP/TLS握手过程解析
    基于Http协议实现网络爬虫读取数据
    荧光染料BDP FL DBCO,BDP FL 二苯基环辛炔,CAS:2360493-46-3
    数据库专辑--WITH CHECK OPTION的用法
    Spring笔记
    HTML静态网页成品作业(HTML+CSS)—— 环保主题介绍网页(5个页面)
    hyperscan技术
  • 原文地址:https://blog.csdn.net/qq_38935605/article/details/136393737