当前位置: 首页 > news >正文

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

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

1.引入相关依赖Maven

<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>

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

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency><dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>29.0-jre</version>
</dependency>

2.相关的配置类

/*** 推特相关配置*/
public class TwitterConfig {/*** 客户id和客户私钥*/public static final String CLIENT_ID = "c3dqY111tjbnFPNDM6MTpjaQ";public static final String CLIENT_SECRET = "kf1119fmdeXZHpOV-fjv9umx55ZdccCkNONjea";/*** 应用KYE和私钥*/public static final String CONSUMER_KEY = "lhyfiD111MffGeHMR";public static final String CONSUMER_SECRET = "BRNxnV5Lx111jtptduIkcwjB";/*** 应用的TOKEN*/public static final String ACCESS_TOKEN = "14821111633-A8xyN5111FgkbStu";public static final String ACCESS_TOKEN_SECRET = "oZaKBphpoo111SZvzoXPAQ";}

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

public JSONObject getUserInfo(){//下面需要开发者门户里面的key和私钥,还包括Token和私钥CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(TwitterConfig.CONSUMER_KEY, TwitterConfig.CONSUMER_SECRET);consumer.setTokenWithSecret(TwitterConfig.ACCESS_TOKEN, TwitterConfig.ACCESS_TOKEN_SECRET);// 创建HttpClient对象HttpClient httpClient = this.setProxy();// 创建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);// 创建参数列表HttpResponse response =  httpClient.execute(request);// 处理API响应int statusCode = response.getStatusLine().getStatusCode();String responseBody = EntityUtils.toString(response.getEntity());if (statusCode == 200) {System.out.println(responseBody);return JSONObject.parseObject(responseBody);} else {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;}

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

    /*** 根据用户token换取用户信息* @return*/public TwitterUserDto getUserInfoByToken(String token){StringBuilder result = new StringBuilder();BufferedReader in = null;try {// Twitter API endpointString endpoint = "https://api.twitter.com/2/users/me";// 构造带有参数的 URLString urlWithParams = endpoint + "?user.fields=name,pinned_tweet_id,profile_image_url";// 创建 URL 对象URL url = new URL(urlWithParams);URLConnection connection = url.openConnection();connection.setRequestProperty("Authorization", "Bearer " + token);connection.setRequestProperty("Content-Type","application/json");connection.connect();in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null){result.append(line);}TwitterUserDto dto = new TwitterUserDto();JSONObject json = JSONObject.parseObject(result.toString());JSONObject user = (JSONObject)json.get("data");if(user != null){dto.setId(user.get("id").toString());dto.setName(user.get("name").toString());dto.setUsername(user.get("username").toString());}return dto;} catch (Exception e) {e.printStackTrace();}return null;}
@Data
@Accessors(chain = true)
public class TwitterUserDto {/*** 推特名 @xxxx*/private String username;/*** 推特用户名*/private String name;/*** 推特用户ID*/private String id;
}

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

/*** 根据用户名查询用户推特数据* @return*/public TwitterUserDto getTwitterUserByUserName(String userName){//推特应用里面的相关私钥和TokenCommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(TwitterConfig.CONSUMER_KEY, TwitterConfig.CONSUMER_SECRET);consumer.setTokenWithSecret(TwitterConfig.ACCESS_TOKEN, TwitterConfig.ACCESS_TOKEN_SECRET);// 创建HttpClient对象HttpClient httpClient = this.setProxy();// 创建API请求,例如获取用户的时间线try {URIBuilder uriBuilder = new URIBuilder("https://api.twitter.com/2/users/by");ArrayList<NameValuePair> queryParameters;queryParameters = new ArrayList<>();//需要查询的用户名   多个用户名称用逗号隔开(例如:张三,李四,王五   如果不行用:张三%20李四%20王五)queryParameters.add(new BasicNameValuePair("usernames", userName));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);// 创建参数列表HttpResponse response =  httpClient.execute(request);// 处理API响应int statusCode = response.getStatusLine().getStatusCode();String responseBody = EntityUtils.toString(response.getEntity());if (statusCode == 200) {TwitterUserDto dto = new TwitterUserDto();JSONObject json = JSONObject.parseObject(responseBody);JSONArray user = (JSONArray)json.get("data");if(user != null){json = (JSONObject)user.get(0);dto.setId(json.get("id").toString());dto.setName(json.get("name").toString());dto.setUsername(json.get("username").toString());}return dto;} else {return null;}} 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* @return*/private HttpClient setProxy(){// 创建HttpClientBuilder对象HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();HttpClient client = httpClientBuilder.build();;return client;}

 

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

相关文章:

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

前面章节已经介绍使用code换取Token的整个流程了&#xff0c;这里不再重复阐述了&#xff0c;下面我们介绍如何使用Token查询用户信息等操作。 1.引入相关依赖Maven <dependency> <groupId>oauth.signpost</groupId> <artifactId>signpost-co…...

在Elasticsearch IK分词器中更新、停用某些专有名词

在Elasticsearch IK分词器中更新、停用某些专有名词 目前IK分词器对于现有的新名词或者流行语没有做区分比如"白嫖" “奥利给”&#xff0c;或者对一些没有用的字比如 “的” "地"进行分词其实没有必要过多的分词只会占用宝贵的内存空间&#xff0c;所以如…...

时钟显示 html JavaScript

sf.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>时间</title><script>function showTime(){var timenew Date();var datetime.getDate();var yeartime.getFullYear();var monthtime.getMonth()1;var …...

List<Object>集合对象属性拷贝工具类

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝&#xff0c;但如果应用到List集合的话就需要遍历去操作了&#xff0c;如下&#xff1a; 打印结果&#xff1a; …...

请说明Vue中的异步组件加载

Vue中的异步组件加载是指当页面需要渲染某个组件时&#xff0c;可以在需要时再去加载这个组件&#xff0c;而不是在页面初始化的时候就将所有组件一次性加载进来。这种方式能够有效降低页面的初始加载时间&#xff0c;提升用户体验。 在Vue中&#xff0c;我们可以使用import函…...

目标检测5:采用yolov8, RK3568上推理实时视频流

上一个效果图&#xff0c;海康球机对着电脑屏幕拍&#xff0c;清晰度不好。 RK3568接取RTSP视频流&#xff0c;通过解码&#xff0c;推理&#xff0c;编码&#xff0c;最终并把结果推出RTSP视频流。 数据集采用coco的80个种类集&#xff0c;通过从yovo8.pt&#xff0c;转换成R…...

微服务:Feign篇

1.什么是Feign Feign是一种声明式、模板化的HTTP客户端&#xff0c;可用于调用HTTP API实现微服务之间的远程服务调用。它的特点是使用少量的配置定义服务客户端接口&#xff0c;可以实现简单和可重用的RPC调用。 先来看我们以前利用RestTemplate发起远程调用的代码&#xff…...

基于chatgpt的聊天机器人

基于chatgpt的聊天机器人 以下是一个基于Python的示例代码&#xff0c;展示如何在本地环境中使用预训练的ChatGPT模型构建一个简单的聊天机器人应用程序。在这个示例中&#xff0c;我们将使用Hugging Face Transformers库加载GPT-2模型&#xff0c;并创建一个基于命令行的用户…...

BAT常见的20道Android面试题详解,我的头条面试经历分享

二、面试 下面主要列举下在面试过程中遇到过的剑指 offer 原题或者类似问题&#xff0c;大家应该清楚&#xff0c;面试过程中遇到原题不要太高兴&#xff0c;而刷剑指 offer 就能让遇到原题的可能性大大增加。 1.字节跳动春招 面试题 68 - II. 二叉树的最近公共祖先 2.京东…...

python66-Python的循环之常用工具函数

使用zip()函数可以把两个列表“压缩”成一个zip对象(可迭代对象),这样就可以使用一个循环并行遍历两个列表。为了测试 zip()函数的功能,我们可以先在交互式解释器中“试验”一下该函数的功能。 # !/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2024/01# @Author : …...

Cocos Creator 3.8.x 制作模糊效果(比如游戏弹窗需要的模糊效果)

接着上一个讨论的话题,关于3.8.x的后效,今天来分享自定义后效来制作模糊效果,并将他应用到弹窗中做背景,话不多说开整。 一:最终效果 首先咱们来看官网自定义后效怎么搞的,从它的实例开始:自定义后效 二:定义PostProcessSettings给节点提供资源(通过编辑器修改参数的…...

MATLAB报错:尝试将 SCRIPT imread 作为函数执行

报错&#xff1a; 在执行matlab脚本的时候出现报错。 >> imread 尝试将 SCRIPT imread 作为函数执行: S:\temp_file\matlab\DigitalImageProcessing\imread.m出错 imread (line 2) I imread(S:\temp_file\matlab\DigitalImageProcessing\blueman.png);分析以及解决方…...

能源管理师:薪资待遇、技能知识与职业发展路景全解析

能源管理师作为一种新兴职业&#xff0c;近年来受到了越来越多的关注。他们在能源领域发挥着重要的作用&#xff0c;帮助企业和组织优化能源使用、降低成本并实现可持续发展。本文将详细介绍能源管理师的薪资待遇、所需具备的技能知识以及职业发展路景。 一、薪资待遇 能源管…...

opencart3 添加速卖通商品脚本

非爬虫&#xff0c;只能把速卖通商品信息拿下来解析插入到自己的项目里。 刚接触opencart3没多久&#xff0c;有一些新项目需要添加商品&#xff0c;每次手动从速卖通复制信息又很慢&#xff0c;就自己写了一个脚本。 思路&#xff1a;速卖通商品详情页有一段数据包含了几乎所…...

【Linux】USB Functionfs编程:libusb接口详解

1、USB host_app代码注释 #include <libusb.h> libusb头文件,编译时链接库:libusb-1.0#define VENDOR 0x1d6b 厂商:Linux Foundation #define PRODUCT 0x0105 设备:FunctionFS Gadge...

网络编程,IO多路复用

1.使用IO多路复用完成TCP并发服务器 #include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.124.10" //服务器IP地址int main(int argc, const char *argv[]) {//1、创建用于连接的套接字int sfd socket…...

【ue5】滑铲系统蓝图笔记

大致逻辑如下&#xff1a; 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色&#xff0c;便于区分。 二、调整动画 1.启动根运动 启动根运动后&#xff0c;人物才可以位移&#xff0c;不然只能在原地。 打开动画序列&#xff0c;勾选启用根运动Enabled…...

linux系统Jenkins工具参数化构建

Jenkins参数化构建 web服务器jenkins服务器编写主机清单编写脚本代码 jenkins服务web页面操作 web服务器 下载nginx 下载gitcd /usr/share/nginxrm -rf htmlgit clone http://root:Qq123456192.168.188.176/ximu/test-nginx.gitmv test-nginx/ htmljenkins服务器 下载ansible…...

生活里的英语应该【怎么说】

文章目录 一、生病的各种症状用英语怎么说&#xff1f;二、关于天气的英语怎么说&#xff1f; 一、生病的各种症状用英语怎么说&#xff1f; Im coughting! I have a sore throat. Ive lost my voice. I have a runny nose and a stuffy nose. I have shivers and a body a…...

Centos安装Jenkins

1、更新系统 &#xff08;1&#xff09;更新下系统 sudo yum -y update 安装用于下载java 17二进制文件的wget命令行工具 sudo yum -y install wget vim 2、卸载centos自带的jdk 由于我们安装的版本比较高&#xff0c;需要jdk17&#xff0c;卸载centos自带的jdk。用 下面的…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...