APIを使う準備
まずはデベロッパーキーを取得しておきます。名前と使用するサイトのアドレスを指定すると、キーが発行されます。
認証
Youtube Data APIでの認証は主に3種類あります。
- AuthSub
- OAuth
- 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向けのモジュールは多数あるので、そちらを利用しても手軽に利用できると思います。
[concrete5.6] ローカルで作成したDesigner Content Proのブロックを本番へ移行する
2016年3月24日
cocrete5の強力なプラグイン、Designer Content Proで作成したブロックをローカルから本番環境へ移行するためのポイントを備忘録としてまとめました。
0 Comments1 Minute
[WordPress]寄稿者ユーザーに他者の投稿を表示させない方法
2015年4月9日
寄稿者ユーザーに他者の投稿を表示させない方法について備忘録としてまとめました。フィルターフックとアクションフックを併用して、管理画面の投稿一覧に関する表示制御を行っています。
2 Comments1 Minute
OSX Marvericks にアップデートしたら MAMP PRO が動かなくなった
2013年11月2日
OSX Marverics(以下、Marvericks)になって、便利な機能も増えましたが恒例のごとく「今まで動いていたものが動かない!」というケースも発生したりします。今回は、MAMP PROがそれになったので対処法をメモとして残しておきます。
0 Comments1 Minutes
Guard + Compass + Foundation で環境構築メモ
2013年7月5日
フロントエンド開発でもCUIベースでのビルドツールが充実してきています。RubyベースのGuardで複数のリソースを扱う方法についてメモをまとめました。
0 Comments1 Minutes
HTTPでXMLを送信したら、The Processing Instruction Target Matching “[xX][mM][lL]” is Not Allowed
2013年2月27日
Rubyで次々とXML送信するバッチスクリプトを書いていたところ、Net::HTTP#putの利用時にステータス400。ふたを開けてみると、なんということはない内容でした。
0 Comments1 Minute
Sublime Text 2 + MAMP + Xdebug でPHPデバッグをする方法
2012年12月18日
Sublime Text 2(以下、ST2)がすっかりメインエディタに定着したのですが、デバッグ環境が未整理でした。そういえば・・・と思って探してみると、やはりプラグインがありました。ST2とMAMPによるPHPデバッグ環境の導入方法を解説します。
0 Comments1 Minutes
IE9でprototype.js + Shadowbox.jsを使う場合のメモ
2012年6月5日
IE9なら、モダンブラウザに近づくから面倒なIE対応は減るはず、というのは幻想で余計に手間が増えるケースもあります。今回は限定されたシチュエーションですが、JavaScriptライブラリを使う場合の対応をまとめました。
0 Comments1 Minute
[FuelPHP] taskでRailsライクなseedを作る
2012年2月22日
FuelPHPを使い始めているのですが、良いと評価できる点にコマンドラインから実行できる便利なタスクがあります。Railsではrake, railsというコマンドで各種タスクを実行でき、それを踏襲しています。今回はその中でも初期データ作成に便利なseedという機能をFuelPHP上に作ってみました。
0 Comments1 Minute






