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

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接口。
代码示例可在上篇看到。

相关文章:

java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。 下面介绍怎么通过twitter提供的API&#xff0c;进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”&#xff0c;点击edit进行信息编辑。 我的授权登录是个网页&#xff0c;并且只需要进行简单的…...

​ SK Ecoplant借助亚马逊云科技,海外服务器为环保事业注入新活力

在当今全球面临着资源紧缺和环境挑战的大背景下&#xff0c;数字技术所依赖的海外服务器正成为加速循环经济转型的关键利器。然而&#xff0c;很多企业在整合数字技术到运营中仍然面临着一系列挑战&#xff0c;依然存在低效流程导致的不必要浪费。针对这一问题&#xff0c;SK E…...

RPC(5):AJAX跨域请求处理

接上一篇RPC&#xff08;4&#xff09;&#xff1a;HttpClient实现RPC之POST请求进行修改。 1 修改客户端项目 1.1 修改maven文件 修改后配置文件如下&#xff1a; <dependencyManagement><dependencies><dependency><groupId>org.springframework.b…...

用大白话举例子讲明白区块链

什么是区块链&#xff1f;网上这么说&#xff1a; 区块链是一种分布式数据库技术&#xff0c;它以块的形式记录和存储交易数据&#xff0c;并使用密码学算法保证数据的安全性和不可篡改性。每个块都包含了前一个块的哈希值和自身的交易数据&#xff0c;形成了一个不断增长的链条…...

Java URL

URL&#xff1a;统一资源定位符&#xff0c;说白了&#xff0c;就是一个网络 通过URLConnection类可以连接到URL&#xff0c;然后通过URLConnection可以获取读数据的通道。非文本数据用字节流来读取。 读完之后写入本地即可。 public class test {public static void main(S…...

ETL-从1学到100(1/100):ETL涉及到的名词解释

本文章主要介绍ETL和大数据中涉及到名词&#xff0c;同时解释这些名词的含义。由于不是一次性收集这些名词&#xff0c;所以这篇文章将会持续更新&#xff0c;更新日志会存放在本段话下面&#xff1a; 12-19更新&#xff1a;OLTP、OLAP、BI、ETL。 12-20更新&#xff1a;ELT、…...

Jenkins + gitlab 持续集成和持续部署的学习笔记

1. Jenkins 介绍 软件开发生命周期(SLDC, Software Development Life Cycle)&#xff1a;它集合了计划、开发、测试、部署的集合。 软件开发瀑布模型 软件的敏捷开发 1.1 持续集成 持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。 持续集成的流…...

R语言【cli】——通过cli_abort用 cli 格式的内容显示错误、警告或信息,内部调用cli_bullets和inline-makeup

cli_abort(message,...,call .envir,.envir parent.frame(),.frame .envir ) 先从那些不需要下大力气理解的参数入手&#xff1a; 参数【.envir】&#xff1a;进行万能表达式编译的环境。 参数【.frame】&#xff1a;抛出上下文。默认用于参数【.trace_bottom】&#xff…...

cka从入门到放弃

无数次想放弃&#xff0c;最后选择了坚持 监控pod日志 监控名为 foobar 的 Pod 的日志&#xff0c;并过滤出具有 unable-access-website 信息的行&#xff0c;然后将 写入到 /opt/KUTR00101/foobar # 解析 监控pod的日志&#xff0c;使用kubectl logs pod-name kubectl logs…...

通过 jekyll 构建 github pages 博客实战笔记

jekyll 搭建教程 jekyll 搭建教程 Gem 安装 Ruby&#xff0c;请访问 下载地址。 Jekyll Jekyll 是一个简单且具备博客特性的静态网站生成器。 Jekyll 中文文档 极客学院中文文档 使用以下命令安装 Jekyll。 $ gem install jekyll在中国可能需要使用代理软件。然后&#xff…...

【AI美图】第09期效果图,AI人工智能汽车+摩托车系列图集

期待中的未来AI汽车 欢迎来到未来的世界&#xff0c;一个充满创新和无限可能的世界&#xff0c;这里有你从未见过的科技奇迹——AI汽车。 想象一下&#xff0c;你站在十字路口&#xff0c;繁忙的交通信号灯在你的视线中闪烁&#xff0c;汽车如潮水般涌来&#xff0c;但是&…...

网线的制作集线器交换机路由器的配置--含思维导图

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 一、网线的制作 1、网线的材料有哪些&#xff1f; 网线 网线是一种用于传输数据信号的电缆&#xff0c;广泛应…...

LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理

Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜&#xff08;https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard&#xff09;前列。多个基准测试表明&#xff0c;就性能而言&#xff0c;它正在接近GPT-3.5…...

柔性数组(结构体成员)

目录 前言&#xff1a; 柔性数组&#xff1a; 给柔性数组分配空间&#xff1a; 调整柔性数组大小&#xff1a; 柔性数组的好处&#xff1a; 前言&#xff1a; 柔性数组&#xff1f;可能你从未听说&#xff0c;但是确实有这个概念。听名字&#xff0c;好像就是柔软的数…...

C#合并多个Word文档(微软官方免费openxml接口)

g /// <summary>/// 合并多个word文档&#xff08;合并到第一文件&#xff09;/// </summary>/// <param name"as_word_paths">word文档完整路径</param>/// <param name"breakNewPage">true(默认值)&#xff0c;合并下一个…...

MySQL 5.7依赖的软件包和下载地址

​​​​​​​yum install ncurses-devel openssl openssl-devel gcc gcc-c ncurses ncurses-devel bison make -y mysql下载地址 下载地址...

图论 | 网络流的基本概念

文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络&#xff1a; G ( V , E ) G (V, E) G(V,E) 有向图&#xff0c;不考虑反向边s&#xff1a;源点t&#xff1a;汇点 c ( u , v ) c(u, v) c(u,v)&#xff…...

【音视频 | AAC】AAC音频编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

redis基本用法学习(C#调用NRedisStack操作redis)

redis官网文档中推荐C#中使用NRedisStack包连接并操作redis&#xff0c;本文学习C#调用NRedisStack操作redis的基本方式。   新建Winform项目&#xff0c;在Nuget包管理器中搜索并安装NRedisStack包&#xff0c;如下图所示&#xff1a; 主要调用StackExchange.Redis命名空间下…...

[CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]

文章目录 前言小结 原文地址&#xff1a;https://blog.csdn.net/qq_45752541/article/details/132854115 前言 mesh 和点是最常见的3D场景表示&#xff0c;因为它们是显式的&#xff0c;非常适合于快速的基于GPU/CUDA的栅格化。相比之下&#xff0c;最近的神经辐射场&#xf…...

用格子玻尔兹曼方法 - 浸没边界法模拟圆柱绕流(LBM - IBM in C++)

格子玻尔兹曼方法-浸没边界法模拟圆柱绕流 LBM- IBM &#xff08;C&#xff09;在计算流体力学&#xff08;CFD&#xff09;的领域里&#xff0c;格子玻尔兹曼方法&#xff08;Lattice Boltzmann Method, LBM&#xff09;和浸没边界法&#xff08;Immersed Boundary Method, IB…...

Pixel Fashion Atelier入门必看:Forge!按钮物理位移反馈的CSS3实现原理

Pixel Fashion Atelier入门必看&#xff1a;Forge!按钮物理位移反馈的CSS3实现原理 1. 引言&#xff1a;像素世界的物理交互 在Pixel Fashion Atelier这款独特的图像生成工具中&#xff0c;最令人印象深刻的莫过于那个醒目的橙色"锻造"按钮。当用户点击时&#xff…...

基于人工电场搜索智能优化算法的水库发电和供水优化调度

基于人工电场搜索智能优化算法的水库发电和供水优化调度&#xff1b; 代码为MATLAB编写&#xff0c;可直接运行&#xff1b; 含有实例数据&#xff0c;点击即可运行&#xff0c;替换成自己数据点击即可出结果&#xff0c;如图。在水库管理中&#xff0c;实现发电和供水的优化调…...

解锁Navicat密码:突破加密限制的开源解密工具

解锁Navicat密码&#xff1a;突破加密限制的开源解密工具 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 当数据库连接密码被Navicat加密保存却无法记起&…...

告别Linux卡顿!用RK3562的M0核跑RT-Thread,实现实时控制与Linux并行运行

RK3562多核异构开发实战&#xff1a;用M0核实现Linux与RT-Thread的完美协同 在智能家居控制器项目中&#xff0c;我们遇到了一个典型难题——当Linux系统处理图形界面和网络通信时&#xff0c;电机的实时控制会出现明显延迟。传统解决方案需要两套独立硬件&#xff0c;直到我们…...

browser-use爆火:AI Agent接管浏览器,测试自动化正在被重构

导读 最近在实际项目和工具演进中&#xff0c;可以明显看到一个变化&#xff1a; AI 不再只是写代码&#xff0c;而是开始“直接干活”。 这款 browser-use开源工具非常厉害。它能让AI Agent&#x1f680;直接操控浏览器。实现网页任务自动化简单高效 (๑•̀ㅂ•́)و✧。该…...

生成式AI欺诈来袭,什么样的IP数据接口才能筑起防线?

某电商平台的风控系统发出预警&#xff1a;一个“新用户”正在批量下单高价商品&#xff0c;收货地址遍布全国&#xff0c;支付方式各不相同。但奇怪的是&#xff0c;这些订单的浏览行为、停留时间、点击轨迹几乎完全一致——这不是真人&#xff0c;而是生成式AI模拟的虚假用户…...

2025年雀魂Mod工具终极指南:从痛点分析到实践探索

2025年雀魂Mod工具终极指南&#xff1a;从痛点分析到实践探索 【免费下载链接】majsoul_mod_plus 雀魂解锁全角色、皮肤、装扮等&#xff0c;支持全部服务器。 项目地址: https://gitcode.com/gh_mirrors/ma/majsoul_mod_plus 在雀魂游戏体验中&#xff0c;你是否曾因角…...

Java 核心四大基石:从 Object 源码到包装类陷阱的全维度复盘

让我们从两个常见的实际场景出发&#xff0c;看看开发者会遇到什么困惑。 场景一&#xff1a;如何在程序中获取“当前时间”&#xff1f; 你一定见过这样的界面&#xff1a; 直播画面右上角显示&#xff1a;2026 年 01 月 08 日 15:00:00&#xff08;实时更新&#xff09; 这个…...

生物信息学避坑指南:你的热图聚类总乱?可能是数据标准化和样品注释没做对

生物信息学避坑指南&#xff1a;热图聚类混乱的根源与系统性解决方案 热图&#xff08;Heatmap&#xff09;作为生物信息学中最常用的数据可视化工具之一&#xff0c;广泛应用于基因表达分析、代谢组学、微生物组学等领域。然而&#xff0c;许多初学者在使用热图进行样品聚类时…...