APIを使う準備

まずはデベロッパーキーを取得しておきます。名前と使用するサイトのアドレスを指定すると、キーが発行されます。

認証

Youtube Data APIでの認証は主に3種類あります。

  1. AuthSub
  2. OAuth
  3. ClientLogin

今回は3.のClientLoginを使います。クライアントマシンから実行するバッチスクリプトとしてコードを書いていたので、Youtubeコンテンツの所有アカウントに紐付けるClientLoginが最適です。

APIにPOSTを送信して、認証トークンを取得します。

require 'net/http'
require 'uri'
uri = URI.parse('https://www.google.com/youtube/accounts/ClientLogin')
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
header = {'Content-Type'=>'application/x-www-form-urlencoded'}
body = "Email=#{email}&Passwd=#{password}&service=youtube&source=#{client_name}"
res = https.post(uri.path, body, header)
token = res.body.split('YouTubeUser=').first.gsub(/^Auth=/, '')

ClientLoginの場合、レスポンスのボディにAuth=xxxYouTubeUser=user_nameというフォーマットでトークンとユーザ名が入ってきます。上記のコードはuglyですがトークンを最後の所で抽出しています。putsで表示した内容をコピーして使用しても良いですが、認証トークンには期限があるので、最新のトークンを取得して以降に使用する方が良いと思います。

sourceの所はアクセス元の名前なので、適当で大丈夫なようです。

動画検索

APIにGETを送信し、特定のユーザがアップロードした動画から、検索キーワードを指定して検索します。

require 'net/http'
require 'uri'
require 'rss'

search_uri = URI.parse('http://gdata.youtube.com/feeds/api/videos')
header = {
    'Authorization'=>"GoogleLogin auth=#{token}", 
    'X-GData-Key'=>"key=#{developer_key}"
}
search_http = Net::HTTP.new(search_uri.host, search_uri.port)
res = search_http.get(search_uri.path + "?v=2&author=#{user_name}&start-index=1&max-results=20&lr=ja&q=#{query}")
rss = RSS::Parser.parse(res.body)

rss.entries.each do |entry|
    puts entry.title.content
end

まずリクエストのヘッダに認証キーとデベロッパーキーを指定します。スペースなどが入る点に注意が必要です。次にリクエストのボディにパラメータを指定します。

  • author => 動画の投稿ユーザを指定できます
  • start-index => 検索結果の開始位置
  • max-result => 検索結果1ページあたりの件数
  • lr => 言語
  • q => 検索キーワード

検索が正常に実行されると、レスポンスのボディにAtom形式でXMLが入ってきます。今回は、これをパースして使うようにしています。XMLの内容については、こちらを参考に。

動画単体の取得

APIにGETを送信し、動画IDを指定して取得します。

require 'net/http'
require 'uri'
require 'rss'

single_uri = URI.parse("http://gdata.youtube.com/feeds/api/users/#{user_name}/uploads/#{movie_id}")
header = {
    'Authorization'=>"GoogleLogin auth=#{token}", 
    'X-GData-Key'=>"key=#{developer_key}"
}
single_http = Net::HTTP.new(single_uri.host, single_uri.port)
res = single_http.get(single_uri.path + "?v=2&author=#{user_name}&start-index=1&max-results=1&lr=ja&q=#{query}")
single = RSS::Parser.parse(res.body)

puts single.title.content

URIにユーザ名と動画IDを指定します。注意はXMLをパースしたときに、ルートノードがentryになる点です。

エントリーの更新

APIにPUTを送信し、動画に関する説明やカテゴリ、タグなどを更新します。

require 'net/http'
require 'uri'

upload_uri = URI.parse("http://gdata.youtube.com/feeds/api/users/#{user_name}/uploads/#{movie_id}")
upload_http = Net::HTTP.new(upload_uri.host, upload_uri.port)
upload_header = {
    'Authorization'=>"GoogleLogin auth=#{token}", 
    'X-GData-Key'=>"key=#{developer_key}",
    'Content-Type'=>'application/atom+xml; charset=UTF-8'
}

xml <<-EOS


  
    #{title}
    #{description}
    #{category}
    #{keywords}
  

EOS

res = upload_http.put(upload_uri.path, xml, upload_header)

XML内で値を指定する場合に注意することがあります。

GithubでもRubyベースのGoogle Data API向けのモジュールは多数あるので、そちらを利用しても手軽に利用できると思います。