yt

yt

简化YouTube API交互的Ruby客户端库

Yt是一个Ruby客户端库,用于简化与YouTube API的交互。它提供了访问YouTube频道、视频、播放列表等资源的简便方法。开发者无需深入了解复杂的API细节,即可轻松创建与YouTube交互的应用。该库支持多种认证方式,适用于各类应用场景。Yt简化了YouTube数据的获取和管理,是开发YouTube相关应用的有力工具。

YouTubeRubyAPI开发认证Github开源项目

Yt - YouTube API 的 Ruby 客户端

Yt 帮助你编写需要与 YouTube 交互的应用程序。

源代码可在 GitHub 上获取,文档可在 RubyDoc 上查阅。

构建状态 覆盖率状态 依赖状态 代码质量 在线文档 Gem 版本

配置你的应用后,你可以运行如下命令:

channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow' channel.title #=> "Fullscreen" channel.public? #=> true channel.videos.count #=> 12
video = Yt::Video.new id: 'jNQXAC9IVRw' video.title #=> "Fullscreen Creator Platform" video.comment_count #=> 308 video.hd? #=> true video.annotations.count #=> 1 video.comment_threads #=> #<Yt::Collections::CommentThreads ...> # 使用 #take 限制需要从服务器获取的页数 video.comment_threads.take(99).map(&:author_display_name) #=> ["Paul", "Tommy", ...]

完整文档可在 rubydoc.info 上查阅。

如何安装

要在你的系统上安装,运行

gem install yt

要在一个捆绑的 Ruby 项目中使用,在 Gemfile 中添加这一行:

gem 'yt', '~> 0.32.0'

由于该 gem 遵循语义化版本控制, 在你的 Gemfile 中指明完整版本(~> major.minor.patch) 可以保证当你 bundle update 时,即使发布了新版本的 Yt,你的项目也不会出现任何错误。

可用资源

Yt::Account

查看 nullscreen.github.io/yt 获取 Yt::Account 可用方法的列表。

Yt::ContentOwner

使用 Yt::ContentOwner 可以:

  • 以 YouTube 内容所有者身份进行身份验证
  • 列出与 YouTube 内容所有者合作的频道
  • 列出由内容所有者管理的版权声明
  • 列出并删除由内容所有者管理的参考
  • 列出由内容所有者管理的政策和政策规则
  • 创建资产
  • 列出资产
# 内容所有者可以使用访问令牌、刷新令牌或授权码进行初始化 content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' content_owner.partnered_channels.count #=> 12 content_owner.partnered_channels.map &:title #=> ["Fullscreen", "Best of Fullscreen", ...] content_owner.partnered_channels.where(part: 'statistics').map &:subscriber_count #=> [136925, 56945, ...] content_owner.claims.where(q: 'Fullscreen').count #=> 24 content_owner.claims.first #=> #<Yt::Models::Claim @id=...> content_owner.claims.first.video_id #=> 'jNQXAC9IVRw' content_owner.claims.first.status #=> "active" reference = content_owner.references.where(asset_id: "ABCDEFG").first #=> #<Yt::Models::Reference @id=...> reference.delete #=> true content_owner.policies.first #=> #<Yt::Models::Policy @id=...> content_owner.policies.first.name #=> "Track in all countries" content_owner.policies.first.rules.first #=> #<Yt::Models::PolicyRule @id=...> content_owner.policies.first.rules.first.action #=> "monetize" content_owner.policies.first.rules.first.included_territories #=> ["US", "CA"] content_owner.create_asset type: 'web' #=> #<Yt::Models::Asset @id=...> content_owner.assets.first #=> #<Yt::Models::AssetSnippet:0x007ff2bc543b00 @id=...> content_owner.assets.first.id #=> "A4532885163805730" content_owner.assets.first.title #=> "Money Train" content_owner.assets.first.type #=> "web" content_owner.assets.first.custom_id #=> "MoKNJFOIRroc"

以上所有方法都需要身份验证(见下文)。

Yt::Channel

查看 nullscreen.github.io/yt 获取 Yt::Channel 可用方法的列表。

Yt::Video

查看 nullscreen.github.io/yt 获取 Yt::Video 可用方法的列表。

Yt::Playlist

查看 nullscreen.github.io/yt 获取 Yt::Playlist 可用方法的列表。

Yt::PlaylistItem

查看 nullscreen.github.io/yt 获取 Yt::PlaylistItem 可用方法的列表。

Yt::CommentThread

使用 Yt::CommentThread 可以:

  • 显示评论线程的详细信息。
Yt::CommentThread.new id: 'z13vsnnbwtv4sbnug232erczcmi3wzaug' comment_thread.video_id #=> "1234" comment_thread.total_reply_count #=> 1 comment_thread.can_reply? #=> true comment_thread.public? #=> true comment_thread.top_level_comment #=> #<Yt::Models::Comment ...> comment_thread.text_display #=> "funny video!" comment_thread.like_count #=> 9 comment_thread.updated_at #=> 2016-03-22 12:56:56 UTC comment_thread.author_display_name #=> "Joe"

Yt::Comment

使用 Yt::Comment 可以:

  • 获取评论的详细信息。
Yt::Comment.new id: 'z13vsnnbwtv4sbnug232erczcmi3wzaug' comment.text_display #=> "很棒" comment.author_display_name #=> "Jack" comment.like_count #=> 1 comment.updated_at #=> 2016-03-22 12:56:56 UTC comment.parent_id #=> "abc1234" (如果评论不是回复则返回 nil)

Yt::BulkReportJob

使用 Yt::BulkReportJob 可以:

  • 获取批量报告任务的详细信息。
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' bulk_report_job = content_owner.bulk_report_jobs.first bulk_report_job.report_type_id #=> "content_owner_demographics_a1"

Yt::BulkReport

使用 Yt::BulkReport 可以:

  • 获取批量报告的详细信息。
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' bulk_report_job = content_owner.bulk_report_jobs.first bulk_report = bulk_report_job.bulk_reports.first bulk_report.start_time #=> 2017-08-11 07:00:00 UTC bulk_report.end_time #=> 2017-08-12 07:00:00 UTC bulk_report.download_url #=> "https://youtubereporting.googleapis.com/v1/..."

Yt::Collections::Videos

使用 Yt::Collections::Videos 可以:

  • 搜索视频
videos = Yt::Collections::Videos.new videos.where(order: 'viewCount').first.title #=> "PSY - GANGNAM STYLE" videos.where(q: 'Fullscreen CreatorPlatform', safe_search: 'none').size #=> 324 videos.where(chart: 'mostPopular', video_category_id: 44).first.title #=> "SINISTER - Trailer" videos.where(id: 'jNQXAC9IVRw,invalid').map(&:title) #=> ["Fullscreen Creator Platform"]

以上方法不需要身份验证。

Yt::Annotation

查看 nullscreen.github.io/yt 获取 Yt::Annotation 可用的方法列表。

Yt::MatchPolicy

使用 Yt::MatchPolicy 可以:

  • 更新资产使用的政策
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' match_policy = Yt::MatchPolicy.new asset_id: 'ABCD12345678', auth: content_owner match_policy.update policy_id: 'aBcdEF6g-HJ' #=> true

Yt::Asset

使用 Yt::Asset 可以:

  • 读取资产的所有权
  • 更新资产的属性
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' asset = Yt::Asset.new id: 'ABCD12345678', auth: content_owner asset.ownership #=> #<Yt::Models::Ownership @general=...> asset.ownership.obtain! #=> true asset.general_owners.first.owner #=> 'CMSname' asset.general_owners.first.everywhere? #=> true asset.ownership.release! #=> true asset.update metadata_mine: {notes: '一些注释'} #=> true
  • 检索资产的元数据(如标题、注释、描述、自定义ID)
content_owner = Yt::ContentOwner.new(...) asset = content_owner.assets.where(id: 'A969176766549462', fetch_metadata: 'mine').first asset.metadata_mine.title #=> "Master Final Neu La Anh Fix" asset = content_owner.assets.where(id: 'A969176766549462', fetch_metadata: 'effective').first asset.metadata_effective.title #=> "Neu la anh" (由于所有权冲突而不同)
asset = content_owner.assets.where(id: 'A125058570526569', fetch_ownership: 'effective').first asset.ownership_effective.general_owners.first.owner # => "XOuN81q-MeEUVrsiZeK1lQ"
  • 搜索资产
content_owner.assets.where(labels: "campaign:cpiuwdz-8oc").size #=> 417 content_owner.assets.where(labels: "campaign:cpiuwdz-8oc").first.title #=> "Whoomp! (Supadupafly) (Xxl Hip House Mix)"

Yt::Claim

使用 Yt::Claim 可以:

  • 读取认领的属性
  • 查看认领的历史
  • 更新认领的属性
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' claim = Yt::Claim.new id: 'ABCD12345678', auth: content_owner claim.video_id #=> 'va141cJga2' claim.asset_id #=> 'A1234' claim.content_type #=> 'audiovisual' claim.active? #=> true claim.claim_history #=> #<Yt::Models::ClaimHistory ...> claim.claim_history.events[0].type #=> "claim_create" claim.delete #=> true data = { is_manual_claim: true, content_type: 'audiovisual', asset_id: 'A123123123123123', policy: { id: 'S123123123123123' }, video_id: 'myvIdeoIdYT', match_info: { match_segments: [ { manual_segment: { start: '00:00:20.000', finish: '00:01:20.000' } }, { manual_segment: { start: '00:02:30.000', finish: '00:03:50.000' } } ] } } content_owner.claims.insert(data)

以上方法需要以视频内容所有者的身份进行身份验证(见下文)。

Yt::Ownership

使用 Yt::Ownership 可以:

  • 更新资产的所有权
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' ownership = Yt::Ownership.new asset_id: 'ABCD12345678', auth: $content_owner new_general_owner_attrs = {ratio: 100, owner: 'CMSname', type: 'include', territories: ['US', 'CA']} ownership.update general: [new_general_owner_attrs]

以上方法需要以视频内容所有者的身份进行身份验证(见下文)。

Yt::AdvertisingOptionsSet

使用 Yt::AdvertisingOptionsSet 可以:

  • 更新视频的广告设置
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ' ad_options = Yt::AdvertisingOptionsSet.new video_id: 'jNQXAC9IVRw', auth: $content_owner ad_options.update ad_formats: %w(standard_instream long) #=> true

上述方法需要以视频内容所有者的身份进行身份验证(见下文)。

插桩

Yt 利用 Active Support Instrumentation 提供了一个钩子,开发者可以使用它来获取向 YouTube 发送 HTTP 请求的通知。这个钩子可用于跟踪一段时间内的请求数量、监控配额使用情况、提供审计跟踪,或跟踪特定请求完成所需的时间。

在您的应用程序中订阅 request.yt 通知:

ActiveSupport::Notifications.subscribe 'request.yt' do |*args| event = ActiveSupport::Notifications::Event.new(*args) event.payload[:request_uri] #=> #<URI::HTTPS URL:https://www.googleapis.com/youtube/v3/channels?id=UCxO1tY8h1AhOz0T4ENwmpow&part=snippet> event.payload[:method] #=> :get event.payload[:response] #=> #<Net::HTTPOK 200 OK readbody=true> event.end #=> 2014-08-22 16:57:17 -0700 event.duration #=> 141.867 (ms) end

配置您的应用

要使用 Yt,您必须在 Google Developers Console 中注册您的应用。

如果您还没有注册应用,请浏览控制台并选择"创建项目": 01-create-project

当您的项目准备就绪后,在菜单中选择 APIs & Auth,然后分别启用 Google+、YouTube Analytics 和 YouTube Data API: 02-select-api 02a-enable google api 02b-enable youtube api 02c-enable youtube analytics api

下一步是创建 API 密钥。根据您的应用性质,您应选择以下策略之一。

不需要用户交互的应用

如果您正在构建一个只从 YouTube 获取公开数据的只读应用,那么您只需要一个公共 API 访问权限

在公共 API 部分点击"创建新密钥",然后选择"服务器密钥": 03-create-key 04-create-server-key

创建服务器应用程序密钥后,复制 API 密钥并将其添加到您的代码中,使用以下代码片段(替换为您自己的密钥):

Yt.configure do |config| config.api_key = 'AIzaSyAO8dXpvZcaP2XSDFBD91H8yQ' end

请记住:这种类型的应用不允许执行任何破坏性操作,因此您无法为视频点赞、订阅频道或从特定帐户删除播放列表。您只能检索只读数据。

需要用户交互的网络应用

如果您正在构建一个管理 YouTube 帐户的网络应用,您需要每个帐户的所有者授权您的应用。有三种情况:

情况 1. 如果您已经有帐户的访问令牌,那么您就可以开始了。只需将该访问令牌传递给帐户初始化器,例如:

account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ' account.email #=> (检索帐户的电子邮件地址) account.videos #=> (列出帐户播放列表中的视频)

情况 2. 如果您没有帐户的访问令牌,但有刷新令牌,那么几乎同样简单。 在 Google Developers Console 中,找到用于获取刷新令牌的网络应用程序,复制客户端 ID 和客户端密钥,并将它们添加到您的代码中,使用以下代码片段(替换为您自己的密钥):

Yt.configure do |config| config.client_id = '1234567890.apps.googleusercontent.com' config.client_secret = '1234567890' end

然后,您可以通过将刷新令牌传递给帐户初始化器来管理 YouTube 帐户,例如:

account = Yt::Account.new refresh_token: '1/1234567890' account.email #=> (检索帐户的电子邮件地址) account.videos #=> (列出帐户播放列表中的视频)

情况 3. 如果您没有任何帐户的令牌,那么您可以通过让用户通过 Google OAuth 页面授权您的应用来获取一个。

Google Developers Console 中,点击 OAuth 部分的"创建新客户端 ID",然后选择"Web 应用程序": 06-create-client-key

在"授权重定向 URI"文本区域中填写您的应用程序 URL,用户授权他们的 YouTube 帐户后将被重定向到该 URL。

创建 Web 应用程序的客户端 ID 后,复制客户端 ID 和密钥,并将它们添加到您的代码中,使用以下代码片段(替换为您自己的密钥):

Yt.configure do |config| config.client_id = '49781862760-4t610gtk35462g.apps.googleusercontent.com' config.client_secret = 'NtFHjZkJcwYZDfYVz9mp8skz9' end

最后,在您的网络应用中,添加一个链接到通过运行以下代码生成的 URL:

Yt::Account.new(scopes: scopes, redirect_uri: redirect_uri).authentication_url

其中 redirect_uri 是您在上面表单中输入的 URL,scopes 是您希望用户授权的 YouTube 权限列表。根据您应用的性质,您可以在 youtubeyoutube.readonlyuserinfo.email 中选择一个或多个。

每个授权您应用的用户都会被重定向到 redirect_uri,并带有一个额外的 code 参数,看起来类似 4/Ja60jJ7_Kw0。只需将此代码传递给以下方法即可进行身份验证并初始化账户:

account = Yt::Account.new authorization_code: '4/Ja60jJ7_Kw0', redirect_uri: redirect_uri account.email #=> (获取账户的电子邮件地址) account.videos #=> (列出账户播放列表中的视频)

使用环境变量进行配置

作为上述方法的替代方案,您可以使用变量配置您的应用。设置以下环境变量:

export YT_CLIENT_ID="1234567890.apps.googleusercontent.com" export YT_CLIENT_SECRET="1234567890" export YT_API_KEY="123456789012345678901234567890"

等同于使用初始化程序配置您的应用:

Yt.configure do |config| config.client_id = '1234567890.apps.googleusercontent.com' config.client_secret = '1234567890' config.api_key = '123456789012345678901234567890' end

因此,请使用您喜欢的方法。 如果一个变量在两个地方都设置了,则 Yt.configure 优先。

如何测试

运行测试:

rspec

我们推荐使用 RSpec >= 3.8。

Yt 包含两种不同的测试集:

  1. spec/modelsspec/collectionsspec/errors 中的单元测试
  2. spec/requests 中的旧版集成测试

即将推出一套新的高级集成测试。

集成测试使用 VCR 录制。一些测试引用了任意账户可能无法访问的固定数据。如果您需要修改其中一个测试或重新录制测试用例,我们建议您使用自己的测试设置版本进行操作。然后在您的拉取请求中,我们可以帮助规范化您的测试/固定数据。

一些集成测试需要身份验证。可以使用以下环境变量进行设置:

  • YT_TEST_CLIENT_ID
  • YT_TEST_CLIENT_SECRET
  • YT_TEST_API_KEY
  • YT_TEST_REFRESH_TOKEN

如何发布新版本

如果您是该项目的管理者,请记住在添加新功能或修复错误时升级 Yt gem

确保所有测试都在 Travis CI 上通过, 在 CHANGELOG.md 和 README.md 中记录更改,增加版本号,然后运行

rake release

请记住,yt gem 遵循语义化版本控制。 任何完全向后兼容的新版本应增加补丁版本号(0.0.x)。 任何破坏兼容性的新版本应增加次要版本号(0.x.0)

如何贡献

Yt 需要您的支持! Yt 的目标是为 YouTube Data API (v3)YouTube Analytics API 暴露的所有方法提供 Ruby 接口。

如果您发现缺少某个方法,请 fork 项目,添加缺失的代码,编写适当的测试,然后提交拉取请求,我们将很乐意合并!

编辑推荐精选

扣子-AI办公

扣子-AI办公

职场AI,就用扣子

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

堆友

堆友

多风格AI绘画神器

堆友平台由阿里巴巴设计团队创建,作为一款AI驱动的设计工具,专为设计师提供一站式增长服务。功能覆盖海量3D素材、AI绘画、实时渲染以及专业抠图,显著提升设计品质和效率。平台不仅提供工具,还是一个促进创意交流和个人发展的空间,界面友好,适合所有级别的设计师和创意工作者。

图像生成AI工具AI反应堆AI工具箱AI绘画GOAI艺术字堆友相机AI图像热门
码上飞

码上飞

零代码AI应用开发平台

零代码AI应用开发平台,用户只需一句话简单描述需求,AI能自动生成小程序、APP或H5网页应用,无需编写代码。

Vora

Vora

免费创建高清无水印Sora视频

Vora是一个免费创建高清无水印Sora视频的AI工具

Refly.AI

Refly.AI

最适合小白的AI自动化工作流平台

无需编码,轻松生成可复用、可变现的AI自动化工作流

酷表ChatExcel

酷表ChatExcel

大模型驱动的Excel数据处理工具

基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。

AI工具酷表ChatExcelAI智能客服AI营销产品使用教程
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
AIWritePaper论文写作

AIWritePaper论文写作

AI论文写作指导平台

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

AI辅助写作AI工具AI论文工具论文写作智能生成大纲数据安全AI助手热门
博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

下拉加载更多