推特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 = 上面图里面的客户IDscope = 你需要用户给你授权的权限,每个权限都是以%20分割,下图会详细介绍具体怎么来的response_type=code  这个是固定的,表示我们要去用户的coderedirect_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_codeString 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_credentialsString 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");//我们实际使用TokentwitterDto.setAccessToken(accessToken == null ? null : accessToken.toString());//当我们使用的Token过期以后可以用这个来换取新的TokenaccessToken = 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 {@Autowiredprivate 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.mzph.cn/news/719657.shtml

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

相关文章

百度百科人物创建要求是什么?

百度百科作为我国最大的中文百科全书&#xff0c;其收录的人物词条要求严谨、客观、有权威性。那么&#xff0c;如何撰写一篇高质量的人物词条呢&#xff1f;本文伯乐网络传媒将从内容要求、注意事项以及创建流程与步骤三个方面进行详细介绍。 一、内容要求 1. 基本信息&#…

什么是 web 应用的 type-ahead search help

在 Web 前端设计领域&#xff0c;type-ahead search help&#xff08;又称为自动完成或即时搜索&#xff09;是一种用户界面功能&#xff0c;它能够在用户输入搜索词的同时&#xff0c;实时提供搜索建议或结果。这种功能极大地提升了用户体验&#xff0c;因为它可以帮助用户快速…

LeetCode每日一题【c++版】- 用队列实现栈与用栈实现队列

用队列实现栈 题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除…

Studio One 6永久激活版 附完整图文安装破解教程

Studio One 6是一款功能强大的音乐制作和录音软件&#xff0c;专为Mac操作系统设计。它提供了多轨录音和混音、MIDI音乐制作、实时效果和处理、VST插件支持以及高级编辑和编排等丰富的功能。无论是专业音乐制作人还是音乐爱好者&#xff0c;都可以使用Studio One 6来创建和编辑…

程序员英语词汇宝典(建议收藏)

很多小伙伴说&#xff0c;英文不好能不能学习编程&#xff0c;我个人的看法是英文不好&#xff0c;并不影响你学习编程&#xff0c;但有可能会影响到你的编程上限&#xff0c;因为一些最新的文档都是英文的。如果你想成为一个编程大牛&#xff0c;那么英文还是很有必要的。今天…

cocos-lua定时器用法

本文介绍cocos-lua(非Quick-cocos)的定时器用法 定时器按是否会随节点销毁&#xff0c;可分为节点调度器和全局调度器 一.节点调度器 frameworks\cocos2d-x\cocos\scripting\lua-bindings\script\cocos2d\deprecated.lua中实现了了schedule和 performWithDelay 1.1.schedul…

基础真空技术外国文献Fundamentals of Vacuum Technology

基础真空技术外国文献Fundamentals of Vacuum Technology

道路积水监测站——确保道路畅通和行车安全

TH-JS1道路积水监测站是一种专门用于监测城市道路积水情况的设备&#xff0c;旨在保障城市道路安全和防止水患对交通造成的不利影响。这些监测站通过实时检测和记录道路积水数据&#xff0c;为城市管理部门提供重要信息&#xff0c;以便及时采取应对措施&#xff0c;确保道路畅…

vue diff算法介绍

Vue.js 的 diff 算法是一种用于虚拟 DOM 比较的高效算法&#xff0c;其核心目的是在数据变更时&#xff0c;能够最小化 DOM 操作&#xff0c;提高更新性能。以下是关于 Vue diff 算法的介绍&#xff1a; 1. 算法目标&#xff1a; Vue 的 diff 算法旨在比较新旧虚拟节点&#…

990-29产品经理:IT risk management process IT风险管理流程

IT risk management process IT风险管理流程 In business, IT risk management entails a process of identifying, monitoring and managing potential information security or technology risks with the goal of mitigating or minimising their negative impact. Exampl…

MATLAB环境下基于离散小波变换的心电信号伪影去除及PQRST波检测

可穿戴个人健康监护系统被广泛认为是下一代健康监护技术的核心解决方案。监护设备不断地感知、获取、分析和存储大量人体在日常活动中的生理数据&#xff0c;为人体的健康状况提供必要的、准确的、集成的和长期的评估和反馈。在心电监测领域&#xff0c;可穿戴传感器具有以下应…

LeetCode刷题-206.反转链表【递归实现】

206.反转链表 题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例2 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例3 输入&#xff1a;hea…

鸿蒙开发就业前景以及发展方向分析~

鸿蒙操作系统作为华为公司自主研发的操作系统&#xff0c;已经成为当下炙手可热的话题。作为一个全新的操作系统&#xff0c;鸿蒙开发为IT行业带来了巨大的就业机会。本文将围绕鸿蒙开发的就业前景以及发展方向展开讨论。 一、鸿蒙开发就业前景 随着鸿蒙操作系统的发布&#…

python实现有限域GF(2^8)上的乘法运算

有限域GF(2^8)上的乘法运算可以看成多项式的乘法 5e转换成二进制为0101 1110&#xff0c;对应的多项式为x^6x^4x^3x^2x 3f转换成二进制为0011 1111&#xff0c;对应的多项式为x^5x^4x^3x^2x1 将这两个多项式相乘再模多项式x^8x^4x^3x1得到结果为1110 0101&#xff0c;转换为…

latex编译生成的pdf文件,图片出现浅色的线

目录 问题描述&#xff1a; 解决办法&#xff1a; 问题描述&#xff1a; 在overleaf中&#xff0c;导入图片&#xff0c;编译之后&#xff0c;不知道为什么会出现一条浅色的线&#xff0c;很影响视觉效果&#xff08;ps:在浏览器中看不到这条线&#xff0c;但是在pdf阅读器中…

分巧克力 刷题笔记

/* 分巧克力 解题思路 二分 直接检查看答案是否符合题目条件 对于一块边长分别为x 和y的巧克力\\ 假设我们输入检查的数为k 其能分割成的 k*k 的巧克力的块数为 (x/k)*(y/k) 因为c里面的除法是下取整的所以我们不用考虑奇偶数 是否能整除 将每一块巧克力能分成的k*k的巧克力…

管家婆订货易在线商城 VshopProcess 任意文件上传漏洞复现

0x01 产品简介 管家婆订货易,帮助传统企业构建专属的订货平台,PC+微信+APP+小程序+h5商城5网合一,无缝对接线下的管家婆ERP系统,让用户订货更高效。支持业务员代客下单,支持多级推客分销,以客带客,拓展渠道。让企业的生意更轻松。 0x02 漏洞概述 管家婆订货易在线商城…

Matlab 机器人工具箱 符合动力学

文章目录 1 符合化表示1.1 标准DH动力学1.2 改进DH动力学 质量集中在质心1.2 改进DH动力学 质量集中在末端1.3 程序问题1.3.1 Unable to perform assignment because value of type sym is not convertible to double.1.3.2 CAT arguments dimensions not consistent.参考链接1…

一篇了解电阻的使用

目录 一、电阻理论基础 1.电阻的定义 2.欧姆定律 3.电阻决定式 4.电阻的串并联​编辑 5.电阻的功率 6.温度对电阻的影响 二、电阻的选型 1.安装方式 2.电阻值 &#xff08;1&#xff09;电阻值的标称 &#xff08;2&#xff09;电阻值的确定 &#xff08;3&#x…

test only

https://drive.google.com/viewer?urlhttps://www.labnol.org/files/word.docx 使用插件将html -> pdf 要在React中使用react-pdf将一段HTML代码转换为PDF&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 安装react-pdf&#xff1a;在您的React项目中&#xff0…