Edited at

cronとPythonとSeleniumとで決まった時間にラジオを聞く

More than 1 year has passed since last update.

家にいるときは朝からラジオを聞くことが多いので、目覚まし代わりにラジオを再生するようにしたいと思います。時間を指定してラジオをつけようと思うと数千円出して新しい機器を購入したりアプリを入れたりということが選択肢としてありますが、こちらの記事によるといろいろ苦労もあるようです。

→「ラジオで爽やかに目覚めたい! だけなのに、けっこう大変だった話。ソニーの電球スピーカー&ラジオ

そこで、自分の家にはUbuntuを入れているインテルのNUCがあることを思い出し、cronを使ってradiko.jpからラジオを再生すればいいと考えました。

(以下はChromeを使うことを前提にしています。)


Seleniumでradiko.jpにアクセス

こちらの記事のようにCUIからradiko.jpのコンテンツ操作する方法は結構あるようです。

→「CUIなサーバーだけでradikoを聞きたい!

ただradiko.jp内のリソースに直接触れる感じになるのが若干気が引けたというのと、より簡単な方法で実行したいという気持ちがあったので、UIテストのときに使われるSeleniumを用いてradiko.jpの再生ボタンを押すという方法を選択しました。


Seleniumの準備

Seleniumはこちらを参考にしました。

→「PythonでSeleniumを使ってスクレイピング (基礎)


ドライバ取得

上記の参考記事に従い、seleniumのインストールと使っているOSやブラウザのバージョンにあったドライバの取得をします。

https://www.seleniumhq.org/projects/webdriver/

e.g.

wget https://chromedriver.storage.googleapis.com/2.40/chromedriver_mac64.zip

unzip chromedriver_mac64.zipwget


Selenium インストール

pip install selenium


Seleniumでラジオを再生

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from time import sleep

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

class Radio(object):

def __init__(self, driver_path, url, options=None):
self.driver = webdriver.Chrome(driver_path, chrome_options=options)
self.driver.get(url)

def play_or_stop(self):
self._play_button.click()

def exit(self):
self.driver.quit()

@property
def _play_button(self):
return self.driver.find_element_by_class_name('btn--primary')

def __enter__(self):
self.play_or_stop()
return self

def __exit__(self, exc_type, exc_value, traceback):
self.exit()

def main():
options = Options()
options.add_argument('--headless')

with Radio('/path/to/driver', 'http://radiko.jp/#!/live/TBS', options):
sleep(360)

if __name__ == '__main__':
main()

詳しい説明は省きますが、ポイントは再生画面の再生ボタンを特定してclick()を実行していることです。また、スクリプトが終了した時点でwebdriver.Chromeのオブジェクトが破棄され、ブラウザが閉じてしまうのでsleep(360)として一時間ラジオが鳴っている状態にしています。--headlessはChromeの画面を表示せずに実行するオプションで、後述する理由により追加しています。

実装: https://github.com/itkr/my-radio


cronの設定

実行するPythonやドライバのパスに注意しながら普通にcronを設定します。cron自体の説明は省略します。


Headless Chrome を使う理由

Ubuntuで実行した際、cronからだと--headlessオプションを付けないとうまく起動してくれませんでした。また、Macではブラウザの表示はされましたが音が出ない場合がありました。(原因は追えていません)


コンピューターを休止させておいきたい場合

ずっと動かしているコンピューターならいいのですが、スリープや休止状態にしている場合cronがうまく動かない場合があります。そこでrtcwakeというコマンドで復帰する時間を操作できるようです。参考→「【備忘録】毎日自動的に休止→起動する(CentOS 6.6)」(Ubuntuでも使えました)


余談

タイトルは毎朝聞いている「伊集院光とらじおと」をちょっとだけ意識しました。