ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】 Radiko を再生する自動操作の画像認識を FindText に変えてみた

目次


f:id:yasushiito:20190403184928p:plain


これまでの経緯。

ブラウザで Radiko ページを表示させて再生ボタンをクリックする自動操作をタスクスケジューラから呼び出すことで、 毎晩お気に入りの番組を人力操作なしで聴取しています。
Radiko の web ページでは、ライブとタイムフリーで操作手順が変わるので、それぞれに対応した自動操作の処理を用意しました。
少しずつ改良を重ねて、今聞いている番組をTwitterでシェアする操作も自動でできるようになりました。


yasushiito.hatenablog.com
yasushiito.hatenablog.comyasushiito.hatenablog.com

今回の目的。

先日画像認識ライブラリの Find textの使い方を習得したので、こちらに切り替えたいと思います。
Radiko の web ページではテーマカラーが決まっていて、ライブの時は青、タイムフリーの時は赤、で表示されるので、 Find Text に切り替えることで、操作に必要な画像サンプルを減らすことができます。
また、ライブとタイムフリーで処理を分けなくても済むので、コードもシンプルにできます。

実装結果。

自動操作の手続き。

全体像はこんな感じになりました。

各部の動作素材。

パラメータから指定番組の URL を生成します。
グローバル変数の領域から今回の操作手順と必要なサンプル画像のエンコード文字列を読み出します。
グローバル変数から取ってくると言うけど、いつ誰が初期化しているんだよ?と言う謎は後ほど。

    ;再生ボタンなどのクリックしたい部分の画像サンプルをテキスト化したデータを取得する。
    ;操作手順は、再生する、友達に教える、 Twitter アイコン、 Tweet Button、シェア画面を閉じるX。
    ;ただしタイムフリーの場合は再生ボタンの後に OK ボタンをクリックする。
    global TextImages
    btnplay := TextImages["RadikoPlay"]
    btnok := TextImages["RadikoOk"]
    btnstop := TextImages["RadikoStop"]
    btnshare := TextImages["RadikoShare"]
    btntwittericon := TextImages["RadikoTwitterIcon"]
    btntweet := TextImages["RadikoTweet"]
    btnclosex := TextImages["RadikoCloseX"]

myahk/radikoplay.ahk at master · yasushiito/myahk



画像を探してクリックする関数は以前に作成しました。
番組の URL を Microsoft Edge で開いて、再生ボタンをクリックさせます。タイムフリーの場合は確認ウィンドウで OK します。

        ;ボタンを探してクリック。
        r := ClickImage(btnplay, 2000)
        ;ボタンクリックに成功していたらループを中断。
        if r
        {
            ;タイムフリー再生の時注意喚起ウインドーの OK ボタンをクリック。
            if onairdate
            {
                r := ClickImage(btnok, 2000)
            }
        }

myahk/radikoplay.ahk at master · yasushiito/myahk


ページを開くのに時間がかかって再生ボタンの検出に失敗することもあるので、 再生が始まってボタンが一時停止になっていることを確認して成功とします。
一時停止ボタンをクリックしてしまうと再生が止まってしまうので、画像を探すだけでクリックしないようにしています。

        ;再生するボタンを探して再生されたことを確認する。
        ;マウスポインタの位置によってはスクロールしてしまってクリックミスすることがあった。
        Sleep, 6000
        if (ok:=FindText(0, 0, A_ScreenWidth, A_ScreenHeight, 0, 0, btnstop))
        {
            Break
        }

myahk/radikoplay.ahk at master · yasushiito/myahk


失敗した場合は3回リトライします。


ここから先の操作はおまけ的なものですが、友達の教える機能で番組をtweetして再生ページに戻ります。
レスポンスの遅い操作には長めのウエイトを入れています。

    ;ここからは友達に教える機能の Twitter 連携。
    ;操作手順は、友達に教える、 Twitter アイコン、 Tweet Button、シェア画面を閉じるX。
    ClickImage(btnshare, 3000)
    ClickImage(btntwittericon, 1500)
    ClickImage(btntweet, 3000)
    ClickImage(btnclosex, 1500)

myahk/radikoplay.ahk at master · yasushiito/myahk

サンプル画像の読み出し。

後回しにしたグローバル変数を初期化する部分です。
Image SEARCH コマンドでは画像ファイル名をパラメータに与える方式でしたが、 FindTextでは画像をエンコードした文字列を与えます。
文字列はスクリプトの中に埋め込んでも可読性を損なわない程度の長さなので、 スクリプト上で管理します。
像を BMP ファイルなどで個別に管理するよりも楽だと思います。
ファイル IO 処理をかかなくてすむし。
ただし、 エンコード文字列が各自動操作プログラムの中に散乱してしまうと汎用性が無くなりますので、 それらをまとめてグローバル変数に叩き込む 関数を用意します。
オブジェクトのキーの先頭にRadikoがついているグループを今回使います。

自動操作の実行。

再生処理は関数になっていますので、それを呼び出すのはこんな感じです。
事前に画像サンプルをエンコードした文字列をグローバル変数として初期化して値をセットしておくことを忘れずに。
Find Text を利用する全てのスクリプトで行う必要があります。
終了するときは ExitApp を使わないと完全に終了できないんでしたっけね。

この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら