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

news2024/10/5 23:27:37

前期准备

提前准备、说明:目前对接推特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.coloradmin.cn/o/1480084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024绿色能源、城市规划与环境国际会议(ICGESCE 2024)

2024绿色能源、城市规划与环境国际会议(ICGESCE 2024) 一、【会议简介】 随着全球气候变化和环境问题日益严重&#xff0c;绿色能源和可持续发展已成为全球关注的焦点。本次会议旨在汇聚全球在绿色能源、城市规划与环境领域的专家、学者和实践者&#xff0c;共同探讨和分享关于…

AutoGen Studio助力打造私人GPTs

微软最近在开源项目里的确挺能整活儿啊! 这次我介绍的是AutoGen Studio,我认为这个项目把AutoGen可用性又拔高了一个层次的项目 项目给自己的定义是交互式的多Agent workflow 项目地址:autogen/samples/apps/autogen-studio at main microsoft/autogen (github.com) 首先我…

【Leetcode每日一题】二分查找 - 山脉数组的峰顶索引(难度⭐⭐)(23)

1. 题目解析 Leetcode链接&#xff1a;852. 山脉数组的峰顶索引 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 核心在于找到题目中所说的峰值所在的下标并返回他们的下标即可。 2. 算法原理 峰顶及两侧数据特点分析 峰顶数据…

c语言经典测试题8

在c语言经典测试题6的第一题&#xff0c;大家是否想过可不可以将递归参数改为s呢&#xff1f;或许有的人已经试过了&#xff0c;但是发现好像不会有结果&#xff0c;其实是因为s为后置&#xff0c;先试用后加1&#xff0c;然而我们这个是在s出了函数之后才会运行加1操作&#x…

【Bugs】class path resource [xxx.xml] cannot be opened because it does not exist

报错&#xff1a; 关键报错信息&#xff1a; class path resource [scope.xml] cannot be opened because it does not exist完整报错信息&#xff1a; 2024-03-01 14:26:58 866 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refres…

光谱下的养殖业:数据可视化的现代变革

在数字化时代&#xff0c;数据可视化在养殖业中崭露头角&#xff0c;为这一传统行业注入了新的活力。无论是家禽养殖还是水产养殖&#xff0c;数据可视化都以其直观、高效的特点&#xff0c;为养殖业带来了全新的发展机遇。下面我就以可视化从业者的角度&#xff0c;简单聊聊这…

【MATLAB源码-第152期】基于matlab的子空间方法(subspace method)的信道盲估计仿真,16QAM调制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于子空间方法的信道盲估计是一种在通信领域中广泛使用的技术&#xff0c;用于在不直接知道发送信号的情况下估计通信信道的特性。这种方法的核心思想是通过接收到的信号来分析信号空间的结构&#xff0c;从而推断出信道的特…

设计师面试作品集注意!避免以下6个陷阱!

作品集是设计师提交简历和面试的关键。因此&#xff0c;与其担心自己学历低&#xff0c;不懂谈判技巧&#xff0c;不如多关注作品集。看了很多设计师的简历和作品集&#xff0c;发现下面的坑经常被踩。为了避免这些坑&#xff0c;建议您选择即时设计来制作作品集&#xff0c; …

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…

阿里云降价,这泼天的富贵你接不接?附云服务器价格表

阿里云能处&#xff0c;关键时刻ta真降价啊&#xff01;2024新年伊始阿里云带头降价了&#xff0c;不只是云服务器&#xff0c;云数据库和存储产品都降价&#xff0c;阿里云新老用户均可购买99元服务器、199元服务器&#xff0c;续费不涨价&#xff0c;阿里云百科aliyunbaike.c…

AI时代的产品文案秘籍:如何用AI提升效率

人工智能写作工具&#xff1a;解放双手&#xff0c;创作不停歇 在当前人工智能技术飞速发展的背景下&#xff0c;越来越多的个体已经开始利用这一AI写作工具&#xff0c;以显著提高自己的工作效率。这不仅标志着人工智能服务于人类的宏伟时代的到来&#xff0c;更是人人可用的创…

Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client

Elasticsearch入门-环境安装ES和Kibana 安装 ES Windows安装ESHead安装浏览器插件 es-clientKibana 安装 安装es,安装header 安装kibana&#xff0c;安装多种分词器ik… 安装 ES Windows安装 ① 下载压缩包并解压官网链接&#xff1a;https://www.elastic.co/cn/downloads/ela…

每日一类:Qt GUI开发的基石《QWidget》

深入探索QWidget&#xff1a;Qt GUI开发的基石 在Qt框架中&#xff0c;QWidget类扮演着构建图形用户界面&#xff08;GUI&#xff09;的基础角色。它不仅提供了窗口的基本功能&#xff0c;还允许开发者通过继承和定制来创建各式各样的用户界面元素。本文将详细介绍QWidget的关…

Timeplus-proton流处理器调研

概念 Timeplus是一个流处理器。它提供强大的端到端功能&#xff0c;利用开源流引擎Proton来帮助数据团队快速直观地处理流数据和历史数据&#xff0c;可供各种规模和行业的组织使用。它使数据工程师和平台工程师能够使用 SQL 释放流数据价值。 Timeplus 控制台可以轻松连接到不…

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个&#xff0c;我的是Apple芯片&#xff0c;选Apple Silicon -- 第三步 右上角下载处打开安装包&…

零成本建站方案之Github Pages

之前的文章中介绍了如何申请AWS免费服务器并使用WordPress来搭建个人网站&#xff0c;今天给大家介绍一种无需任何硬件资源&#xff0c;也就是不需要准备服务器就可以搭建一个网站的方案&#xff0c;那就是使用github pages来搭建一个静态网站。 第一步&#xff0c;需要准备一个…

Google索引脚本:快速索引你的网站

公众号&#xff1a;【可乐前端】&#xff0c;每天3分钟学习一个优秀的开源项目&#xff0c;分享web面试与实战知识。 每天3分钟开源 hi&#xff0c;这里是每天3分钟开源&#xff0c;很高兴又跟大家见面了&#xff0c;今天介绍的开源项目简介如下&#xff1a; 仓库名&#xff1…

大街款商城项目03-微服务之间调用

目录 RestTemplate OpenFeign 1.引入依赖open-feign 2.声明要调用的服务和接口 3.注入FeignClient启用 4验证 RestTemplate 在微服务架构中&#xff0c;使用RestTemplate是一种常见的方式进行服务间的HTTP通信。以下是一个简单的示例&#xff0c;演示如何使用RestTempla…

【前端素材】推荐优质后台管理系统DAdmin平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…

OV通配符证书

OV通配符证书结合了组织验证&#xff08;Organization Validation, OV&#xff09;和通配符&#xff08;Wildcard&#xff09;两个概念。组织验证意味着证书颁发机构会验证申请者是否为一个合法的组织&#xff0c;这增加了证书的信任度。通配符则是指证书可以用于保护一个主域名…