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
以上链接有详细的授权验证过程,当然我也可以简单介绍一下。
- 请求https://api.twitter.com/oauth/request_token接口。 在请求这个接口的时候,不仅要传申请的consumerKey和consumerSecret,还得填写oauth_callback的值。这个值的内容填写你上面在Callback URL里填写的回调地址【http://localhost:63342/index.html】。
- 请求成功后拿到oauth_token值,网页调转到https://api.twitter.com/oauth/authenticate页面,链接后面加上 ** ?oauth_token= ** 的值。
参数成功的话,会正确调转到twitter授权的页面,点击授权按钮后,twitter页面会跳转回你填写的页面链接。
回到自己的页面后,页面的URL会携带两个参数和参数值。oauth_token和oauth_verifier
- 拿到URL中传回的这两个值,请求https://api.twitter.com/oauth/access_token接口,拿到用户授权的screen_name和user_id,auth_token和oauth_token_secret这些值。
- token和token_secret两个参数,可以通过请求https://api.twitter.com/2/users/me接口获取用户的一些基础信息。
注意!以上过程,oauth_token和oauth_verifier的值失效时间很短暂,找到一个帖子说只有30秒,所以接口连贯性请求很重要,只有速度,快速授权过程才能完成。
编写代码
流程介绍完,开始编写代码。
- 首先,网页上增加一个按钮。
<!-- 点击按钮触发授权 --><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("请求失败,请稍候重试");}}});
}
- 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,进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”,点击edit进行信息编辑。 我的授权登录是个网页,并且只需要进行简单的…...
SK Ecoplant借助亚马逊云科技,海外服务器为环保事业注入新活力
在当今全球面临着资源紧缺和环境挑战的大背景下,数字技术所依赖的海外服务器正成为加速循环经济转型的关键利器。然而,很多企业在整合数字技术到运营中仍然面临着一系列挑战,依然存在低效流程导致的不必要浪费。针对这一问题,SK E…...
RPC(5):AJAX跨域请求处理
接上一篇RPC(4):HttpClient实现RPC之POST请求进行修改。 1 修改客户端项目 1.1 修改maven文件 修改后配置文件如下: <dependencyManagement><dependencies><dependency><groupId>org.springframework.b…...
用大白话举例子讲明白区块链
什么是区块链?网上这么说: 区块链是一种分布式数据库技术,它以块的形式记录和存储交易数据,并使用密码学算法保证数据的安全性和不可篡改性。每个块都包含了前一个块的哈希值和自身的交易数据,形成了一个不断增长的链条…...
Java URL
URL:统一资源定位符,说白了,就是一个网络 通过URLConnection类可以连接到URL,然后通过URLConnection可以获取读数据的通道。非文本数据用字节流来读取。 读完之后写入本地即可。 public class test {public static void main(S…...
ETL-从1学到100(1/100):ETL涉及到的名词解释
本文章主要介绍ETL和大数据中涉及到名词,同时解释这些名词的含义。由于不是一次性收集这些名词,所以这篇文章将会持续更新,更新日志会存放在本段话下面: 12-19更新:OLTP、OLAP、BI、ETL。 12-20更新:ELT、…...
Jenkins + gitlab 持续集成和持续部署的学习笔记
1. Jenkins 介绍 软件开发生命周期(SLDC, Software Development Life Cycle):它集合了计划、开发、测试、部署的集合。 软件开发瀑布模型 软件的敏捷开发 1.1 持续集成 持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。 持续集成的流…...
R语言【cli】——通过cli_abort用 cli 格式的内容显示错误、警告或信息,内部调用cli_bullets和inline-makeup
cli_abort(message,...,call .envir,.envir parent.frame(),.frame .envir ) 先从那些不需要下大力气理解的参数入手: 参数【.envir】:进行万能表达式编译的环境。 参数【.frame】:抛出上下文。默认用于参数【.trace_bottom】ÿ…...
cka从入门到放弃
无数次想放弃,最后选择了坚持 监控pod日志 监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将 写入到 /opt/KUTR00101/foobar # 解析 监控pod的日志,使用kubectl logs pod-name kubectl logs…...
通过 jekyll 构建 github pages 博客实战笔记
jekyll 搭建教程 jekyll 搭建教程 Gem 安装 Ruby,请访问 下载地址。 Jekyll Jekyll 是一个简单且具备博客特性的静态网站生成器。 Jekyll 中文文档 极客学院中文文档 使用以下命令安装 Jekyll。 $ gem install jekyll在中国可能需要使用代理软件。然后ÿ…...
【AI美图】第09期效果图,AI人工智能汽车+摩托车系列图集
期待中的未来AI汽车 欢迎来到未来的世界,一个充满创新和无限可能的世界,这里有你从未见过的科技奇迹——AI汽车。 想象一下,你站在十字路口,繁忙的交通信号灯在你的视线中闪烁,汽车如潮水般涌来,但是&…...
网线的制作集线器交换机路由器的配置--含思维导图
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 一、网线的制作 1、网线的材料有哪些? 网线 网线是一种用于传输数据信号的电缆,广泛应…...
LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理
Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)前列。多个基准测试表明,就性能而言,它正在接近GPT-3.5…...
柔性数组(结构体成员)
目录 前言: 柔性数组: 给柔性数组分配空间: 调整柔性数组大小: 柔性数组的好处: 前言: 柔性数组?可能你从未听说,但是确实有这个概念。听名字,好像就是柔软的数…...
C#合并多个Word文档(微软官方免费openxml接口)
g /// <summary>/// 合并多个word文档(合并到第一文件)/// </summary>/// <param name"as_word_paths">word文档完整路径</param>/// <param name"breakNewPage">true(默认值),合并下一个…...
MySQL 5.7依赖的软件包和下载地址
yum install ncurses-devel openssl openssl-devel gcc gcc-c ncurses ncurses-devel bison make -y mysql下载地址 下载地址...
图论 | 网络流的基本概念
文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络: G ( V , E ) G (V, E) G(V,E) 有向图,不考虑反向边s:源点t:汇点 c ( u , v ) c(u, v) c(u,v)ÿ…...
【音视频 | AAC】AAC音频编码详解
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
redis基本用法学习(C#调用NRedisStack操作redis)
redis官网文档中推荐C#中使用NRedisStack包连接并操作redis,本文学习C#调用NRedisStack操作redis的基本方式。 新建Winform项目,在Nuget包管理器中搜索并安装NRedisStack包,如下图所示: 主要调用StackExchange.Redis命名空间下…...
[CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
文章目录 前言小结 原文地址:https://blog.csdn.net/qq_45752541/article/details/132854115 前言 mesh 和点是最常见的3D场景表示,因为它们是显式的,非常适合于快速的基于GPU/CUDA的栅格化。相比之下,最近的神经辐射场…...
【SpringBoot快速入门】(4)SpringBoot项目案例代码示例
目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven,详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例,上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动,从这一节开…...
Linux服务器 部署飞书信息发送服务
项目介绍: 飞书信息发送服务是指将飞书信息发送服务部署到一个Linux服务器上。飞书是一款企业级的即时通讯和协作工具,支持发送消息给飞书的功能。通过部署飞书信息发送服务,可以方便内网发送信息给外网飞书。 项目代码结构展示: …...
用C#也能做机器学习?
前言✨ 说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合专门学习机器学习&a…...
Python PDF格式转PPT格式
要将PDF文件转换为PPT,我实在python3.9 环境下转成功的,python3.11不行。 需要 pip install PyMuPDF代码说话 # -*- coding: utf-8 -*-""" author: 赫凯 software: PyCharm file: xxx.py time: 2023/12/21 11:20 """im…...
搭建知识付费平台?明理信息科技为你提供全程解决方案
明理信息科技saas知识付费平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和维护…...
漫谈UNIX、Linux、UNIX-Like
漫谈UNIX、Linux、UNIX-Like 使用了这么多年Redhat、Ubuntu等Linux、Windows、Solaris操作系统,你是否对UNIX、Unix-Like(类UNIX)还是不太清楚?我以前一直认为Unix-Like就等于Linux。其实,由UNIX派生出来而没有取得UN…...
Netty Review - Netty与Protostuff:打造高效的网络通信
文章目录 概念PrePomServer & ClientProtostuffUtil 解读测试小结 概念 Pre 每日一博 - Protobuf vs. Protostuff:性能、易用性和适用场景分析 Pom <dependency><groupId>com.dyuproject.protostuff</groupId><artifactId>protostuff-…...
在ClickHouse数据库中启用预测功能
在这篇博文中,我们将介绍如何将机器学习支持的预测功能与 ClickHouse 数据库集成。ClickHouse 是一个快速、开源、面向列的 SQL 数据库,对于数据分析和实时分析非常有用。该项目由 ClickHouse, Inc. 维护和支持。我们将探索它在需要数据准备以…...
目标检测YOLO实战应用案例100讲-树上果实识别与跟踪计数(续)
目录 3.2 损失函数优化 3.3 实验过程 3.3.1 果实图像采集 3.3.2 数据扩增...
Docker 文件和卷 权限拒绝
一 创作背景 再复制Docker影像文件或访问Docker容器内已安装卷上的文件时我们常常会遇到:“权限被拒绝”的错误,在此,您将了解到为什么会出现“权限被拒绝”的错误以及如何解决这个问题。 二 目的 在深入探讨 Docker 容器中的 Permission De…...
建设部一体化监管平台网站首页/网络营销师培训费用是多少
原文地址:http://www.zhangxinxu.com/wordpress/?p739 一、哗啦哗啦的简介 zxx://这里“哗啦哗啦”的作用是为了渲染一种氛围。content属性早在CSS2.1的时候就被引入了,可以使用:before以及:after伪元素生成内容。此特性目前已被大部分的浏览器支持&…...
网页前端开发技术/网站是怎么优化推广的
18年国庆,栈长分享了一次我的真实相亲经历:《一个程序员的国庆血泪相亲史,惨败而归…》,大家反响爆蓬。有的现在还在后台留言鼓励我,或者问我有没有找到女朋友之类的,不用担心这事啦,那都是陈年…...
电子商务网站建设合同标准范文/百度关键词工具在哪里
📖摘要 今天分享下 —— SpringBoot 中必须掌握的45个注解,欢迎关注! 🌂SpringBoot/Spring SpringBootApplication: 包含 Configuration、EnableAutoConfiguration、ComponentScan 通常用在主类上; Repository: 用于标…...
建设产品网站/怎样在百度上发帖子
前缀是标记到CSS属性开头的特定于供应商的名称。 例如,您需要以下代码将元素旋转10: -moz-transform: rotate(10deg); /* Firefox 3.5 */ -o-transform: rotate(10deg); /* Opera 10.5 */ -webkit-transform: rotate(10deg); /* Chrome and Safari3.1 …...
单机网页游戏网站/可以免费发帖的网站
数据统计,截至3月21日,电力板块已有16家上市公司发布了2016年年报,业绩两极分化趋势明显。其中,梅雁吉祥、银星能源等水电、新能源发电公司业绩翻倍,深圳能源、大唐发电等火电公司净利润下滑明显。 水电新能源发电表现…...
河南省住房和城乡建设部网站首页/双11各大电商平台销售数据
前言 因为之前电脑安装了office2019,后面需要安装Visio,下载安装时报错30204-44,查看发现之前安装的office版本是即点即用版,可能这两者不兼容。网上搜索教程等,最后发现一个工具:Office Tool Plus,可以方便…...