bet188足球-使用oauth进行一个简单的命令行脚本访问谷歌的数据

2015年1月26日

弃用警告

2016年2月27日

我需要回到这个代码,发现今年以来我写这篇文章有了很大变化基本ruby客户端库(0。8 - 0。9)和授权机制。我还没有来得及算出这些变化的细节,更不用说更新这篇文章反映了他们。唯一对我目前可以确定的是,显示的文档没有任何改善的迹象。.

我最近需要编写一个简单的脚本将一些数据从一个谷歌网站。因为我是抓一些私人数据,我需要授权。我发现它比我想象的更多的工作,不是因为它很难,但因为并没有太多的文档指导我,我不得不难题出路径去基于很多不是特别相关的文档。所以一旦我想通了我决定写一个短的我做什么,部分我又需要这样做,和部分帮助其他人谁想这样做。.

首先一个声明。这就是我找到了,它对我来说,目前。我还没有做过广泛的研究是否这是最好的办法做我想做的事(虽然它肯定感觉广泛研究,而我是这样做)。所以牢记这一点。(如果你有更好的方法让我知道。)

我做了所有这些在Ruby中,因为那是我熟悉的脚本语言。我也用谷歌的Ruby api库。但大部分的整体流量将为其他语言是相同的,如果你操作之外的Ruby我认为我所做的仍然是相关的。我试着描述我在做什么语言尽可能独立的观点,除了ruby的例子。.

我需要访问一个私人视频在YouTube上的视频和打印的标题的视频播放列表。.[1]由于这是一个私人播放列表,我需要验证谷歌和设置必要的授权为脚本,可以在私有数据。我想运行此脚本没有任何人工干预,所以我想用我的任何身份验证机制脚本可以访问自己的东西,至少一次我登录到我的笔记本电脑。.

在我描述我跟着成功的路径,我应该提及我走上一条死胡同。的一件事情让这个简单的练习如此棘手的是,大多数的文档我读以为我想写指导浏览器的web。但是我想要一个简单的命令行应用程序(我猜,因为我这样老式的)不涉及一个浏览器。阅读的谷歌指南的身份验证和授权我决定使用OAuth 2。0,,这似乎是谷歌希望去的地方。然后,几个场景OAuth授权,复杂的自然(如果)一个似乎服务帐户.这些支持服务器到服务器访问身份验证通过公共/私有密钥对。我花了很多时间摆弄这个工作最终能够访问谷歌成功,这时我遇到了一堵墙。服务帐户,你在谷歌上有效地创建一个新的用户。你需要一些机制来允许用户访问您的个人资料。如果您正在运行一个域上谷歌,有一种方法可以授权服务帐户访问域的数据。但是我找不到这样的机制来访问的数据直接谷歌账户,如我的。文档暗示你可以对一些属性(如分析)但没有通用的机制,比如,为youtube数据工作。总是令人沮丧的花许多小时制定解决方案和运行到一个坚硬的墙,如果这篇文章没有超过省几人的努力,然后值得写。.


大纲流授权

的道路,为我工作是基于谷歌所称的已安装的应用程序流,但我需要适应,以确保我能(大部分)做无需手工干预或使用一个浏览器。.

最好的解释这是如何工作的,我将开始一个简单的请求,youtube清单。每当一个google数据脚本发出请求,你需要包括一个访问令牌在你的请求。谷歌的文档显示这样一个HTTP请求。.

得到/ + / v1 /人/ HTTP / 1。1授权:无记名1 / fFBGRNJru1FQd44AzqT3ZgHost:googleapis。com

访问令牌是一个随机串字符。它持续很短的时间内,当前文档说它仅仅持续一个小时。访问令牌是脚本需要做什么工作,但这只会导致问题——如何得到一个访问令牌呢?吗?

获取访问令牌的一种方法是拥有不同类型的令牌-A。刷新令牌.与访问令牌,刷新令牌持续很长时间。他们只撤销时到期,他们正在取代后刷新令牌,或者当谷歌发飙。为我们的脚本的目的一个刷新令牌就是工作。我有一个刷新令牌后,我可以将它存储在一个比较安全的地方,该脚本可以无需人工干预。然后我可以访问刷新令牌我运行脚本时,作为第一步使用刷新令牌来得到一个新的访问令牌。然后我可以使用脚本的其余部分运行的访问令牌(提供我的脚本不能运行超过一个访问令牌的生命周期——甚至Ruby并不慢)。我不介意得到刷新令牌包括手动步骤,因为我经常不需要这样做。.

在我解释如何刷新令牌之前,还有另一件事。每个刷新令牌(和他们获得的访问令牌)有限授权范围——这意味着你会说他们是允许访问的数据。我可以创建一个刷新令牌,只是阅读我的youtube数据有效。如果坏人得到这个令牌他不能读我的日历数据,也没有修改我的youtube数据。有不同的令牌与不同的范围内帮助我与每个令牌,限制我做什么这让我触摸更安全(少担心我如何安全地存储令牌)。.

刷新令牌,我必须得到一个浏览器登录到谷歌和验证和我自己。像大多数人一样我有永久地登录到谷歌浏览器实例在我的笔记本电脑,这没什么大不了的。我要做的就是去谷歌以这样一种方式构建的URL指定的授权范围,我想要的。如果我这样做,当我登录谷歌账户,google将会给我一个一次性授权代码.然后我把代码和访问另一个URL和谷歌递给我刷新令牌,我想要的。.

在这之前,有一个进一步的我需要做的事情——设置谷歌使用API和允许访问达到我想要的应用程序API访问。这是一个人工任务,但我只需要做一次发飙)(除非谷歌有非常大。.

这是我需要经历的步骤:

  • 建立Google API访问——一次性登录浏览器手动操作
  • 一次性获得授权代码,需要登录浏览器,做的很少
  • 交易的授权代码刷新令牌- API,做的很少
  • 使用刷新令牌来获得一个新的访问令牌- api,做一次每次运行脚本
  • 使用访问令牌只在调用google - api时,每次我叫一个google api来完成的

设置谷歌

使用api和一个谷歌帐号,我需要进入谷歌和设置。我需要的地方谷歌开发者控制台.我已经有了一个项目中定义的控制台,但是你需要做的,如果你不已经有一个。然后我点击了项目,然后点击了API标签(左边)。这说明我的api,并允许我使我希望哪个api。我需要确保API启用我想用Youtube数据API(在本例中)。.

我也需要有一个OAuth客户机ID使用“凭证”选项卡。我已经有一个设置。.


一次性授权代码

获得一次性授权代码需要达到一个特别制作的谷歌网址,登录到谷歌。谷歌将返回授权代码。谷歌的文档,我遇到了各种样品,通过一个web应用程序解释这样做。在你正常的流程,web应用程序实现它需要身份验证,并发送你到谷歌。.

谷歌可以直接返回授权代码到您的web应用程序。所有您需要做的就是运行一个服务器在本地机器上,告诉谷歌URL,例如localhost:1234.谷歌将发布到该URL,包括授权代码作为参数的URL。你的代码就可以轻松地选择参数。你不需要一个网络服务器端口来接这个,它永远需要做的就是应对这一请求。这种程度的简单的服务器甚至不需要辛纳特拉(Ruby的轻量级web服务器框架),我记得很多年前,在一篇介绍性的Ruby类与布拉格戴夫,我们编写了一个简单的web服务器在几分钟内。但我甚至懒得做。.

相反,我所做的是让我的项目工艺必要的谷歌网址和在控制台上打印这个URL。我然后复制并粘贴到浏览器。谷歌(小舞检查后我知道我在做什么)响应web页面上的授权代码。然后我回这段代码复制并粘贴到我的脚本。它不是光滑的自动机制,但是我不在乎,因为我只需要做一次每一个蓝色的月亮。.

让我们来看看我的代码。我把任何简单的命令行脚本分成多个类,分离的类处理命令行交互”引擎”类,在幕后做所有的工作——本质上使用分开表示.我这样做是因为我更容易独立核心代码的命令行当我工作。.

图3:序列图我的代码示例如何刷新令牌。.

命令行,我使用托尔,这是一个简单的ruby框架构建命令行应用程序[2]..

需要“雷神'require_relative”引擎'class CLI <雷神托尔包括:行为def初始化* args超级(* args) @engine =引擎。新结束desc”身份验证”,”脚本”再次授权def身份验证了”浏览器指向下面的URL: \ n \ n”把@engine。authorization_url所说的“\ n \ n”auth_code =问“粘贴在授权代码”@engine。renew_refresh_token auth_code结束
endCLI。开始(ARGV)

托尔地图sub-commands CLI类中的方法,如果脚本的文件名get-vid我可以调用授权逻辑get-vid身份验证..[3]

这种授权逻辑使得两个调用底层引擎,一个url来显示,第二把授权代码粘贴在和用它更新刷新令牌。.

我写了引擎来处理的逻辑去搞youtube,但是这些代码实际上是关于处理谷歌授权。所以我授权代码分离到一个单独的对象,GoogleAuthorizer。引擎在初始化和创建一个授权人代表URL和更新请求。.

类引擎。...

def @auth = GoogleAuthorizer进行初始化。新(token_key:“api-youtube”,application_name:网关Youtube的例子,application_version: 0。1 ')

def authorization_url @auth。authorization_url的https://www。googleapis。com/auth/youtube。只读”结束def renew_refresh_token auth_code @auth。renew_refresh_token auth_code结束

我和三位数据初始化授权人,应用程序名称和版本被用于一些后来API调用,令牌密钥我将很快展开。.

类GoogleAuthorizer

def初始化application_name: nil,application_version:“未知”,token_key: nil @application_name = application_name @token_store = TokenStore。新(token_key)@application_version = application_version结束

构建URL使用ruby的URL处理库

类GoogleAuthorizer

def authorization_url范围params = {范围:范围,redirect_uri:“urn:ietf工作组:oauth:2。0:oob’,response_type:“代码”,client_id: @token_store。client_id } url = {主持人:'账户。谷歌。com”,路径:/ o / oauth2 /身份验证,查询:URI。encode_www_form(params)}返回URI:HTTPS。构建(url)

这段代码构造URL看起来像:

https://accounts。谷歌。com/o/oauth2/auth?范围= https://www。googleapis。com/auth/youtube。只读的redirect_uri = urn: ietf工作组:oauth: 2。0:oob& response_type =代码client_id = 123456789012。应用程序。googleusercontent。com

使它更容易阅读,我已经添加换行空格和解码逃的URL。我也由client_id。.

URL的参数是:

  • 范围:我们想要访问,多少api在这种情况下我们希望只读存取youtube数据api
  • redirect_uri:一般的web应用程序使用这个,谷歌浏览器重定向到另一个URL(通常是本地主机post)和存款其响应。使用这个值告诉谷歌我希望它显示在浏览器中复制和粘贴
  • response_type:我想要一个一次性授权代码
  • client_id我之前得到的交互与谷歌开发者控制台

将该URL粘贴到浏览器(最终)会我从谷歌网页显示了闪闪发光的授权代码。.


交换的授权代码刷新令牌

现在我有授权代码可以发起第二次手术,获得刷新令牌。为此,我再次联系谷歌授权的资源,这次我刚从他们提供的授权代码和混合端秘密,一个代码,确定我到google API。我不需要登录到谷歌的这一步,我也不需要使用一个浏览器。.

在这一点上我不得不面对另一个问题:我在哪里存储刷新令牌一旦我有吗?因为这是我唯一一个使用一个脚本,我可以将它存储在源代码中类似

def refresh_token 1234567890 woxns_gtztcgw3obtkcsokflxdpc5ta7xz4meudvrk5jspor30zcrfq6'end

我不喜欢这个,我喜欢让我的代码库中被广泛复制和经常与他人分享。事实上一般安全建议永远保守秘密存储库的代码树内的任何地方.太容易不小心提交了一个文件和一个秘密,当完成时,这是几乎不可能消除。因为我自然,而粗心大意,我尽量安排的事情所以我不会造成持久的损害不可避免的错误

另一个选择是将源树外的令牌在一个文件中。我的硬盘加密,这就是合理安全——尤其是因为所有我的黑暗秘密保护Youtube观看习惯。如果我被更加偏执可以加密文件,但那只提出了一个问题:在哪里存储的加密密钥文件,因为我不想输入密码每次我使用脚本。.

因为我在mac上运行,我决定使用Mac的钥匙链建成的。这个自动打开,当我登录,我可以访问它安全命令行应用程序。我得想想别的事我应该想运行这个Ubuntu盒子,但我会处理,如果有一天我需要这样做。.

不管我的决定在哪里存储刷新令牌,这是一个决定,和你需要封装迹象之一是隐藏的决定。这就是为什么我创建了一个TokenStore类——隐藏的决定我商店如何刷新令牌。我也可以使用相同的类来存储一些其它的小事情,如client_id我之前使用。client_id是我留在源代码,我相信如果其他人想要使用这个代码可以找出如何拿出来。.

类TokenStore……

def client_id“123456789012。应用程序。googleusercontent。com的结束

重新刷新令牌,我需要使用之前得到的一次性授权代码来请求新的令牌,挖出刷新令牌,并把它放到我的令牌存储。(我说“令牌”,因为谷歌回应一个访问令牌和刷新令牌。)

类GoogleAuthorizer……

def renew_refresh_token auth_code客户= get_client_with_new_tokens(auth_code)令牌=客户端。授权。refresh_token所说的“新令牌:# {牌}”@token_store。save_refresh_token牌结束

这些令牌的请求,我再谈谷歌,但这一次我觉得最好的使用ruby Google api客户端库.我花了一点时间才弄清楚如何使用它,文档是非常缺乏。但还是蛮好用的一旦我掌握它的。获得令牌的代码:

类GoogleAuthorizer。...

def get_client_with_new_tokens auth_code客户=谷歌::APIClient。新(application_name: @application_name,application_version @application_version):客户端。授权=印::OAuth2::客户端。新(token_credential_uri: https://www。googleapis。com/oauth2/v3/token',代码:auth_code,client_id: @token_store。client_id,client_secret: @token_store。client_secret,redirect_uri:“urn:ietf工作组:oauth:2。0:oob’,grant_type: authorization_code)客户机。授权。fetch_access_token !返回客户端

这段代码首先实例化一个google api客户端对象,然后给了它一个授权对象,它使用印库,我还发现记录不是很好。这个属性的组合工作授权令牌

  • application_name:不知道这是如何使用谷歌,但是你需要一个值来避免错误在客户端库
  • application_version:类似的应用程序名称。错过这个没有给我带来错误,但是我还是把它落在作为名称的错误消息告诉我,我需要它。.
  • token_credential_uri:的URL和授权。.
  • 代码:一次性授权代码
  • client_id:早些时候的客户机id与谷歌开发者控制台交互
  • client_secret:你也会从与早些时候谷歌开发人员控制台。谷歌文档表示,这并不是一个真正的秘密这样的应用程序,但他们仍然称之为一个秘密。我认为这是一个增强的标识符。.
  • redirect_uri:我不知道这是什么角色扮演,但当我离开了图书馆失踪grant_type来抽我[4].google文档意味着我应该设置为相同的值,当请求授权代码放在第一位。.
  • grant_type:谷歌告诉我有一个授权的代码,我想赎回的令牌。.

我没有利用HTTPS连接到谷歌,但根据谷歌文档,结果得到的HTTP调用应该是这样的

POST HTTP / 1 / oauth2 / v3 /令牌。1主机:www。googleapis。comContent-Type:应用程序/ x-www-form-urlencodedcode = 4 / v6xr77ewYqhvHSyW6UJ1w7jKwAzu&client_id = 123456789012。应用程序。googleusercontent。com&client_secret = ABC1234567890&redirect_uri = urn:ietf工作组:oauth:2。0:oob&grant_type = authorization_code

fetch_access_token !!方法与谷歌的令牌。谷歌发送回一些JSON图章授权客户端库存储的对象。然后我可以在刷新令牌并将其保存在我的令牌存储。.

类GoogleAuthorizer……

def renew_refresh_token auth_code客户= get_client_with_new_tokens (auth_code)令牌=客户端。授权。refresh_token把“新令牌:# {牌}”@token_store。save_refresh_token牌结束

然后我可以使用令牌存储保存令牌到我的Mac的钥匙链。.

类TokenStore……

def save_refresh_token arg cmd = "安全add-generic-password——# { @keychain_account } ' s ' # { @keychain_account } - w # { arg }”系统cmd结束

我的令牌存储使用当我创造了引擎。.

类引擎。...

def @auth = GoogleAuthorizer进行初始化。新(token_key:“api-youtube”,,application_name:网关Youtube的例子,application_version: 0。1 ')

类GoogleAuthorizer。...

def初始化application_name: nil,application_version:“未知”,token_key: nil @application_name = application_name @token_store =TokenStore。新(token_key)@application_version = application_version结束

类TokenStore……

def初始化keychain_account @keychain_account = keychain_account结束

操作系统命令的签发save_refresh_token

安全add-generic-password——‘api-youtube’s“api-youtube”- w ' ABC123456-other-chars '

系统命令需要一个服务(- s)和一个帐户(——一个当存储一个值。我为他们每个人使用相同的价值,我只是想要一个键值存储。.


使用刷新令牌来获得一个访问令牌

授权逻辑是不寻常的,我希望只调用一次蓝色的月亮。我现在也希望一旦我写它,我不会再乱用,我把它的授权人所以我可以使用这类与任何其他命令行脚本,抓住Google数据。.

我想做的是使用这个设置所有的每一次我想做一些有用的东西,或在这种情况下打印出视频私人播放列表。我开始与托尔CLI

list-vid类CLI…(文件)

default_task:desc列表”名单”,”在我的播放列表”列表项def把@engine列表。list_playlist结束

default_task注释让我运行该命令list-vid没有sub-command和调用列表的方法。.

像往常一样,CLI引擎代表所有的工作。引擎的轮廓的方法非常简单。首先,我用一个简单的散列定义参数要求。接下来,我问一个客户端对象来执行请求,返回一些JSON解析回一个ruby数据结构。最后,我把我想要的数据结构发送回CLI。在这一点上,然而,我想保持关注交换刷新令牌访问令牌。所有这些工作是隐藏在简单的客户端方法调用。.

类引擎。...

def list_playlist = = exec_request playlist_request响应请求(请求)返回响应(“项目”)。地图{ | |我[“片段”]['标题']}结束def exec_request requestHash JSON。解析(客户端.执行!(requestHash)。身体)结束

客户端对象的一个实例我们之前看到Google API客户端,尽管它的配置不同。当执行特定的请求,客户端对象将使用一个访问令牌,但首先它必须使用刷新令牌来获取访问令牌。我第一次这样设置脚本希望使用一个客户端对象,通过舞蹈与谷歌我创建一个新的访问令牌。一旦我做了,我把这个客户端对象的引擎使用再进一步的请求。.

类引擎。...

def客户@client | | = @auth。api_client返回@client结束

所有的业务交换刷新令牌访问令牌是由谷歌的客户端库。我只需要创建一个Google API对象初始化和正确的数据获取访问令牌。.

类GoogleAuthorizer。...

def api_client客户=谷歌::APIClient。新(application_name: @application_name,application_version @application_version):客户端。授权=印::OAuth2::客户端。新(token_credential_uri: https://www。googleapis。com/oauth2/v3/token',client_id: @token_store。client_id,client_secret: @token_store。client_secret,refresh_token:@token_store。refresh_token,grant_type: refresh_token)客户机。授权。fetch_access_token !返回客户端

类TokenStore……

def client_secret @client_secret | | = '安全find-generic-password wa google-client-secret”。chomp @client_secret结束def refresh_token @refresh_token | | = '安全find-generic-password wa # { @keychain_account } '。chomp @refresh_token结束

我现在可以使用Google API返回客户端对象的最后一步。.


当调用Google API使用访问令牌

如果我使用Google API对象在谷歌上打电话时,它确保访问令牌被添加到请求,以及组织请求数据以正确的方式。我所要做的就是使用执行!!方法在客户端对象,传入一个散列数据为我的请求。.

类引擎。...

def list_playlist = = exec_request playlist_request响应请求(请求)返回响应(“项目”)。地图{ | |我[“片段”]['标题']}结束def exec_request requestHash JSON。解析(客户端。执行!(requestHash).身体)结束

因为这篇文章是关于使用Oauth与谷歌,我可以在这里结束。但是因为我也去搞这个谷歌客户端库,并试图找出如何使用它来获取一些数据,我不妨继续就足以说明我退出私人播放列表的标题的视频。.


从Google API获取视频列表

把数据从youtube(或任何Google API)我必须决定哪些资源我想跟什么方法我希望调用资源(他们不说话的HTTP动词)和使用参数参数化。.

谷歌的客户端库提供了一些功能来确定正确的api_method。我可以问客户端对象返回一个API对象知道特定的API。.

类引擎。...

def youtube客户机。discovered_api(“youtube”,v3)结束

这叫discovered_api做两件事。首先它告诉客户端对象联系谷歌和下载谷歌在线API的描述,然后缓存。其次它返回一个新的Google API对象配置了这个信息。由于客户端缓存API描述,我不需要担心缓存youtube API对象自己。(如果我需要跟不止一个Google API,我可以使用discovered_apis方法,这将从谷歌获得多个API的数据在一个电话。)

所以我能做些什么这个Google API对象?遗憾的是它不是显而易见的。只有一个Google API类,这类操作的各种Google api。如果我阅读它的文档(我从当地宝石必须做浏览器在线版本404 d以来我)不告诉我任何关于方法和youtube。188bet足球充值它是各种方法找出更多的细节,我可以调用所以我询问一些ruby调用。首先我撬调用允许我询问运行时对象。.

....

def list_playlist绑定。撬= playlist_request resp = exec_request请求(请求)返回resp(“项目”)。地图我{| | PlaylistTitle。新(我)。标题}结束

我滴到撬REPL。我不使用这么多,所以我不熟练,但我知道我可以调用对象的方法。.

[1]撬(#
      
       )> youtube。描述= > "编程访问YouTube的特性。”[2]撬(#
       
        )> youtube。discovered_methods = > []
       
      

好了,这不是有益的。但我怀疑一些聪明的元编程。.

[3]撬(#
      
       )> youtube。方法= >[:活动,:channel_banners,:channel_sections,:频道,:guide_categories,:i18n_languages,:i18n_regions,:live_broadcasts,:live_streams,:playlist_items,:播放列表,…更多
      

就是这样——Google API并运行时代码生成API对象添加合适的方法。这样一个api类可以支持不同的api,和每个API在运行时可以生成与正是谷歌最新的支持。谷歌应该改变它的API在运行时,我不需要更新客户端库,我只得到一组不同的运行时生成的方法,非常聪明。.

如果你了解我,你就会知道,当我使用“聪明”描述一些编程,它通常不是一种恭维。做运行时代码生成的缺点是,它是一个讨厌我找出方法是可用的。通常,当我想知道一个对象,我可以看一些文档。即使最小的文档我至少可以看看方法是可用的。但在这种情况下我甚至不能这么做——我要无病呻吟撬只是为了得到一个可用的方法调用的列表。这些方法调用不跟文档来解释如何使用它们。.

我的希望是,这些运行时生成的方法对应的Google API描述的更一般的条件。我在这里看到一个方法称为“播放列表”——这是否对应资源在网络API ?吗?幸好这信件保存很好。看来,如果我看到一个谷歌资源命名之类的渠道我可以期待一个google api对象调用运行时生成的方法渠道..

这是所有的,但我怎么列表播放列表的内容吗?每个播放列表在谷歌上都有一个ID,所以我怎么看到物品播放列表”1234”吗?这里重要的是要了解谷歌的youtube data API是如何组织(其他Google API可能是类似的,我没有看起来足以看)。当我们谈论一个HTTP API使用资源,我倾向于想象组织API在URL风格类似于在网络上。如果我想要1234年播放列表的详细信息,我希望一个文档看起来像一个URLyoutube / api /播放列表/ 1234.然后我可以获得文档的HTTP GET。.

但是Youtube数据API不是这样的结构。它有资源,但是这些资源都有自己的方法,这些方法的一些子集”名单”,”插入”,”更新”,和“删除”.我们这里不是通常的HTTP动词”获得“,”邮报》,”把“和“删除”但是CRUD风格的动词[5].关键我意识到把这个API是一组关系表。.

所以找到一个播放列表的内容,我需要知道一个播放列表包含列表项,然后制定的select *从playlist_items playlistId = ' 1234 '

类引擎。...

def playlist_request {api_method:youtube。playlist_items。列表,,参数:{playlistId:“PLJb2p0qX8R_ojWB5Bx4Q6TzaKcLMvsAim”,,部分:“片段”,}}结束

第二件事理解谷歌api的概念部分的资源。完整的数据引用的谷歌这样的资源可以很大,所以减少带宽谷歌优惠资源部分,需要指定哪些部分我想要的。在这种情况下我只是要求片段的部分,因为这将给我的视频标题,我正在找。.

类引擎。...

def playlist_request { api_method:youtube。playlist_items。列表,参数:{playlistId:“PLJb2p0qX8R_ojWB5Bx4Q6TzaKcLMvsAim”,,部分:“片段”,,}}结束

文档列表项给我播放列表项的结构。.

API客户机执行请求时,它返回一个结果对象中含有大量的交互的详细信息。到肉我可以调用的结果身体结果对象上的方法,我会返回的JSON解析到一个ruby数据结构:

类引擎。...

DEF Excel请求ReQuasthasJSON。解析(客户端。执行!(requestHash)。身体)结束
@engine页。exec_request (playlist_request)
# = > {””= > "youtube # playlistItemListResponse”,”etag”= > "\”F9iA7pnxqNgrkOutjQAa9F2k8HY / bLvU5-1d6Q4rcW60TlK-JTVNovM \””,”pageInfo”= > {”totalResults”= > 3,”resultsPerPage”= > 5 },”项目”= >[{””= > "youtube # playlistItem”,”etag”= > "\”F9iA7pnxqNgrkOutjQAa9F2k8HY / 9 bdaiac39a9cxuknu5cr7i2jzlg \””,”id”= > "PL_LBOgO7Mf7ZUfWrfLUl5YJuDy41Yo1j50eP8nIG35Wo”,”片段”= > {”publishedAt”= > "2014 - 01 - 14 t23:09:37。000 z”,”channelId”= > "UC0EbszLD1ceZeAkZ3JEI2GA”,…更多

片段的部分包含一个标题元素,这样我就可以打印出返回列表的标题被挖了一个小的结构。.

类引擎。...

def list_playlist请求= playlist_request响应= exec_request(请求)返回响应(“项目”)。地图我{| |(“片段”)(“标题”)}结束def exec_request requestHash JSON。解析(客户端。执行!(requestHash)。身体)结束

分享:
如果你发现了这篇文章有用,请分享它。我很欣赏的反馈和鼓励

脚注

1:这不是我想做什么,但自从我关注Oauth问题的一部分,我简化了实际任务尽我所能。.

2:在Ruby中有相当多的命令行工具。我没有做适当的调查,但托尔似乎符合要求为我的需求相当不错。它大量的东西我不在乎,但它使这种复杂性为我所需要的简单的事情。.

3:我需要的get-vid文件是可执行的,把相关的事情(# !/usr/bin/env红宝石)的文件。我也有把命令CLI。开始(ARGV)最后让托尔开始命令行处理。.

4:是的,我也认为这是一个不正确的错误消息。.

5:C -创建=插入,R -阅读=列表(“选择“在SQL),U -更新=更新,和D -删除=删除。.

重大修改

2015年1月26日:第一次出版