Help us understand the problem. What is going on with this article?

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でも使えました)

余談

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

itkr
おひさま
http://itkr.github.io
colorful-board
「すべての人々に、人生が変わる出会いを」をビジョンとして、これまで出会えなかった情報と瞬時に出会うことで人々の生活をより豊かにする、新しい情報発見のためのプラットフォームを目指しています。
https://sensy.ai/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした