PHP Youtube API v3 - 直接上传 - 未经授权的消息

2024-01-09

我正在尝试使用 API v3 将视频直接上传到 Youtube。

我在用着服务帐户设想 (),并且我解决了 google-api-php-client 库中的一些问题(读取 p12 文件并避免 isAccessTokenExpired 始终返回 false)。

<?php
/** Config */ 
$private_key_password = 'notasecret';
$private_key_file = 'xxxxxxxx-privatekey.p12';
$applicationName = 'xxxxx-youtube';
$client_secret = 'CLIENT_SECRET';
$client_id = 'xxxxxxxxxxxxx.apps.googleusercontent.com';
$service_mail = '[email protected] /cdn-cgi/l/email-protection';
$public_key = 'xxxxxxxxxxx';

/** Constants */ 
$scope = 'https://www.googleapis.com/auth/youtube';
$url_youtube_token = 'https://accounts.google.com/o/oauth2/token';

/** Create and sign JWT */ 
$jwt = new Google_AssertionCredentials($service_mail, $scope, $private_key_file, $private_key_password, $url_youtube_token);
$jwt_assertion = $jwt->generateAssertion();

/** Use JWT to request token */
$data = array(
    'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
    'assertion' => $jwt_assertion,
);

// use key 'http' even if you send the request to https://...
$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => http_build_query($data),
    ),
);

$context = stream_context_create($options);
$result = file_get_contents($url_youtube_token, false, $context);

此时,我已经在 json 响应中获得了访问令牌,如下所示:

{
  "access_token" : "1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M",
  "token_type" : "Bearer",
  "expires_in" : 3600
}

没有“created”、“refresh_token”和“id_token”字段。所以我修复了设置访问令牌方法在谷歌_OAuth2如果未设置,则将“创建”字段设置为 time() 。否则isAccessToken已过期总是返回 false。

现在,让我们上传文件。

    try{
        // Client init 
        $client = new Google_Client();
        $client->setClientId($client_id);
        $client->setClientSecret($client_secret);
        $client->setApplicationName($applicationName);

        $client->setAccessToken($result);

        if ($client->getAccessToken()) {

            if($client->isAccessTokenExpired()) {
                // @TODO Log error 
                echo 'Access Token Expired!!<br/>'; // Debug
            }

            $youtube = new Google_YoutubeService($client);

            $videoPath = "./test.mp4";

            // Create a snipet with title, description, tags and category id
            $snippet = new Google_VideoSnippet();
            $snippet->setTitle("fmgonzalez test " . time());
            $snippet->setDescription("fmgonzalez test " . time() );
            $snippet->setTags(array("tag1", "tag2"));

            // Numeric video category. See
            // https://developers.google.com/youtube/v3/docs/videoCategories/list
            $snippet->setCategoryId("22");

            // Create a video status with privacy status. Options are "public", "private" and "unlisted".
            $status = new Google_VideoStatus();
            $status->privacyStatus = "public";

            // Create a YouTube video with snippet and status
            $video = new Google_Video();
            $video->setSnippet($snippet);
            $video->setStatus($status);

            // Size of each chunk of data in bytes. Setting it higher leads faster upload (less chunks,
            // for reliable connections). Setting it lower leads better recovery (fine-grained chunks)
            $chunkSizeBytes = 1 * 1024 * 1024;

            // Create a MediaFileUpload with resumable uploads
            $media = new Google_MediaFileUpload('video/*', null, true, $chunkSizeBytes);
            $media->setFileSize(filesize($videoPath));

            // Create a video insert request
            $insertResponse = $youtube->videos->insert("status,snippet", $video,
                array('mediaUpload' => $media));

            $uploadStatus = false;

            // Read file and upload chunk by chunk
            $handle = fopen($videoPath, "rb");
            $cont = 1;
            while (!$uploadStatus && !feof($handle)) {
                $chunk = fread($handle, $chunkSizeBytes);
                $uploadStatus = $media->nextChunk($insertResponse, $chunk);
                echo 'Chunk ' . $cont . ' uploaded <br/>';
                $cont++;
            }

            fclose($handle);

            echo '<br/>OK<br/>';

        }else{
            // @TODO Log error 
            echo 'Problems creating the client';
        }

    } catch(Google_ServiceException $e) {
        print "Caught Google service Exception ".$e->getCode(). " message is ".$e->getMessage(). " <br>";
        print "Stack trace is ".$e->getTraceAsString();
    }catch (Exception $e) {
        echo $e->getMessage();
    }

但我收到一个“启动断点续传失败”信息。

调试、方法获取简历Uri in 谷歌媒体文件上传我有这个响应正文:

"error": {
    "errors": [
    {
        "domain": "youtube.header",
        "reason": "youtubeSignupRequired",
        "message": "Unauthorized",
        "locationType": "header",
        "location": "Authorization"
    }
    ],
    "code": 401,
    "message": "Unauthorized"
}

我找到了有关其他场景的示例,但没有找到有关此场景的示例。

我应该怎么做才能最终上传视频文件?有关于这种情况的例子吗?

提前致谢。


这可能看起来微不足道,但您是否在要将视频上传到的帐户中至少创建了一个频道。我对 acceess_token 使用了与您几乎相同的解决方法,然后遇到了同样的问题,直到我进入我的 Youtube 帐户上传部分并看到消息在上传视频之前创建至少一个频道。希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP Youtube API v3 - 直接上传 - 未经授权的消息 的相关文章

  • 如何使用 PHP 正确添加跨站请求伪造 (CSRF) 令牌

    我正在尝试为我网站上的表单添加一些安全性 其中一个表单使用 AJAX 另一个表单是简单的 联系我们 表单 我正在尝试添加 CSRF 令牌 我遇到的问题是令牌有时只显示在 HTML 值 中 其余时间 该值为空 这是我在 AJAX 表单上使用的
  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph
  • 当数据验证失败时保留表单字段中的值

    我在弄清楚验证失败时如何保留用户数据时遇到问题 我对 PHP 有点陌生 所以我的逻辑可能会犯一些巨大的错误 目前 如果验证失败 所有字段都会被清除 并且 Post 数据也会消失 这是一些代码 假设用户输入无效电子邮件 我希望保留 名称 字段
  • 单词之间没有空格的语言(例如亚洲语言)中的断词?

    我想让 MySQL 全文搜索适用于日语和中文文本以及任何其他语言 问题在于这些语言以及可能其他语言通常在单词之间没有空格 当您必须键入与文本中相同的句子时 搜索没有用 我不能只在每个字符之间添加空格 因为英语也必须有效 我想用 PHP 或
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • 扩展蓝图类?

    我想覆盖timestamps 函数中发现Blueprint班级 我怎样才能做到这一点 e g public function up Schema create users function Blueprint table table gt
  • 是否可以使用 PHP 重定向发送 POST 数据?

    更新 这不是重复的如何使用 PHP 发送 POST 请求 https stackoverflow com questions 5647461 how do i send a post request with php 那里的解决方案对我不起
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • PHP preg_filter 返回意外的长值

    尝试在 Woocommerce 中删除标签并过滤值 但无法以正确的格式获取它 有东西有腥味 我正在使用WC gt cart gt get cart subtotal 来检索该值 在此示例中 我的值是 2 429kr 原始返回值是 span
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 如果循环中内存超出,我可以在 for 循环中抛出异常吗?

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何处理 foreach 循环中发生
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 对具有混合类型值的数组进行数字排序

    我有一个像这样的混合数组 fruits array lemon Lemon 20 banana apple 121 40 50 然后申请sort 其功能如下 sort fruits SORT NUMERIC foreach fruits a

随机推荐

  • 仅使用一次计时器

    我只想在主窗体初始化后 1 秒使用计时器一次 我以为下面会有一个消息框只显示一次 Hello World 但实际上每秒都会有一个新消息框显示 Hello World 为什么这样 我已经把t Stop 在勾选事件中 另外 我是否需要以某种方式
  • 任务并行库 - 如何立即返回但有一个并行步骤

    我有以下工作流程 需要以非阻塞并行处理方式进行 我想要方法DoStuff 立即返回 所以我正在使用任务并行库 DoStuff Do some setup Parse an Excel file then for each row Fill
  • 随后启动两个 WebClient.UploadStringAsync 调用

    当调用 WebClient UploadStringAsync 两次 而不等待 WebClient UploadStringCompleted 事件时 将引发以下异常 WebClient 不支持并发 I O 操作 显然 这是不支持的 想要启
  • Silverlight 4 BitmapImage - bmp 文件支持

    MSDN 提到了对 PNG 和 JPG 的支持 但许多人正在尝试 setSource file bmp 并抱怨 灾难性失败 有人可以澄清一下 是否支持 bmp 吗 如果没有 在 silverlight 中显示 bmp 的最佳方式是什么 Si
  • 如何在javatechig示例中添加Recycler项目SetOnClickListener

    我正在尝试添加onclick监听器为了这RecyclerView但我尝试了一切 但它不起作用 饲料项目 public class FeedItem private String title private String thumbnail
  • Chrome 中的 Mailto 链接会打开新选项卡

    您好 我的页面上有一个 mailto 链接 该链接在其他浏览器中运行良好 在 Chrome 中 它会打开一个新选项卡 其中 URL 为 mailto 链接 有什么办法可以抑制Web开发人员的行为吗 从我读到的内容来看 这似乎是 chrome
  • 在两个单独的 Angular 应用程序之间进行更改时,AngularJS e2e 测试会挂起

    我有一个令人沮丧的问题 我想为复杂的角度应用程序编写端到端测试 问题是登录屏幕是一个单独的应用程序 最初的想法是 它将根据登录凭据进行分支 以分离我们生态系统中的其他角度应用程序 它就像一个魅力 对于测试来说 这是一场噩梦 测试按预期工作
  • Visual Studio 2015 - ASP.Net 应用程序只有重新启动 Visual Studio 后才会启动

    有时 当我尝试启动 ASP Net 应用程序 调试 时 应用程序将无法启动 Visual Studio 看起来应用程序正在运行 状态栏的颜色变为橙色 浏览器打开并 永远 加载 IIS Express 正在运行 并且该站点显示在 IIS 尝试
  • django 使用动态列名称进行注释

    我在 django 应用程序中有一个模型 其结构如下 class items models Model name models CharField max length 50 location models CharField max le
  • 如何在不使用 10 次方表示的情况下将双精度数转换为字符串 (E-05)

    如何在不使用 10 次方表示的情况下将双精度数转换为字符串 E 05 double value 0 000099999999833333343 string text value ToString Console WriteLine tex
  • 为什么在 for 循环中检查 HashMap 是否具有特定值需要很长时间才能执行?

    我正在研究 Double DES 上的中间相遇攻击 我已经实现了 DES 加密 解密并完成了加密 现在我想对 Double DES 执行 MITM 攻击以找到密钥 我尝试实现此目的的方法是在 for 循环中将中间密码存储为 HashMap
  • 正则表达式停止搜索特定字符串

    我试图在重复的特定模式之后获取任何字符 但我需要在特定字符串处停止搜索 例如 anything anything anything pattern string anything anything anything pattern anot
  • 从 Swift 中的字符串中删除“\”(反斜杠)

    我有以下代码 let refreshedToken FIRInstanceID instanceID token var encriptat3 String ope sql para UPDATE xw usuarios SET IDFIR
  • 删除特殊字符VBA Excel

    我正在使用 VBA 阅读一些标题 然后将该信息复制到 PowerPoint 演示文稿中 问题是标题有特殊字符 但我正在处理的图像文件没有特殊字符 例如 标题构成将 JPEG 加载到图片容器的路径的一部分P k jpg 但标题叫p k 我希望
  • DirectLineJS 接收机器人回复的副本

    我使用 DirectLineJS 通过网站进行自定义网络聊天进行通信 我使用的是 Microsoft github 发布的格式https github com Microsoft BotFramework DirectLineJS http
  • 如何保护已编译的Java类?

    我知道 这里已经提出了很多类似的问题 我不是在问我是否可以保护我编译的 Java 类 因为显然你会说 不 你不能 我问保护 Java 类免遭反编译的最著名方法是什么 如果您知道该领域的任何研究或学术论文 请告诉我 另外如果您使用过一些方法或
  • 停止 perl 重载或打印引用的内存“地址”

    我创建了一个类 它重载了 运算符打印出用户可读的对象的良好字符串化形式 但现在 我想实际获取内存地址 例如 Some class HASH 0xb0aff98 这就是我通常会使用的方法print some object 如果我还没有覆盖 操
  • 更新时链接数据实体的完整性

    在更新时维护链接数据实体完整性的最佳实践是什么 我的场景 我有两个实体 客户和 发票 客户是定义和 发票即交易 向公司开具多张发票后 客户碰巧客户 信息需要更改 例如 他的帐单地址 位置 更改或公司名称 等 用户必须是正常的 可以更新客户端
  • 工作完成后不会发出 QThread.finished 信号

    我有以下代码 import time from PyQt5 QtCore import QThread QObject from PyQt5 QtWidgets import QWidget QApplication class Worke
  • PHP Youtube API v3 - 直接上传 - 未经授权的消息

    我正在尝试使用 API v3 将视频直接上传到 Youtube 我在用着服务帐户设想 并且我解决了 google api php client 库中的一些问题 读取 p12 文件并避免 isAccessTokenExpired 始终返回 f