使用youtube的api

如何使用youtube的data api

https://console.cloud.google.com/apis/dashboard 到这个地方先启用api,找到YouTube Data API v3 这个api,启用它

然后创建凭据

去创建凭据,里面创建相应的客户端,web的需要填写redirect地址,就是回调用的.客户端不需要这个.

创建客户端不需要详细地说了,进入填写包名,这里以android为例,填写上最后打包的签名的key的sha1值就可以了,下面都提示如何拿到这个值.成功后就有了一个key

上图里面的api密钥,这个是用于访问youtube时用到的.没有就申请一个.

没有发布应用,所以我在oauth权限请求页面,添加上测试用户的邮箱.

账户申请就这些差不多了,网上有很多相关的文章.这步不会有什么错.

申请oauth时要注意什么

要注意的是包名不要有下划线这些字符,普通的字母与.号,我遇到过有下划线的,认证失败了.

web与客户端是不能通用的,有人说用web的key成功认证,这显然是不合理的.因为他用的是postman,或浏览器测试.

认证时,有哪些途径.

谷歌,自称有signin相关的按钮,直接接入.然后我就试了一下.

比如常见的代码:

GetSignInIntentRequest request =
//                GetSignInIntentRequest.builder()
//                        .setServerClientId(cliendId)
//                        .build();
//
//        Identity.getSignInClient(OauthActivity.this)
//                .getSignInIntent(request)
//                .addOnSuccessListener(
//                        result -> {
//                            try {
//                                startIntentSenderForResult(
//                                        result.getIntentSender(),
//                                        REQUEST_CODE_GOOGLE_SIGN_IN,
//                                        /* fillInIntent= */ null,
//                                        /* flagsMask= */ 0,
//                                        /* flagsValue= */ 0,
//                                        /* extraFlags= */ 0,
//                                        /* options= */ null);
//                            } catch (IntentSender.SendIntentException e) {
//                                Log.e("TAG", "Google Sign-in failed");
//                            }
//                        })
//                .addOnFailureListener(
//                        e -> {Log.e("TAG", "Google Sign-in failed", e);});

或者

signInRequest = BeginSignInRequest.builder()
//                .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
//                        .setSupported(true)
//                        .build())
//                .setGoogleIdTokenRequestOptions(BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
//                        .setSupported(true)
//                        // Your server's client ID, not your Android client ID.
//                        .setServerClientId(cliendId)
//                        .setFilterByAuthorizedAccounts(true)
//                        .build())
//                // Automatically sign in when exactly one credential is retrieved.
//                .setAutoSelectEnabled(true)
//                .build();*/

注释去了.

其实这些都是依赖于play service的.

当然依赖要配上

implementation('com.google.apis:google-api-services-youtube:v3-rev20200618-1.30.9') {exclude group: 'org.apache.httpcomponents'}implementation 'com.google.http-client:google-http-client-android:1.37.0'implementation('com.google.api-client:google-api-client-android:2.2.0') {exclude group: 'org.apache.httpcomponents'}implementation 'com.google.api-client:google-api-client-gson:1.30.11'implementation 'com.google.android.gms:play-services-auth:20.7.0'

最后会发现,这些是无效的,有些api在target<30以下还可以调用,但多数情况在target>=30已经不行了,现在谷歌的市场是要求33,所以这些都不行,没有测试过,目标机器上的Play service升级到最高版本会如何,但你无法要求客户去升级的.所以这些办法放弃.

另外,有些人会提到代码,判断服务是否正常.或返回10,或1250这些

private boolean isGooglePlayServicesAvailable() {
//        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
//        final int connectionStatusCode = apiAvailability.isGooglePlayServicesAvailable(this);
//        return connectionStatusCode == ConnectionResult.SUCCESS;
//    }
//
//    private void acquireGooglePlayServices() {
//        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
//        final int connectionStatusCode = apiAvailability.isGooglePlayServicesAvailable(this);
//        if (apiAvailability.isUserResolvableError(connectionStatusCode)) {
//            showGooglePlayServicesAvailabilityErrorDialog(connectionStatusCode);
//        }
//    }
private void getResultsFromApi() {
//        if (!isGooglePlayServicesAvailable()) {
//            acquireGooglePlayServices();
//        } else if (mCredential.getSelectedAccountName() == null) {
//            chooseAccount();
//        } else if (!isDeviceOnline()) {
//            mOutputText.setText("No network connection available.");
//        } else {
//            new MakeRequestTask().execute();
//        }
//    }

这种相关的代码是从系统的登录账户中选一个.没有就登录一个,也是受限于play service的api的.至少我是没有成功,如果target=29,是可以用.但高了不行.

认证遇到的问题与解决方案

谷歌在官方的文档里面提到oauth认证的方案.开始感觉到惊喜,以前做新浪微博的时候,也是oauth2认证,结果,文档里面写到,webview已经不支持这种方式了,url拼完,它也不给你加载.

文档提到了使用app-auth库,这个库认证能成功,但有不好的体验,一个是加载浏览器慢,另一个,由于接口是先调用google的,所以国内测试比较慢,时不时还连不上.不知道在国外会不会好些.

认证过程:https://approov.io/blog/adding-oauth2-to-mobile-android-and-ios-clients-using-the-appauth-sdk 这个库,可以下载到源码.

认证步骤与ui展示,如果自己觉得不好看可以修改

最重要的就剩下配置文件了.

{"client_id": "17240232499-.apps.googleusercontent.com","redirect_uri": "com.arch.youtube.demo:/oauth2redirect","end_session_redirect_uri": "com.arch.youtube.demo:/oauth2redirect","authorization_scope": "openid email profile https://www.googleapis.com/auth/youtube https://www.googleapis.com/auth/youtube.force-ssl","discovery_uri": "https://accounts.google.com/.well-known/openid-configuration","authorization_endpoint_uri": "https://accounts.google.com/o/oauth2/auth","token_endpoint_uri": "https://oauth2.googleapis.com/token","registration_endpoint_uri": "https://www.googleapis.com/oauth2/v3/userinfo","user_info_endpoint_uri": "","https_required": true
}

scope要填写上youtube 上要用的.

redirect_uri这个要注意的是包名加上后面的部分,后面是随意的.从app-auth里面可以看到,它配置了这个东西,用于在网页认证成功后接收的:
<activityandroid:name=".RedirectUriReceiverActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="${appAuthRedirectScheme}" /></intent-filter></activity>

所以要在build.gradle:android{}里面加上

manifestPlaceholders = ['appAuthRedirectScheme': 'com.arch.youtube.demo'
]
discovery_uri这是要配置的,有它,可以不用user_info_endpoint_uri,国内就是访问这个地址比较慢.
client_id填写上面申请的oauth的客户端id就可以了.

配置文件的核心点在于,先访问discovery_uri,然后剩下的逻辑是它读取配置文件,然后拼接一下认证的地址,然后打开浏览器去认证,在手机上会打开外部浏览器去加载.

https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=com.arch.youtube.demo:/oauth2redirect&client_id=17240232499-.apps.googleusercontent.com&response_type=code&state=G2DGez5QTA4qhc9Ik_80Dw&nonce=77sOq_FlX2qLQJTkjUVgTg&scope=openid email profile&code_challenge=wOTi0Ysfs8rr4kAf5s5mJOo97AOWC2eBv-kKaXsy8VY&code_challenge_method=S256

我抓取它最后访问的结果大概是这样的.

关于youtube的api,调用的方式就简单了,上面的gradle依赖加上,就可以直接用了

HttpTransport transport = AndroidHttp.newCompatibleTransport();JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();instance.mYoutube = new YouTube.Builder(transport, jsonFactory, credential).setApplicationName(context.getResources().getString(R.string.app_name)).build();

这样就完成了api的初始化,如果没有账户信息,那么搜索这些是不可用的

YouTube.Search.List search = YoutubeApiHolder.instance.mYoutube.search().list(Collections.singletonList("id,snippet"));search.setQ(searchText).setKey(ApiConfig.YOUTUBE_API_KEY).setType(Collections.singletonList(mTypeOptions)).setOrder(mSortingOptions).setVideoDuration(mDurationOptions).setVideoDefinition(mFeatureOptions).setPageToken(nextPageToken).setFields("nextPageToken,items(id,snippet(channelId,title,description,thumbnails/default))").setMaxResults(15L);SearchListResponse searchResponse = search.execute();nextPageToken = searchResponse.getNextPageToken();emitter.onNext(searchResponse);

密钥在调用的时候设置上就可以了.是上面的api密钥,不是oauth密钥.

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

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

相关文章

一文读懂Allins-首个基于 AMM 的多链铭文资产交易协议

“Allins 是铭文赛道中基础设施类的代表&#xff0c;该协议致力于以 AMM 的方式推动铭文资产的流动性&#xff0c;并为铭文资产交易者提供更好的 UI/UX。” 2023年1月份后&#xff0c;比特币Ordinals协议的推出为铭文赛道的兴起奠定了基础。该协议以聪为单位将比特币划分&#…

ipa分发平台绑定域名有什么优势

大家好我是咕噜签名分发可爱多。今天跟大家分享一下&#xff0c;为什么建议大家将自己的域名绑定到分发平台&#xff08;比如咕噜分发&#xff09;。 将自己的域名绑定分发平台有几个原因和优势&#xff1a; 1. 专业性和品牌建设&#xff1a; 使用自己的域名可以让您的在线存…

消息队列有哪些应用场景?

分布式系统不同模块之间的通信&#xff0c;除了远程服务调用以外&#xff0c;消息中间件是另外一个重要的手段&#xff0c;在各种互联网系统设计中&#xff0c;消息队列有着广泛的应用。从本文开始&#xff0c;专栏进入分布式消息的模块&#xff0c;将讨论消息队列使用中的高频…

Windows如何安装使用TortoiseSVN客户端并实现公网访问本地SVN Server

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

三防平板电脑定制参数_三防移动平板终端方案

这是一款搭载了低功耗高性能CPU的三防平板电脑。采用联发科MT6771处理器&#xff0c;内置4GB64GB内存和八核处理器&#xff0c;提供出色的性能和运行速度。同时&#xff0c;它运行着最新的安卓Android 11.0系统&#xff0c;全屏支持和屏幕内容显示的优化使其更加方便和简单易用…

【华大】HC32F420JATB-LQ48学习资料及开发环境

1. 产品特点 ⚫ 84MHz Cortex-M4 32位CPU平台 ⚫ 128K 字节 FLASH 存储器&#xff0c;具有擦写保护功能 ⚫ 24K 字节 RAM 存储器 ⚫ 6 通道 DMAC ⚫多达 52 个通用 I/O 管脚 ⚫ 时钟、晶振 ‒ 外部高速晶振 8MHz~32MHz ‒ 内部高速时钟 22MHz~24MHz ‒ 内部低速时钟 3…

GoWin FPGA, GPIO--- startup1

一个Bank只能用一个电压&#xff0c;假如同一个Bank&#xff0c;在引脚里设置不同的电压&#xff0c;编译不过。 解释说明 2. 错误引脚限制 以上编译设置会导致编译错误。 Floor planner说明

猫粮哪个牌子好又安全?安全的主食冻干猫粮牌子推荐

由于猫咪是肉食动物&#xff0c;对蛋白质的需求很高&#xff0c;如果摄入的蛋白质不足&#xff0c;就会影响猫咪的成长。而冻干猫粮本身因为制作工艺的原因&#xff0c;能保留原有的营养成分和营养元素&#xff0c;所以冻干猫粮蛋白含量比较高&#xff0c;营养又高&#xff0c;…

智能仓储革命:科聪料箱机器人助力高效物流转型

料箱机器人即料箱AGV是一种智能化物流搬运设备&#xff0c;它可以代替人力完成出库入库和搬运工作&#xff0c;可根据出入库生产出货需求&#xff0c;将货物从起点运送到终点&#xff0c;自动柔性完成货到人货到点的操作。 提升仓储和物流效率的自动化利器 料箱机器人的投用能…

使用ArcMap10.8修改tif影像的地理坐标系

最近有个tif数据转坐标系给我整岔了&#xff0c;用了定义投影的方法&#xff0c;坐标系是有了&#xff0c;可是范围区域数值没有改变&#xff0c;导致转出来的数据没法用&#xff0c;后面成功了&#xff0c;记一下方法便于今后查找。 如下是我在arcmap中打开的tif影像坐标系&a…

各级行政区划shp文件,34个省份可下载,来源可靠

基本信息. 数据名称: 行政区划 数据格式: Shp文件 数据时间: 2021年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据、国务院发布的行政区划调整批复公告 数据可视化. 全国行政区划 广东省行政区划 深圳市行政区划 城市清单. 可下载数…

Swift爬虫采集唯品会商品详情

我有个朋友之前在唯品会开的店&#xff0c;现在想转战其他平台&#xff0c;想要店铺信息商品信息全部迁移过去&#xff0c;如果想要人工手动操作就有点麻烦了&#xff0c;然后有天找到我 &#xff0c;让我看看能不能通过技术手段实现商品信息迁移。嫌来无事&#xff0c;写了下面…

Linux 进程信号

文章目录 信号的概览信号的产生信号的处理信号集操作信号的捕捉补充与说明 信号的概览 信号由软件或硬件产生发送给进程&#xff0c;进程对其做相应处理。信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 Linux下的全部信号由指令kill -l查询 Linux 下指令的…

H264码流打包分析

H264码流打包分析 SODB 数据比特串&#xff0d;&#xff0d;&#xff1e;最原始的编码数据 RBSP 原始字节序列载荷&#xff0d;&#xff0d;&#xff1e;在SODB的后面填加了结尾比特&#xff08;RBSP trailing bits 一个bit“1”&#xff09;若干比特“0”,以便字节对齐。…

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…

创投课程第五期 | 超越比特币:探索BTC生态的无限可能

协会邀请了来自水滴资本&#xff08;Waterdrip Capital&#xff09;的投资总监——Elaine&#xff0c;作为VC创投课程第5期的嘉宾&#xff0c;在北京时间12月17日(周日)晚上21:00 PM-22:00 PM&#xff0c;届时将与所有对Web3投资、创业心怀热忱的朋友们共同探讨《超越比特币&am…

C语言 文件I/O(备查)

所有案列 跳转到其他。 文件打开 FILE* fopen(const char *filename, const char *mode); 参数&#xff1a;filename&#xff1a;指定要打开的文件名&#xff0c;需要加上路径&#xff08;相对、绝对路径&#xff09;mode&#xff1a;指定文件的打开模式 返回值&#xff1a;成…

模型评估:压力测试 模拟对手 对齐 智能对抗 CAPTCHA(全自动区分计算机和人类的公共图灵测试)

对齐&#xff0c;智能对抗&#xff1a;魔高一尺&#xff0c;道高一丈。用更高的智能去对抗恶意使用。openAI一半的内容都在讲这个&#xff0c;但没有讲具体的方法。 如果认为对方是一个人就通过了图灵测试&#xff0c;真正的实现了智能。 如果智能达到了这种程度&#xff0c;智…

Tapdata 亮相 2023 谷歌出海创业加速器展示日活动,实时数据点亮企业创新之路

12 月 6 日&#xff0c;经过 2023 谷歌出海创业加速器对入营企业为期 3 个月的辅导及培训&#xff0c; 其毕业典礼及展示日活动在北京举行。 经历三个月的沉淀&#xff0c;来自不同行业&#xff0c;包含 Tapdata 在内的 10 家入营企业集中亮相&#xff0c;相互分享各自产品的创…

XUbuntu22.04之npm解决pm WARN deprecated(一百九十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…