如何直接从我的服务器将视频上传到 Youtube?

2023-12-22

我正在设置一个(无头)网络服务器,让人们可以制作自己的自定义延时电影。

有几个人想将他们制作的延时视频上传到 YouTube。 与其将视频下载到该人的笔记本电脑上, 然后该人手动将其上传到 YouTube, 有没有一种方法可以在我的网络服务器上编写一些软件,以将该视频文件保存到我的网络服务器上并将其直接上传到该用户在 YouTube 上的帐户?

有人告诉我,询问用户的 YouTube 用户名和密码是错误的做法,我应该将 YouTube V3 API 与 Oauth 结合使用。

我尝试了列出的技术 ”我想使用 javascript youtube API 将视频从我的网页上传到 youtube https://stackoverflow.com/questions/14683240/i-want-to-upload-a-video-from-my-web-page-to-youtube-by-using-javascript-youtube“, 这似乎“有效”,但每次我都必须将视频下载到该人的笔记本电脑上,然后从笔记本电脑上传到 YouTube。有没有办法调整该系统以直接从我的服务器上传到 YouTube?

我发现一些 python 代码(在我设置 client_secrets.json 之后)可以让我直接将视频从我的服务器上传到某人的 YouTube 帐户after该人进行了 Oauth 身份验证。 但是,当某个新人第一次尝试将视频上传到我的服务器以前从未处理过的某个新 YouTube 帐户时,它要么 (a) 在我的服务器上弹出一个 Web 浏览器,然后如果我通过 VNC 连接到服务器并在该 Web 浏览器中输入 YouTube 句柄和密码,它就会获得身份验证 - 但我不想对每个用户都这样做。 (b) 使用“--noauth_local_webserver”选项,在命令行上输出 URL 并等待。然后,如果我手动复制该 URL 并将其粘贴到 Web 浏览器中,登录 YouTube,将令牌复制并粘贴回仍在等待命令行输入的应用程序中,则该人将获得身份验证。但我不想为每个用户都这样做。我想如果我可以在我的 cgi-bin 脚本中捕获该 URL 并将其粘贴到网页中,然后以某种方式获取身份验证响应并将其塞回到该程序中,那就可以了,但是如何呢?我什至没有在这段代码中看到 print 语句或 raw_input 语句。

#!/usr/bin/python
#   https://developers.google.com/youtube/v3/code_samples/python#upload_a_video
# which is identical to the code sample at
#   https://developers.google.com/youtube/v3/docs/videos/insert

import httplib
import httplib2
import os
import random
import sys
import time

from apiclient.discovery import build
from apiclient.errors import HttpError
from apiclient.http import MediaFileUpload
from oauth2client.client import flow_from_clientsecrets
from oauth2client.file import Storage
from oauth2client.tools import argparser, run_flow


# Explicitly tell the underlying HTTP transport library not to retry, since
# we are handling retry logic ourselves.
httplib2.RETRIES = 1

# Maximum number of times to retry before giving up.
MAX_RETRIES = 10

# Always retry when these exceptions are raised.
RETRIABLE_EXCEPTIONS = (httplib2.HttpLib2Error, IOError, httplib.NotConnected,
  httplib.IncompleteRead, httplib.ImproperConnectionState,
  httplib.CannotSendRequest, httplib.CannotSendHeader,
  httplib.ResponseNotReady, httplib.BadStatusLine)

# Always retry when an apiclient.errors.HttpError with one of these status
# codes is raised.
RETRIABLE_STATUS_CODES = [500, 502, 503, 504]

# The CLIENT_SECRETS_FILE variable specifies the name of a file that contains
# the OAuth 2.0 information for this application, including its client_id and
# client_secret. You can acquire an OAuth 2.0 client ID and client secret from
# the Google Developers Console at
# https://console.developers.google.com/.
# Please ensure that you have enabled the YouTube Data API for your project.
# For more information about using OAuth2 to access the YouTube Data API, see:
#   https://developers.google.com/youtube/v3/guides/authentication
# For more information about the client_secrets.json file format, see:
#   https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
CLIENT_SECRETS_FILE = "client_secrets.json"

# This OAuth 2.0 access scope allows an application to upload files to the
# authenticated user's YouTube channel, but doesn't allow other types of access.
YOUTUBE_UPLOAD_SCOPE = "https://www.googleapis.com/auth/youtube.upload"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

# This variable defines a message to display if the CLIENT_SECRETS_FILE is
# missing.
MISSING_CLIENT_SECRETS_MESSAGE = """
WARNING: Please configure OAuth 2.0

To make this sample run you will need to populate the client_secrets.json file
found at:

   %s

with information from the Developers Console
https://console.developers.google.com/

For more information about the client_secrets.json file format, please visit:
https://developers.google.com/api-client-library/python/guide/aaa_client_secrets
""" % os.path.abspath(os.path.join(os.path.dirname(__file__),
                                   CLIENT_SECRETS_FILE))

VALID_PRIVACY_STATUSES = ("public", "private", "unlisted")


def get_authenticated_service(args):
  flow = flow_from_clientsecrets(CLIENT_SECRETS_FILE,
    scope=YOUTUBE_UPLOAD_SCOPE,
    message=MISSING_CLIENT_SECRETS_MESSAGE)

  storage = Storage("%s-oauth2.json" % sys.argv[0])
  credentials = storage.get()

  if credentials is None or credentials.invalid:
    credentials = run_flow(flow, storage, args)

  return build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,
    http=credentials.authorize(httplib2.Http()))

def initialize_upload(youtube, options):
  tags = None
  if options.keywords:
    tags = options.keywords.split(",")

  body=dict(
    snippet=dict(
      title=options.title,
      description=options.description,
      tags=tags,
      categoryId=options.category
    ),
    status=dict(
      privacyStatus=options.privacyStatus
    )
  )

  # Call the API's videos.insert method to create and upload the video.
  insert_request = youtube.videos().insert(
    part=",".join(body.keys()),
    body=body,
    # The chunksize parameter specifies the size of each chunk of data, in
    # bytes, that will be uploaded at a time. Set a higher value for
    # reliable connections as fewer chunks lead to faster uploads. Set a lower
    # value for better recovery on less reliable connections.
    #
    # Setting "chunksize" equal to -1 in the code below means that the entire
    # file will be uploaded in a single HTTP request. (If the upload fails,
    # it will still be retried where it left off.) This is usually a best
    # practice, but if you're using Python older than 2.6 or if you're
    # running on App Engine, you should set the chunksize to something like
    # 1024 * 1024 (1 megabyte).
    media_body=MediaFileUpload(options.file, chunksize=-1, resumable=True)
  )

  resumable_upload(insert_request)

# This method implements an exponential backoff strategy to resume a
# failed upload.
def resumable_upload(insert_request):
  response = None
  error = None
  retry = 0
  while response is None:
    try:
      print "Uploading file..."
      status, response = insert_request.next_chunk()
      if 'id' in response:
        print "Video id '%s' was successfully uploaded." % response['id']
      else:
        exit("The upload failed with an unexpected response: %s" % response)
    except HttpError, e:
      if e.resp.status in RETRIABLE_STATUS_CODES:
        error = "A retriable HTTP error %d occurred:\n%s" % (e.resp.status,
                                                             e.content)
      else:
        raise
    except RETRIABLE_EXCEPTIONS, e:
      error = "A retriable error occurred: %s" % e

    if error is not None:
      print error
      retry += 1
      if retry > MAX_RETRIES:
        exit("No longer attempting to retry.")

      max_sleep = 2 ** retry
      sleep_seconds = random.random() * max_sleep
      print "Sleeping %f seconds and then retrying..." % sleep_seconds
      time.sleep(sleep_seconds)

if __name__ == '__main__':
  argparser.add_argument("--file", required=True, help="Video file to upload")
  argparser.add_argument("--title", help="Video title", default="Test Title")
  argparser.add_argument("--description", help="Video description",
    default="Test Description")
  argparser.add_argument("--category", default="22",
    help="Numeric video category. " +
      "See https://developers.google.com/youtube/v3/docs/videoCategories/list")
  argparser.add_argument("--keywords", help="Video keywords, comma separated",
    default="")
  argparser.add_argument("--privacyStatus", choices=VALID_PRIVACY_STATUSES,
    default=VALID_PRIVACY_STATUSES[0], help="Video privacy status.")
  args = argparser.parse_args()

  if not os.path.exists(args.file):
    exit("Please specify a valid file using the --file= parameter.")

  youtube = get_authenticated_service(args)
  try:
    initialize_upload(youtube, args)
  except HttpError, e:
    print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)

关于如何使用 YouTube OAuth API v3 获取访问权限和新令牌并保存它们以供将来使用的非常有用的分步指南。 PHP 服务器端 YouTube V3 OAuth API 视频上传指南。https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide https://www.domsammut.com/code/php-server-side-youtube-v3-oauth-api-video-upload-guide

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

如何直接从我的服务器将视频上传到 Youtube? 的相关文章

  • EPi服务器开发

    除了 Episerver com 之外 使用EPiServer开发的人还使用哪些其他网站作为开发资源 一直在使用 coderesort com 但我发现它缺乏如何做事的示例 非常感谢 J 我用于EPiServer开发的通用资源 EPi服务器
  • 从 iFrame 嵌入 API 获取 YouTube 视频信息

    我正在使用 YouTube iFrame API 嵌入视频并创建一个简单的自定义播放器 我正在寻找视频标题 描述 等 无需再次调用 YouTube 即可获取信息 我无法找到任何相关信息 有什么想法 或者我是否需要额外拨打电话来获取视频信息
  • 是否可以通过 Google oAuth2 获取电话号码?

    根据 OpenID 规范 应该是可以的http openid net specs openid attribute properties list 1 0 01 html http openid net specs openid attri
  • musicbrainz api 获取所有发行组和发行日期

    如何使用 musicbrainz api 在一次调用中获取艺术家的所有发行组和发行日期 我最接近做到这一点的是使用 http musicbrainz org ws 2 release group query arid 494e8d09 f8
  • YouTube 360​​ 视频 iframe 无法在移动浏览器中工作

    我正在尝试为 YouTube 360 视频获取嵌入的 iframe 以便在我的移动网站上播放 它在桌面浏览器上运行良好 但在移动浏览器中我只能播放平面立体视图 我可以确认它绝对是一个 HTML5 播放器 这显然是其他人正在经历的一个未解决的
  • YouTube 直播嵌入代码不断变化

    我使用 YouTube 进行直播 并且可以通过将嵌入代码复制到我的网站中来在我的网站上观看它 它看起来像下面这样 但最近我发现 每次进行直播时 我都必须开始使用从直播频道生成的代码来更新网站上的嵌入代码 这是因为它不断重新生成不同的代码 这
  • 在 MVC API 中使用 Microsoft Azure Active Directory 验证 OAuth 2.0 不记名令牌时出现 401

    我正在写一个MVC 中的 API 服务 没有视图 只有 API 我想使用通过 client credentials 流获取的 OAuth 2 0 令牌 两条腿的 OAuth 我创建了一个Azure 管理门户中的 ActiveDirector
  • 如何使用 Javascript OAuth 库不暴露您的密钥?

    看着Twitter OAuth 库 https dev twitter com docs twitter libraries 我看到了这个注释 将 JavaScript 与 OAuth 结合使用时要小心 不要暴露你的钥匙 然后 看着jsOA
  • 如何使用 C# API 移动 TFS 文件?

    我一直在谷歌上搜索如何使用 TFS API 通过 C 移动文件 我们的想法是有一个文件夹 开发人员可以在其中放置数据库升级脚本 构建过程会在该文件夹中创建一个构建脚本 并将该文件夹上的所有文件移动到具有我们刚刚创建的数据库构建版本的新文件夹
  • 如何按名称杀死进程? (Win32 API)

    基本上 我有一个将启动多次的程序 因此 该程序将启动两个或多个进程 我想使用 Win32 API 并终止 终止具有特定名称的所有进程 我见过杀死一个进程的例子 但没有看到多个具有完全相同名称 但参数不同 的进程 尝试下面的代码 killPr
  • PowerShell-V5 Invoke-Webrequest 添加 2 个标头授权标头和接受接受标头

    我正在尝试创建一个脚本 该脚本将使用 powershell 和 invoke webrequest 自动升级 NSX 以利用 NSX Manager 的 API 调用 我已经完成了脚本 但脚本的某些部分我需要检查并匹配响应中的某些数据 事实
  • 使用 YouTube API 检查视频是否可嵌入

    我试图弄清楚 YouTube 视频是否可以使用 YouTube Data API v3 嵌入 从类似问题的答案中我注意到视频的 status embeddable 属性 对于这样的请求 https www googleapis com yo
  • Paypal Rest API - 来自批准 URL 的令牌生命周期

    我使用 Paypal Rest API 我的问题是 有多长token来自批准 URL 有效吗 我想将此令牌 也包含我的令牌 存储到数据库并生成带有我的令牌的链接 稍后 如果我单击此链接 将我的令牌替换为 paypal 令牌 我想重定向到 p
  • 使用 API 密钥和机密保护 Spring Boot API

    我想保护 Spring Boot API 的安全 以便只有拥有有效 API 密钥和秘密的客户端才能访问它 但是 程序内部没有身份验证 使用用户名和密码的标准登录 因为所有数据都是匿名的 我想要实现的目标是所有 API 请求只能用于特定的第三
  • Flutter VideoPlayer 无法播放 YouTube 视频

    我正在开发 flutter 应用程序并使用 ext video player 播放 YouTube 视频 当我在视频播放器上播放频道视频时 它不起作用 但我添加了 YouTube 上的任何视频 播放器正在工作 为什么会发生这样的事 impo
  • 在 Java 中处理视频(DVD、.avi .mkv)

    在寻找了一个像样的 Java 视频播放库之后 我发现了问题 周围的每个人都在尖叫不要使用 JMF 因为它已经过时 过时并且需要用户安装它 其他替代方案 例如 VLCJ 如果可以工作的话似乎不错 但仍然相对不稳定并且依赖大量本机代码 并且至于
  • 扩展授权属性

    我实施了 CustomAuthorization 属性基于 Authorize 属性 我的属性如下所示 public class CustomAuthorizeAttribute AuthorizeAttribute public eUse
  • Magento2:REST API:保存每个商店视图的产品详细信息不起作用

    使用Magento2 1 0 rc1分支 有样本数据 使用 REST API 目录ProductRepositoryV1 REF http devdocs magento com swagger index html http devdoc
  • 如何在 Facebook 应用程序中关闭“使用严格模式重定向 URI”

    有什么办法可以关闭该选项Use Strict Mode for Redirect URIs在 Facebook 应用程序中 自 2018 年 3 月起 此属性似乎已自动打开并呈灰色显示 因此无法禁用 Facebook 似乎不允许身份验证 除
  • 使用 Swagger 的 Spring REST API 文档 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以帮助我生成 RESTful API 文档的工具 我的服务器是用Java编写的并使用S

随机推荐

  • Inkscape 命令行:需要将 SVG 转换为 eps,无需滤镜光栅化

    我需要将 SVG 转换为 EPS 目前使用 inkscape 来执行此操作 要使用 Inkscape GUI 版本转换 SVG 我只需打开 svg 然后 另存为 logo eps 取消选择 光栅化滤镜效果 选项 但是 我想使用命令行自动执行
  • Spring JDBC:如何创建表?

    我正在使用春天JdbcTemplate使用 DAO 模式来访问数据库 我正在寻找一种在 DAO 层中生成表的方法 而不是手动创建数据库表 我明白我可以使用JdbcTemplate要执行语句 我只是在寻找正确的位置来执行它 有没有最佳实践 您
  • IntelliJ可以在同一个tomcat实例上调试两个war文件吗?

    我有两个 Web 应用程序 每个应用程序都会生成一个 war 文件 有时我需要同时运行和调试它们 我今天实现这一目标的方法是在 tomcat 6 的端口 8080 上运行项目 A 在 tomcat 7 的端口 8181 上运行项目 B 我有
  • 如果 getter 抛出异常,如何让 Jackson 忽略属性

    我有很多来自供应商的类 它们喜欢在属性访问时随机抛出运行时异常 public Object getSomeProperty if someObscureStateCheck throw new IllegalStateExcepion re
  • C++ 中优先级队列的时间复杂度

    创建堆需要O n 插入堆 或优先级队列 所需的时间O log n time 获取 n 个输入并将它们插入优先级队列 该操作的时间复杂度是多少 O n 或 O n log n 另外 如果也清空整个堆 即 n 删除 也会得到相同的结果 对吗 如
  • 如何使用 pack 或 grid 实现以下 Tkinter GUI 布局?

    这是我当前的跳棋游戏 GUI 布局 正如您所看到的 它由顶部的菜单 左侧的画布 用于绘制棋盘 右上角的工具栏 框架 其中有各种格式 导航按钮 以及使用的文本小部件组成 来注释动作 目前 我正在为小部件使用网格布局 这是我需要做的 当文本量大
  • ReferenceEquals(variable, null) 与variable == null 相同吗?

    基本上就是标题 我在我正在编写的代码中看到很多前者 我想知道为什么他们不使用后者 两者之间有什么区别吗 Thanks 直接来自文档 http msdn microsoft com en us library system object re
  • 适用于 Windows 8 RTM 的 Microsoft Advertising SDK 导致访问被拒绝错误

    请注意以下事项 我有 Windows 8 RTM 我有 Visual Studio 2012 RTM 我有 Microsoft Advertising SDK RTM 我所做的就是 添加对它的引用 错误 System Unauthorize
  • App Engine 数据存储上的 Spring Security ACL

    我们将 Spring Security ACL 基础设施与 App Engine 数据存储结合使用 我们不使用低级数据存储 API 而是使用 Objectify 框架来访问数据存储 我们需要将Spring Security ACL模型 适用
  • 通过 php exec 函数传递 $_SERVER 数组[重复]

    这个问题在这里已经有答案了 可能的重复 安全执行shell脚本 执行前转义变量 https stackoverflow com questions 2624616 safe executing shell scripts escaping
  • 谷歌地图API带有信息窗口的多个标记

    我刚刚开始接触谷歌地图 API 我正在尝试在地图上绘制几个标记 完毕 然而 我正在为每个标记回收一个变量 对象 我最初使用选项创建标记并添加到地图 然后采用相同的标记变量 重新调整其用途 然后再次将其添加到地图 这确实会产生两个带有单独标题
  • 你将如何在 C# 中构建这个 xml

    我需要生成这个看起来简单的 XML 寻找一种干净的方法来生成它
  • 从 NPM 包中导出多个模块

    我有一个相当大的项目 A 使用 Node 和 Typescript 在项目 A 中 我有很多不同的模块 我想在另一个项目 B 中重用它们 因此我用这个 tsconfig json 构建了项目 A compilerOptions target
  • Android 应用内计费 - 从服务器检索信息时出错

    我在应用程序计费中使用 Android 来进行应用程序内购买 在极少数情况下 我的许多用户都会报告此错误 从服务器检索信息时出错 RPC S 7 AEC 0 这是在生产中发生的 而不是在测试中发生的 我无法在本地重现此内容以进行调试 这个错
  • ArrayDeque类的addFirst方法

    java util ArrayDeque类中addFirst方法的代码是 public void addFirst E e if e null throw new NullPointerException elements head hea
  • 使用 1-1 函数从 id 生成代码

    有没有好的可逆 1 1 函数将一个整数映射到另一个整数 例如 给定范围 0 5 我想找到一个映射的 0 gt 3 1 gt 2 2 gt 4 3 gt 5 4 gt 1 5 gt 0 此外 映射应该看起来是随机的 您可以按升序填充数组并对其
  • 使用 Laravel 查询生成器和 LEFT JOIN 删除行

    如何在一个查询中从多个表中删除行 使用左连接 查询 DELETE deadline job FROM deadline LEFT JOIN job 所以 我尝试这样 DB table deadline job gt leftJoin job
  • 下载文件时显示“请稍候”消息或进度条

    我使用以下 WordPress 管理员通知来提示用户下载一些文件 我想在下载文件时包含一个进度条或至少包含一个 正在下载 请稍候 消息 有任何想法吗 我已经尝试了几种 jQuery 解决方案 但没有任何效果 对于 jQuery 我完全是个菜
  • 非静态字段、方法或属性需要对象引用吗?

    我知道这可能是一个非常新的问题 所以我很抱歉 我正在尝试从另一个表单 MaxScore 访问 Form1 上标签的 Text 属性 当我单击 MaxScore 上的 确定 按钮时 我想使用 max ToString 将 Form1 的 my
  • 如何直接从我的服务器将视频上传到 Youtube?

    我正在设置一个 无头 网络服务器 让人们可以制作自己的自定义延时电影 有几个人想将他们制作的延时视频上传到 YouTube 与其将视频下载到该人的笔记本电脑上 然后该人手动将其上传到 YouTube 有没有一种方法可以在我的网络服务器上编写