YouTubeの再生履歴を自作音楽ログMlhiに記録する件。昨日はちょっと頑張ればできると思っていたのだが、意外に手強くて、考えた方法はほとんど使えないことが分かった。昨日考えた案と試した結果を以下に示す。

  • Scrobblerを改造し、再生したYouTubeのIDを記録サーバに送信するようにする。
    • Firefoxのアドオンは「署名」(Mozillaの承認が要る)しないとインストールできない(一時的には可能)し、変更のたびに署名が要るので、気軽にちょっと改造したものを使い続けるのは難しい。
  • PCのホストテーブル(/etc/hosts)やDNSを変更してscrobblerのデータ送信先のホストを自分の記録サーバにすげ替える。
    • すげ替えたサーバが使うTLS(SSL)の証明書をちゃんと作り、ブラウザにも設定しないと、エラーになってしまう。
    • 記録サーバはLast.fmのscrobbleサーバの動作を模擬しないといけない。
    • 後述のように、scrobblerはYouTubeのIDを送信しないので、そのままでは使えない。
  • HTTPSのプロキシを使い、YouTubeへのアクセス時にYouTubeのIDを記録サーバに送信する。
    • 上と同じく、TLS(SSL)の証明書の問題がある。
    • プロキシで、HTTPSの暗号化されたメッセージを一旦復号してYouTubeのIDを抽出し、再度暗号化する("MITM"や「インターセプト」と呼ぶようだ)ため、セキュリティ上のリスクがあるし、負荷が増大する可能性もある。
      • そのため、YouTubeへのアクセスだけにプロキシを適用するような設定が要る(これはアドオンでできそう)。
  • ブラウザのリクエストログ中からYouTubeへのアクセスを抽出して、YouTubeのIDを記録サーバに送信する。
    • ブラウザのすべてのアクセスのログを記録するのは、負荷が増大し、ログのサイズも大きくなるので、得策でない。また、セキュリティ上のリスクになる。
    • アクセスをフィルタリングして記録できるようなアドオンは見つからなかった。

試している途中で浮かんだアイデアは、scrobblerはそのまま使ってLast.fmに送り、Last.fmから履歴を取ることである。これだと、YouTubeだけでなく、スマフォを含むSpotifyの履歴も取れる。ただし、それぞれの元サービス(YouTube/Spotify)が分からず、各サービス固有のトラックIDも取得できないので、そのままでは不便だ(履歴に入っているトラックが「何」なのか特定できない)。

Scrobbler(試したのはWeb scrobbler)はそれほど多くの情報をLast.fmに送信せず、送信する情報を追加することもできない。特に、YouTubeのIDを送信しないので、そのままでは使えない。改造して送信するにしても、Last.fmにはそういう追加情報を格納する領域はない(いろいろ試したところ、アルバム名にIDを追加するのが良さそうだった)。また、アドオンを改造すると署名の問題があるので、これも今ひとつだった。

他に、力技でYouTubeの再生履歴ページをスクレイピングすれば履歴を取れそうだが、スクレイピングプログラムでGoogleの認証をパスする必要があり、それを容易にすること(「アプリパスワード」でできそうだ)は、僕のGoogleアカウントのセキュリティ上のリスクになりそうだ。それを許容しても、Googleがページレイアウトを変えらるたびにスクレイピングの修正が要るので、得策でない(やってられない)。 → ちょっと試したら、これもできなかった。やっぱり意地の悪いことに、本文(履歴)が別のファイル(すぐには分からない)に入っているようで、スクレイピングの前段階のデータ取得すらできない。なんでこんな下らないことするかな。連中は余程暇なのか、アフォなのか、意地でも履歴を渡したくないのか・・・ (20:19)

結局、何とかできそうなのはプロキシを使ってHTTPSを傍受する方法しかなさそうなことが分かり、面倒なので力尽きた。APIが使えれば、本当に「ちょっと」やればできることなのに、Googleの意地悪のためにすごく迷惑している。。。

(7/22 18:54) HTTPSのMITM対応のプロキシを使う方法で何とかできそうだ。いろいろなプロキシソフトがあるのだが、mitmproxyが一番楽だった。これは、他のソフト(受信用と送信用にプロセスが2個要る)と違って、1つのプロセスだけでHTTPSなどを傍受することができる。ブラウザへの証明書のインストールもリンクのクリックでできるので楽だった。また、同梱のmitmwebはwebで表示・操作できるので手軽だ。

試行錯誤して(→ 参考1, 参考2: これらのページのおかげでmitmproxyが使えるようになった)、とりあえず、YouTubeの再生開始要求をキャプチャできることが分かった。

再生開始要求は以下のようなパターンで抽出できそうだ(XXXXXXXXはYouTubeの動画ID)。

GET https://www.youtube.com/watch?v=XXXXXXXX&...

なお、セキュリティリスクの低減と負荷を下げるため、Firefoxのプロキシ設定アドオンSwitchyOmegaで特定ホスト(この場合はYouTube)のみプロキシを通すようにした。なお、SwitchyOmegaに設定するプロキシのプロトコルは"HTTP"にする必要があった。mitmproxyの設定でも変えられるのだろうが、"HTTPS"や"SOCKS4"などでは正常に動かなかった。また、同様な方法で動画データも取れそうだが、それにはもっと簡単な方法があるし、どうでもいいw

あとは、mitmproxyのスクリプト機能(Pythonで書く)を使って、再生開始要求中のYouTubeのIDなどを抽出し、動画情報(タイトルなど)をYouTubeから取得して、日時とともにMlhiに記録するようにすれば良さそうだ。まだやることは結構あるが、峠を越えた感がある。 ← 今ココw

  •   0
  •   0

コメントを書く

名前    

メール 

URL