java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。
下面介绍怎么通过twitter提供的API,进行授权登录功能。

开发者页面设置

首先在开发者页面开启“用户认证设置”,点击edit进行信息编辑。
在这里插入图片描述
我的授权登录是个网页,并且只需要进行简单的登录和获取登录人员基础信息这些信息,所以进行了以下设置。
在这里插入图片描述
这里一定要配置回调地址,这个地址至关重要。
测试期间不需要域名这些,也不需要天公网IP。
内网本地地址就可以,http://localhost:63342/index.html 也可以(自己可以写一个简单的测试页)
在这里插入图片描述

了解授权步骤

编写代码之前我们要先了解twitter授权登录的三步骤。
https://developer.twitter.com/en/docs/authentication/guides/log-in-with-twitter
以上链接有详细的授权验证过程,当然我也可以简单介绍一下。

  1. 请求https://api.twitter.com/oauth/request_token接口。 在请求这个接口的时候,不仅要传申请的consumerKeyconsumerSecret,还得填写oauth_callback的值。这个值的内容填写你上面在Callback URL里填写的回调地址【http://localhost:63342/index.html】。
  2. 请求成功后拿到oauth_token值,网页调转到https://api.twitter.com/oauth/authenticate页面,链接后面加上 ** ?oauth_token= ** 的值。
    参数成功的话,会正确调转到twitter授权的页面,点击授权按钮后,twitter页面会跳转回你填写的页面链接。

twitter授权登录页面
回到自己的页面后,页面的URL会携带两个参数和参数值。oauth_tokenoauth_verifier
回调返回值

  1. 拿到URL中传回的这两个值,请求https://api.twitter.com/oauth/access_token接口,拿到用户授权的screen_nameuser_idauth_tokenoauth_token_secret这些值。
  2. token和token_secret两个参数,可以通过请求https://api.twitter.com/2/users/me接口获取用户的一些基础信息。

注意!以上过程,oauth_token和oauth_verifier的值失效时间很短暂,找到一个帖子说只有30秒,所以接口连贯性请求很重要,只有速度,快速授权过程才能完成。

编写代码

流程介绍完,开始编写代码。

  1. 首先,网页上增加一个按钮。
 <!-- 点击按钮触发授权 --><button onclick="authorizeTwitter()">Twitter授权登录</button>

编写js代码,authorizeTwitter()方法

function authorizeTwitter() {// 发起授权请求$.ajax({url:'http://localhost:8070/twitter/login',type:'POST',async: true,cache: false,contentType: false, //不设置内容类型processData: false, //不处理数据success:function(data){var code = data.code;if(code == 200){window.location.href ="https://api.twitter.com/oauth/authenticate?oauth_token="+data.result;}else{console.error('授权请求错误:');layer.alert("请求失败,请稍候重试");}}});
}
  1. twitter/login接口核心代码如下
    callback的传值就是开发者里配置的Callback URL的填写的值。
    和网页配置的保持一致,不可随意传值。
    active的值只是用于开启代理的开关,上篇代码有写,根据自己需求传不同的值。
 /*** 第一步:通过授权code获取token* @param active 当前环境  dev test prod* @return*/public static String RequestToken(String callback,String active) {CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);// 创建HttpParameters对象,并添加自定义参数HttpParameters parameters = new HttpParameters();parameters.put(OAuth.OAUTH_CALLBACK, callback);consumer.setAdditionalParameters(parameters);// 创建HttpClient对象HttpClient httpClient = setProxy(active);// 创建API请求,例如获取用户的时间线String apiUrl = "https://api.twitter.com/oauth/request_token";HttpGet request = new HttpGet(apiUrl);// 对请求进行OAuth1签名try {consumer.sign(request);} catch (OAuthMessageSignerException e) {e.printStackTrace();} catch (OAuthExpectationFailedException e) {e.printStackTrace();} catch (OAuthCommunicationException e) {e.printStackTrace();}// 发起API请求HttpResponse response = null;try {response = httpClient.execute(request);} catch (IOException e) {e.printStackTrace();}// 处理API响应int statusCode = response.getStatusLine().getStatusCode();String responseBody = null;try {responseBody = EntityUtils.toString(response.getEntity());} catch (IOException e) {e.printStackTrace();}if (statusCode == 200) {System.out.println("API调用成功!");System.out.println("响应内容:");System.out.println(responseBody);return responseBody;} else {System.out.println("API调用失败,状态码:" + statusCode);System.out.println("错误信息:");System.out.println(responseBody);return responseBody;}}

成功返回的值形式如下:

oauth_token=qQn3YwAAAAABq1bmAAABi9gPG1M&oauth_token_secret=2QBmMyDV450YG1dtdf5KnnGrztnRXKmR&oauth_callback_confirmed=true

我用httpcore工具进行解析,需要用到的类如下。
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;

List<NameValuePair> parameters = URLEncodedUtils.parse(responseString, StandardCharsets.UTF_8);
// 遍历参数并输出键值对
for (NameValuePair parameter : parameters) {String key = parameter.getName();String value = parameter.getValue();map.put(key,value);
}

把oauth_token值传到前台页面,前台页面进行跳转。
参考如下:

https://api.twitter.com/oauth/authenticate?oauth_token=qQn3YwAAAAABq1bmAAABi9gPG1M

授权成功之后,调转回调页面。如果之前授权过,会很快跳转到回调页面。

 http://localhost:63342/index.html?oauth_token=s19K7gAAAAABq1bmAAABi9fpDPI&oauth_verifier=cHqqlM9vi0gn8EDDtrCmUvh3jCSQCGcL

拿到oauth_token和oauth_verifier的值,页面load()方法解析获取oauth_token和oauth_verifier请求第二个接口。

   function callbackTwitter(token,verifier) {var authorize = new FormData();authorize.append("oauth_token",token);authorize.append("oauth_verifier",verifier);console.log(authorize);// 发起授权请求$.ajax({url:'http://localhost:8070/twitter/verifier',type:'POST',data:authorize,async: true,cache: false,contentType: false, //不设置内容类型processData: false, //不处理数据success:function(data){                          // var data = eval('(' + data + ')');var code = data.code;if(code == 200){//自己业务}else{console.error('授权请求错误:');layer.alert("请求失败,请稍候重试");}}});}

第二个接口核心Java代码。
oauth_verifier值是放在请求体里,和第一个接口oauth_callback参数方式有些不同。

  /*** 第二部,页面跳转* @param token* @param verifier* @param active* @return*/public static String callback(String token,String verifier, String active) {// 创建CommonsHttpOAuthConsumer对象,设置OAuth1验证参数CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);// 创建HttpParameters对象,并添加自定义参数HttpParameters parameters = new HttpParameters();parameters.put(OAuth.OAUTH_TOKEN, token);consumer.setAdditionalParameters(parameters);// 创建HttpClient对象HttpClient httpClient = setProxy(active);// 创建API请求,例如获取用户的时间线String apiUrl = "https://api.twitter.com/oauth/access_token";HttpPost request = new HttpPost(apiUrl);try {request.setHeader("Content-Type","application/x-www-form-urlencoded");consumer.sign(request);// 创建参数列表List<NameValuePair> bodypara = new ArrayList<>();bodypara.add(new BasicNameValuePair("oauth_verifier", verifier));// 将参数转换为UrlEncodedFormEntityStringEntity entity = new UrlEncodedFormEntity(bodypara, StandardCharsets.UTF_8);// 设置HttpPost的实体request.setEntity(entity);
//            request.setEntity();} catch (OAuthMessageSignerException e) {e.printStackTrace();} catch (OAuthExpectationFailedException e) {e.printStackTrace();} catch (OAuthCommunicationException e) {e.printStackTrace();}// 发起API请求HttpResponse response = null;try {response = httpClient.execute(request);} catch (IOException e) {e.printStackTrace();}// 处理API响应int statusCode = response.getStatusLine().getStatusCode();String responseBody = null;try {responseBody = EntityUtils.toString(response.getEntity());} catch (IOException e) {e.printStackTrace();}if (statusCode == 200) {System.out.println("API调用成功!");System.out.println(responseBody);return responseBody;} else {System.out.println("API调用失败,状态码:" + statusCode);return responseBody;}}

请求成功后的返回内容。

 oauth_token=1517001992861716480-xVY7MpIqQrH1XeFv5l6rOL0FqG9WPj&oauth_token_secret=A52yWlrFd1MDIrYU0IcnmlnmimMOw0UXRJNfnry3bJNfm&user_id=151700199286171xxxx&screen_name=TTTTTTTXX

这用户的重要的用户ID和用户名就获取到了。
整个授权流程算是完成了。

我的业务是需要获取用户的粉丝数和其他一些基础信息,这时候就可以用返回的oauth_token和oauth_token_secret两个值请求https://api.twitter.com/2/users/me接口。
代码示例可在上篇看到。

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

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

相关文章

动物姿态估计:微调 YOLOv8 姿态模型

动物姿态估计是计算机视觉的一个研究领域&#xff0c;是人工智能的一个子领域&#xff0c;专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一种或多种动物的身体部位&#xff08;例如头部、四肢和尾巴&#xff09;的空间排列。这项技术具有广泛的应用&#…

uniapp 单选按钮 选中默认设备

需求1&#xff1a;选中默认设备&#xff0c;113 和114 和139都可以选中一个默认设备 选中多个默认设备方法&#xff1a; async toSwitch(typeItem, title) {const res await this.setDefaultDev(typeItem.ibdr_devsn, typeItem.ibdr_pid)if (!res) {this.common.toast(切换默…

关于在Java中打印三角形图形的汇总

前面写过一些关于打印三角形图形代码的文章&#xff0c;这里进行了汇总&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; /*** 关于打印三角形的汇总*/ public class Work1 {public static void main(String[] args) {int num 5;/** 打印如下图形&#xff1a;* ** …

OPCServer KEPServer安装和使用

OPCServer KEPServer安装和使用 简介 KEPServer软件是免费的&#xff0c;驱动收费&#xff0c;每天2小时试用时间, 免费用来模拟仿真是很不错的选择 OPC DA 和OPC UA都支持 中文官网地址: https://www.kepware.com/zh-cn/ 中文官方文档&#xff08;经常有更新&#xff0c;其…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库&#xff1f; 随着数据量的急速上升&#xff0c;单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈&#xff0c;所以需要考虑拆分数据库&#xff0c;将数据库分布在不同实例上提升数据库可用性。主要的原因有如下&#xff1a; 磁盘存储。业务量剧增&…

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

05-命令模式

意图&#xff08;GOF定义&#xff09; 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户端进行参数化&#xff0c;对请求排队或者记录日志&#xff0c;以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

Linux环境下maven的安装

到官网下载maven 步入下面的地址选择合适的maven版本 https://dlcdn.apache.org/maven/ 以笔者为例&#xff0c;选择了3.5.4这个版本 将maven上传到Linux服务器并解压 tar -zxvf apache-maven-3.5.4-bin.tar.gz配置环境变量 我们使用vim编辑profile vim /etc/profile环境…

【数据结构(十一·多路查找树)】B树、B+树、B*树(6)

文章目录 1. 二叉树 与 B树1.1. 二叉树存在的问题1.2. 多叉树 的概念1.3. B树 的基本介绍 2. 多叉树——2-3树2.1. 基本概念2.2. 实例应用2.3. 其他说明 3. B 树、B树 和 B*树3.1. B树 的介绍3.2. B树 的介绍3.2. B*树 的介绍 1. 二叉树 与 B树 1.1. 二叉树存在的问题 二叉树…

react Hooks(useEffect)实现原理 - 简单理解

useEffect 语法&#xff1a; useEffect(setup, dependencies?) 含义: useEffect 是一个 React Hook&#xff0c;它允许你 将组件与外部系统同步。 useEffect 源码简单理解 一、mountEffect 和 upadateEffect useEffect 与其它 hooks 一样分为 mountEffect 和 upadateEffec…

I2C总线通信(温湿度实验)

1.使能GPIOF时钟 2.将PF14设置为输出&#xff0c;PF15也可以先设置为输出 3.设置输出速度最高档位速度 4.SI7006的初始化 5.读取温度、湿度 6.将读取到的温度湿度数据通过计算公式进行转换 7.将结果输出 main.c #include "si7006.h"extern void printf(cons…

工科数学分析(华南理工大学)

旷了三天课&#xff0c;估计要被薄纱了这下&#xff08;&#xff09; ----------------引言 第一节 集合与实数集 比较重要的是实数具有稠密性。 即在两个实数之间存在无穷个其他实数&#xff0c; 然后是绝对值不等式 第一个经常用来放缩不等式&#xff0c;证明极限 第二…

DENet:用于可见水印去除的Disentangled Embedding网络笔记

1 Title DENet: Disentangled Embedding Network for Visible Watermark Removal&#xff08;Ruizhou Sun、Yukun Su、Qingyao Wu&#xff09;[AAAI2023 Oral] 2 Conclusion This paper propose a novel contrastive learning mechanism to disentangle the high-level embedd…

Debian 系统镜像下载

最近在看一些网络相关的文章需要用到 debian 11.x 的系统网上找了好多都发下载&#xff0c;在官网看一下 有个 11.8 的版本我无法下载&#xff0c;提示被最新的 debian-12.4.0 所代替&#xff0c;于是找到了这个链接 Index of /cdimage/unofficial/non-free/cd-including-fi…

imazing是什么软件

imazing是什么软件 iMazing 是世界上最值得信赖的软件,可以将您的信息、音乐、文件和数据从 iPhone 或 iPad 传输到您的 Mac 或 PC。 获得备份、数据提取、媒体和文件传输的强大能力,以及更多 iMazing 功能。 iMazing是一款第三方的苹果iOS设备管理软件。 iMazing- 2 Mac-安装…

死锁(面试常问)

1.什么是死锁 简单来说就是一个线程加锁后解锁不了 一个线程&#xff0c;一把锁&#xff0c;线程连续加锁两次。如果这个锁是不可重入锁&#xff0c;会死锁。两个线程&#xff0c;两把锁。 举几个例子&#xff0c;1.钥匙锁车里了&#xff0c;车钥匙锁家里了。2. 现在有一本书…

在 Qt Creator 中编写 Doxygen 风格的注释

2023年12月10日&#xff0c;周日上午 如何生成Doxygen 风格的注释 在需要Doxygen 风格注释的函数上方输入 /**&#xff0c;然后按下 Enter 键。Qt Creator 将自动为你生成一个注释模板。 输入&#xff0c;Qt Creator会自动帮你补全Doxygen标签 不得不说&#xff0c;写了Doxyge…

Re58:读论文 REALM: Retrieval-Augmented Language Model Pre-Training

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称&#xff1a;REALM: Retrieval-Augmented Language Model Pre-Training 模型名称&#xff1a;Retrieval-Augmented Language Model pre-training (REALM) 本文是2020年ICML论文&#xff0c;作者来自…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务—鸿鹄工程管理系统

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 项目背景 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的提…