推特API(Twitter API)对接说明,用户code To Token换取

前期准备

提前准备、说明:目前对接推特api开发门户分为3个版本,分别是免费的,100美金一个月的基础版以及5000美金一个月的企业版,免费的目前就两个接口可以调用,所以想要对接和使用推特最基本的也需要付100美元一个月,他们的区别如下图,进入链接https://developer.twitter.com/en/portal/products/free   如下图:

https://developer.twitter.com/en/portal/products/free

而基本的就可以使用很多接口了,这里就不阐述了,可以自己去里面看。

那么推特我们如何对接呢?下面给大家讲一下详细的流程:

1:第一步需要我们创建应用,开发者应用,由于我是开通了基础版(100美金),所以我可以创建两个应用,里面有3个选项包括生产,测试等等,我们直接选择生产就好了,免费的只能创建一个应用,应用链接https://developer.twitter.com/en/portal/dashboard

​ 

2:创建成功以后还需要我们进去配置程序的公钥私钥,身份验证设置等等,做好对接前期工作。

上面配置完成以后我们就可以看到我们自己的客户ID了

开始对接

我们对接的是API v2的接口,大家一定要注意看接口文档,别看到1.1获取企业版的的去调别调不通。

说明:推特对接分为V1.1 、V2 以及企业版的Gnip2.0,这里目前使用的是V2的形式来对接的,V1.1对接一直报权限不足不给用,具体什么原因有知道的小伙伴可以告诉我一下,建议大家对接的时候去看一下 文档 。那么如何获取用户的code以及Token呢?下面直接上代码。

https://twitter.com/i/oauth2/authorize?
client_id=c3dqYzExdmo4VmpNY2tjbnFPNDM6MTpjaQ
&scope=tweet.read%20offline.access%20tweet.write%20tweet.moderate.write%20users.read%20follows.read%20follows.write
&response_type=code
&redirect_uri=http://8kvjtw.natappfree.cc/test/getTuiteCode
&state=profile&code_challenge=0ioze5m20493ny2
&code_challenge_method=plain

参数说明:
client_id = 上面图里面的客户ID

scope = 你需要用户给你授权的权限,每个权限都是以%20分割,下图会详细介绍具体怎么来的

response_type=code  这个是固定的,表示我们要去用户的code

redirect_uri = 回调地址,获取到code以后会回调到哪里,这里建议回调到前端页面,让前端在地址里面取出code返给后端,类似于这样的 http://8kvjtw.natappfree.cc/test/getTuiteCode?state=profile&code=VmtmRFlDaXdV....code的值

state=自己随机定义字符串,回调里面会给你带回来的

code_challenge=随机定义一串字符,但是换取Token的时候需要传一样的过去哦,这里重点记一下

code_challenge_method=plain 表示不加密随机字符

 scope :字段解释,可以去下图里面找出支持用户授权的权限标识就好

直接在浏览器里面打开会出现下面这样的,点击授权应用就会回调到我们上面设置的回调地址里面,并且里面会带两个参数,一个是code,另一个就是我们设置的state也会带给我们,参数都是拼接在回调地址后面的。

根据code换取token

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>

推特相关配置、文档:https://developer.twitter.com/en/docs/authentication/oauth-2-0/user-access-token

/**
 * 推特相关配置
 */
public class TwitterConfig {

    /**
     * 客户id和客户私钥
     */
    public static final String CLIENT_ID = "c3dqYzExdmo4VmpNY2t1111MTpjaQ";
    public static final String CLIENT_SECRET = "kfuA39dCX6tEG1111deXZHpOV-fjv9umx55ZdccCkNONjea";


    /**
     * 应用KYE和私钥
     */
    public static final String CONSUMER_KEY = "lhyfiDV3nX1111ffGeHMR";
    public static final String CONSUMER_SECRET = "BRNxnV5LxN23MlW4BCOdiSpQkQ1rn11119jtptduIkcwjB";

    /**
     * 应用的TOKEN
     */
    public static final String ACCESS_TOKEN = "1482941195941633-A8xyN5xuqCrRJwj111dbFgkbStu";
    public static final String ACCESS_TOKEN_SECRET = "oZaKBphpooOR7GMBB3EFELIkU1111vzoXPAQ";

}
@Data
@Accessors(chain = true)
public class TwitterDto {

    /**
     * 获取的访问令牌
     */
    private String accessToken;

    /**
     * 刷新令牌
     */
    private String refreshToken;

}
/**
     * 根据code获取用户token
     * @param code          根据code换取token
     * @param refreshToken  根据token刷新token
     * @return
     */
    public TwitterDto requestBearerToken(String code,String refreshToken) {
        try {
            String clientId = URLEncoder.encode(TwitterConfig.CLIENT_ID, "UTF-8");
            String clientSecret = URLEncoder.encode(TwitterConfig.CLIENT_SECRET, "UTF-8");
            //商户id和商户的私钥
            String credentials = clientId + ":" + clientSecret;
            //对商户id和私钥机密一下
            String base64Credentials = Base64.getEncoder().encodeToString(credentials.getBytes());

            //这个地址一定要和获取code链接里面填的回调地址保持一致(恶心)
            String redirectURI = "http://8kvjtw.natappfree.cc/test/getTuiteCode";
            //请求、换取Token的地址
            URL url = new URL("https://api.twitter.com/2/oauth2/token");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Authorization", "Basic " + base64Credentials);
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            connection.setDoOutput(true);
            connection.setDoInput(true);
            String data = "";
            if(StringUtils.isBlank(refreshToken)){
                //authorization_code、refresh_token、client_credentials
                //我们这里是根据code换取Token所以选择authorization_code
                String grantType = "authorization_code";
                //获取令牌需要的参数    code_verifier 需要和获取code传入参数 code_challenge 保持一致
                data = "grant_type=" + grantType + "&code=" + code + "&redirect_uri=" + redirectURI+
                    "&client_id="+TwitterConfig.CLIENT_ID+"&client_secret="+TwitterConfig.CLIENT_SECRET+"&code_verifier=0ioze5m20493ny2";
            }else{
                //下面是通过刷新令牌的Token去换取新的Token,房子Token过期
                //authorization_code、refresh_token、client_credentials
                String grantType = "refresh_token";
                //刷新令牌需要的参数
                data = "refresh_token="+refreshToken+"&grant_type=" + grantType + "&client_id="+TwitterConfig.CLIENT_ID+"&client_secret="+TwitterConfig.CLIENT_SECRET+"&code_verifier=challenge";
            }

            connection.getOutputStream().write(data.getBytes("UTF-8"));
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();
            String jsonResponse = response.toString();
            JSONObject json = JSON.parseObject(jsonResponse);
            TwitterDto twitterDto = new TwitterDto();
            Object accessToken = json.get("access_token");
            //我们实际使用Token
            twitterDto.setAccessToken(accessToken == null ? null : accessToken.toString());
            //当我们使用的Token过期以后可以用这个来换取新的Token
            accessToken = json.get("refresh_token");
            twitterDto.setRefreshToken(accessToken == null ? null : accessToken.toString());
            return twitterDto;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
@Slf4j
@RestController
@RequestMapping("/test")
@Api(tags = "测试")
@Transactional(isolation = Isolation.READ_COMMITTED)
public class TestController extends BaseComponent {

    @Autowired
    private TwitterService twitterService;

    @GetMapping("getTuiteCode")
    @ApiOperation("测试推特code")
    public Map<String, String> getTuiteCode(String code, String state) {
        Map<String, String> map = new HashMap<>();
        TwitterDto bearerToken = twitterService.requestBearerToken(code,null);
        //刷新一下令牌
        //bearerToken = twitterService.requestBearerToken(code,bearerToken.getRefreshToken());
        System.out.println("Bearer Token: " + bearerToken.getAccessToken());
        map.put("Token", bearerToken.getAccessToken());
        map.put("state", state);
        return map;
    }
}

这就是一个完整的换取Token的流程,后面章节介绍如何使用Token操作用户相关数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/418963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BAT三家市值总和近7000亿美元,足见它们“富可敌国”

当中国互联网拥抱共享经济时&#xff0c;BAT依然展现出它的雄姿。 临近年中&#xff0c;阿里巴巴和腾讯市值均突破3000亿美元&#xff0c;并持续创出历史新高。 百度也逐渐走出低迷&#xff0c;市值已升至600亿美元以上。 BAT这三个公司的总市值接近7000亿美元&#xff0c;可见…

2024阿里云数据库费用价格,2核4G配置227元一年

阿里云数据库大全&#xff1a;RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;数据仓库如AnalyticDB MySQL版、PostgreSQL、ClickHouse&#xff0c;阿里云还提供数据库管理工具如数…

【开源项目】自动字幕生成和字幕翻译

文章目录 1. 安装ffmpeg2. 克隆项目3. 配置项目运行环境4. 填写配置文件5. 运行项目&#xff08;仅使用CPU&#xff09; 项目地址&#xff1a;Github - qinL-cdy/auto_ai_subtitle 项目原理&#xff1a;使用ffmpeg提取视频的音频&#xff0c;使用whisper将音频转写为字幕&#…

WebService 配置与操作

WebService操作配置 本人idea 2020.3版本&#xff0c;会有毛病。 场景&#xff1a;内网环境 内网环境会导致测试麻烦&#xff0c;所以打个demo包给现场测试是否跑通 环境:Springboot项目 添加WebService ok会加载出来 2020.3版本会关了&#xff0c;找不到这窗口 可以以下…

白酒:酿造过程中的微生物群落结构与功能解析

在豪迈白酒的酿造过程中&#xff0c;微生物群落的结构与功能起着至关重要的作用。这些肉眼难以察觉的小生物在白酒的香气、口感和品质形成中扮演着重要角色。云仓酒庄在酿造过程中对微生物群落的结构与功能进行了深入研究与解析&#xff0c;旨在更好地了解和控制微生物群落&…

DVWA 靶场 SQL 注入报错 Illegal mix of collations for operation ‘UNION‘ 的解决方案

在 dvwa 靶场进行联合 SQL 注入时&#xff0c;遇到报错 Illegal mix of collations for operation UNION 报错如下图&#xff1a; 解决办法&#xff1a; 找到文件 MySQL.php 大致位置在 \dvwa\includes\DBMS 目录下 使用编辑器打开 检索 $create_db 第一个就是 在 {$_DVW…

TcpServer服务器管理模块(模块十)

目录 类功能 类定义 类实现 编译测试 server.cc gdb测试断点 忽略SIGPIPE信号 类功能 类定义 // TcpServer服务器管理模块(即全部模块的整合) class TcpServer { private:uint64_t _next_id; // 这是一个自动增长的连接IDint _port;i…

【详识JAVA语言】猜数字游戏

游戏规则: 系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 "低 了", 如果输入的数字比该随机数大, 提示 "高了" , 如果输入的数字和随机数相等, 则提示 "猜对了" . 参考代码 import java.…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(前导)

ACM9238 高速双通道ADC模块自助服务手册AD9238 Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;一&#xff09;-CSDN博客 一、AD9238 模块在各方面参数性能上与AD9226保持一致。但是在设计上优化了信号调理电路&#xff0c;将单端信号先转成差分信号&#xff0c…

VS2015报错:error MSB8020和MSB8036的解决方案

VS2015编译报错&#xff1a;error MSB8020 提示信息&#xff1a;error MSB8020: The build tools for v141 (Platform Toolset ‘v141’) cannot be found. To build using the v141 build tools, please install v141 build tools. Alternatively, you may upgrade to the c…

租赁回收系统开发详细流程-干货分享

1.需求分析&#xff1a;首先&#xff0c;需要明确系统的功能和特点。这包括确定租赁回收的物品类型、用户群体、业务流程等。通过需求分析&#xff0c;可以确保系统能够满足市场和用户的需求。 2.系统设计&#xff1a;在需求分析的基础上&#xff0c;进行系统的整体设计。这包…

最新基于SWAT-MODFLOW地表水与地下水耦合技术应用

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

第十四篇【传奇开心果系列】Python的文本和语音相互转换库技术点案例示例:深度解读Azure Cognitive Services个性化推荐系统

传奇开心果博文系列 系列博文目录Python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、个性化推荐系统介绍和关键功能以及优势解说二、雏形示例代码三、个性化推荐示例代码四、实时推荐示例代码五、多种推荐算法示例代码六、易于集成示例代码七、数据安全和隐私保…

腾讯云安装MYSQL远程连接不上解决方案

推荐安装步骤博客&#xff0c;写的很详细&#xff0c;如果不会安装的话&#xff0c;可以根据安装步骤一直走。 Windows10下超详细Mysql安装_win10安装mysql-CSDN博客 修改 my.cnf或者my.ini 找到里面bind-address将bind-address 127.0.0.1设置成bind-address 0.0.0.0&#x…

stm32触发硬件错误位置定位

1.背景 1. 项目中&#xff0c;调试过程或者测试中都会出现程序跑飞问题&#xff0c;这个时候问题特别难查找。 2. 触发硬件错误往往是因为内存错误。这种问题特别难查找&#xff0c;尤其是产品到了测试阶段&#xff0c;而这个异常复现又比较难的情况下&#xff0c;简直头疼。…

FaceBook获取广告数据

1、访问 广告管理工具 确认自己登陆的账号下面能看到户。 ​ 2、使用 图谱Api探索工具 生成用户短期口令 ​ 3、get请求(或者浏览器直接打开)访问&#xff1a; https://graph.facebook.com/v19.0/me?fieldsid,name, email&access_token{上一步生成的口令} ​ 4、短期…

MySQL 自增列解析(Auto_increment)

MySQL数据库为列提供了一种自增属性&#xff0c;当列被定义为自增时。Insert语句对该列即使不提供值&#xff0c;MySQL也会自动为该列生成递增的唯一标识&#xff0c;因此这个特性广泛用于主键的自动生成。 一、自增列的用法 自增列具有自动生成序列值&#xff0c;整型&#…

SpringBoot源码解读与原理分析(三十七)SpringBoot整合WebMvc(二)DispatcherServlet的工作全流程

文章目录 前言12.4 DispatcherServlet的工作全流程12.4.1 DispatcherServlet#service12.4.2 processRequest12.4.3 doService12.4.3.1 isIncludeRequest的判断12.4.3.2 FlashMapManager的设计 12.4.4 doDispatch12.4.4.1 处理文件上传请求12.4.4.2 获取可用的Handler&#xff0…

FPGA之进位逻辑

进位逻辑&#xff08;Carry Logic&#xff09;Slice 中除了LUT&#xff0c;寄存器&#xff0c;触发器&#xff0c;锁存器外&#xff0c;还提供了专用的快速超前进位逻辑&#xff0c;可以在slice 中执行快速算术加法和减法。CLB 中的专用进位逻辑提高了算术功能&#xff08;如加…

【BBuf的CUDA笔记】十四,OpenAI Triton入门笔记三 FusedAttention

0x0. 前言 继续Triton的学习&#xff0c;这次来到 https://triton-lang.org/main/getting-started/tutorials/06-fused-attention.html 教程。也就是如何使用Triton来实现FlashAttention V2。对于FlashAttention和FlashAttention V2网上已经有非常多的介绍了&#xff0c;大家如…