ぺんちゃん日記

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

Chrome で URL を取得するために最適な Chrome Extension を見つける。【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

これまでの経緯。

Autohotkey から Google Chrome の URL を取得して自動操作するスクリプトを作っています。
Google Chrome の仕様変更により JavaScript の空撃ちによる入力フォームへのフォーカス戻しが不可能になりました。
やはりここはどうしても妥協できないので何とかして編集フォームからフォーカスを動かすことなくページの URL を取得したいものです。

実現可能性が一番高そうなのが Chrome Extension を導入です。
現在使っている Chrome Extension がワンキーでクリップボードにコピーできて ですが便利なのですが、。機能不足でキー入力を取りこぼしているだけかもしれません。
入力フォーム上ではキーボードショートカットを Chrome では実行できない仕様になっているのだと思い込んでいましたが、色々弄り回しているうちにはてブ Extension だと普通にポップアップが開いてくれます。
ということは不可能ではないということ。

はてブツールバーのキーボードショートカットの設定はどこでやったっけ?
すっかり忘れてしまったのでスクリーンショット付きで説明するよ。

Chrome のメニューを開いてその他のツールの中から拡張機能を選びます。

f:id:yasushiito:20190624091143p:plain
f:id:yasushiito:20190624091213p:plain

左上のメニューアイコンからキーボードショートカット選んで各エクステンションに割り当てられたキーボードショートカットを一覧できます。

f:id:yasushiito:20190624091306p:plain
f:id:yasushiito:20190624091331p:plain
f:id:yasushiito:20190624091403p:plain

きっとクロームにお願いして特定の組み合わせのキーが入力されたら通知してもらうような仕組みを利用していればエクステンションを起動できるのでしょう。
Copy URL+はここに表示されないところを見ると、自前でキー入力をフックしているのかな?

ここまで事情が分かれば後は対応したエクステンションを探すだけです。

要求通りのエクステンション。

いくつかの URL 取得を行うChrome Extension を試してみた結果、 Copy All Urlsが要求通りの仕様で実装されていました。

chrome.google.com

defaultの動作では開いているすべてのタブの URL を一気にコピーします。
さすがにそれでは使いにくいので、設定を 現在のタブだけコピーするように変更します。

設定ページは Chrome の右上のアイコンをクリックしてメニューからオプションを選びます。

f:id:yasushiito:20190624093559p:plain

f:id:yasushiito:20190624093625p:plain

設定ページが開きます。

f:id:yasushiito:20190624093702p:plain

Copy highlighted tabs onlyの項目をチェックして選択中のタブだけに限定します。
f:id:yasushiito:20190624093842p:plain

mime Type の選択ボックスではplain Textを選ぶことで URL だけをクリップできます。
f:id:yasushiito:20190624093907p:plain

初期状態でキーボードショートカットを割り当てられています。
ALT + C でクリップボードにコピー、 ALT + V でペーストです。
キーの割り当てを変更するには、上の方で説明した Chrome のキーボードショートカット設定を開いてくださいね。
f:id:yasushiito:20190624091403p:plain

コードの修正。

キーボードショートカットの動作が確認できたところでAuto HOT key スクリプトを修正します。
ブラウザの URL を取得する処理はすべてgetbrowserurl.ahkにまとめられています。
URL バーにフォーカスを移してコピペするまでもなく、一発キーボードショートカットを送信するだけ。

ただし URL の末尾に改行コードがついているので削除しなければなりません。
本来は複数(全て)のタブの URL を取得するためのエクステンションなので、 URL が区切られているのは当然であります。
本音を言えば URL が一つだった場合は改行を入れないようにして欲しかったところですが……。

これで ALT + C を入力すれば Chrome で表示したページの URL をクリップボードにコピーできるようになりました。

最終確認。

ブラウザから URL を取得するスクリプトは様々なシーンで呼び出されます。
Firefox のタブを選択する場合にも利用されます。
ということは、 Firefox 側でも同様のキーボードショートカットで URL をコピーできなければなりません。
もし Firefox に同等機能のアドオンがなければ、スクリプト Chrome 用と Firefox 用に分けなければならないかもしれません。
それは結構修正の手間がかかります。
できれば避けたいので気合を入れて Firefox アドオンを探してみます。
ありがたいことに? Firefox のアドオンCopyTabTitleUrlが既にインストールされており、同じように ALT + C で URL をクリップボードに転送してくれるように設定できています。
と言うか多分昔自分でやったんだな。
全く記憶にないよ。

addons.mozilla.org

終わってみて。

既存のスクリプトが突然動かなくなってめちゃくちゃ焦りましたが、 なんとか克服することができました。
しかも操作手順が少なくなったおかげで URL による探索の速度が大幅に改善されました。
いくつものソフトウェアをインストールして設定を弄り回しては削除するという繰り返しにうんざりしましたが、最終的にはその作業が一番の近道だったということですね。
ソフトウェアの選定は面倒くさがらずに入念に行いという知見が得られました。

Facebook メッセンジャーのクリック処理が動かなくなっているので修正する【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

バグ発見。

先日 Facebook メッセンジャーのメッセージ入力欄にフォーカスが当たってなくてコピペに失敗する問題を画像認識によって解決したのでした。
これで動いたと安心したのですが、今日触ってみるとやっぱり動いてない。

原因を探る。

きっと画像の認識精度だろうと画像を切り抜きなおしたり色に幅を持たせたりしたのですが、原因はそいつではなかったらしく問題は解決しません。
次に思い当たる点はパスの問題でファイルが見つからないことでしょう。
特に画像探索のパラメータで与えているファイル名に非常に不安がある。
しかも本番環境は日本語を含むディレクトリに入っているので一層の不安が。
そこでファイル名をちょこちょこ修正しては実行を繰り返し問題を探ります。


ファイル名の端にダブルコーテーションを足したり引いたり様々なパターンで試してみましたが結果は芳しくありません。
ディレクトリのダブルクォートの問題であることを切り分けるために ディレクトリは一切指定しないで試してみます。
ディレクトリが指定されてない場合、おそらくは作業ディレクトリを参照するでしょう。
スクリプトはeltestによって起動されているので、作業ディレクトリはその実行ファイルが置いてあるところだと思います。
そこに画像をコピーしてスクリプトを実行してみると大当たり。
スクリプトは期待通りに動作しました。

そこでeltestのボタンを経由しないでエクスプローラから起動してみます。
これなら作業ディレクトリはスクリプトディレクトリになっているはずです。
このパターンでも成功したので、解決への近道は作業ディレクトリからの相対パスでファイル名を渡すことでしょう。

これを突き止めるまでに多分2時間くらい溶かしました。
もう疲れたよ。

修正する。

原因と対策が分かってしまえば修正はそれほど難しくありません。
画像はスクリプトディレクトリの下にimagesディレクトリが用意してあるので、その中に収められています。
そこで作業ディレクトリをスクリプトディレクトリに置き換えて 画像認識処理を実行します。

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

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

Chrome のバージョンアップによりいくつかのスクリプトが動作しなくなった【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

トラブルは突然に。

AutohotkeyChrome を操作しているときになんか Chrome がおかしな動きをするなと違和感を覚えていたのですが、昨日とうとう大問題が発生しました。
タブを探索する処理が終わらなくて延々とタブ切り替えと URL のコピーが行われてしまうのでした。
探索から脱出するための処理は組み込んであったのですが、それが正常に動作しなかった模様。
Chrome 以外のアプリケーションに切り替えても情け容赦なくキー送信を続けるのでいろんなアプリケーションが無茶苦茶になりました。
何よりスクリプトを止めることができない。
そして Windows を再起動することもできない。
一体何が起きているんだ?
こんな時に限って普段は起動しているはずのタスクマネージャーも起動してません。
タブ切り替えの処理は Ctrl +aの後に Ctrl + C 繰り返しているから、下手なアプリケーションに切り替えたら大量にコピーが出来上がってしまう恐れもあります。
なんとか脱出できる方法はないものだろうか。
Auto HOT key って怖いな。
こんなにも簡単に PC を操作不能に陥らせられるんだ。
今更な感想過ぎます。
ひたすらキー入力を繰り返さ様を眺めるだけの時間が過ぎ去りました。
復旧のきっかけはメッセージボックス。
メッセージボックスを表示している間はキーの送信が止まるんです。
ただし メッセージボックスは10秒程度で消えてしまうのでその間に脱出操作をします。
一瞬の隙をついて作業ウィンドウを開いてしまえばタブの探索は終わるので脱出できます。
本当に危なかった。

原因を探る。

URL を取得する際に入力フォーカスが URL バーにうつされるのですが、ここで入力フォーカスが失われてしまいます。
そこでURL バーから安全に Web ページ側に入力フォーカスを移す方法として、 URL バーに javascript: と入力する方式を採用しているのでした。

yasushiito.hatenablog.com

Chrome のアップデートにより、この操作が許されなくなりまして、私はロボットではありませんページが開いて、チェックに対応しなければ先に進ませてもらえなくなってしまいました。
ページ遷移してしまうため URL が書き換わってタブが一周してきた事を判定できなくなっていたと。
そのスクリーンショットを撮ろうとしましたが、今日現在ロボットではありませんページは表示されなくなっています。
問題多発で再度修正したのかな?
現在の仕様では、単純に javascript を検索ワードにしたウェブ検索になっています。
URL から JavaScript を実行できるという仕様自体が問題あったんですね。
これは仕方ない。

対策を考える。
とりあえずタブを探す処理は永久ループにしないで、一定回数を経過したら脱出するようにしました。
人間の操作を肩代わりしてくれるスクリプトなんだから100回を超えるループはおかしい。
これからは他の処理も含めて永久ループはやめて必ず脱出できるようにしよう。
もう一つ、入力フォーカスを戻すための URL バーに対する JavaScript の空打ちも中止します。
ブログ編集作業が面倒になるが仕方がありません。
抜本的な対策は後に回します。

今回のトラブルを受けて。

自分が作業している目の前で発生したので 状況の確認と操作手順は確認できていましたが、これがもしお客さんに渡したスクリプトがリモート先で暴れたらと想像すると背筋が凍ります。
特にメールソフトの Thunderbird では受信ボックスのメールが全部アーカイブされてしまって泣きそうでした。
あちこちクリックしている間にサンダーバードにフォーカスを移してしまったので、そちらにキー操作を送信しちゃったのでしょう。
まだアーカイブで助かったな。
メールを全削除されてしまったら泣けてしょうがない。
安全を考慮するならウインドウハンドルを見張って他のアプリケーションには操作を送らないチェックを噛ませた方が良いかもしれない。

100年後に残したい!?平成の昔話、妖怪の話。

スカッとジャパンってバラエティ番組あるじゃないですか。
初めて視界の隅に入った時には結構イライラしました。
ちょうどその頃 TwitterFacebook で 「いいね」稼ぎするために小話をでっち上げるブームが来ていたのでした。
嘘とも本当とも言えない話がフォロイーによってにtweetされるたびに繰り返し露出されるのだから、いくら良い話であってもうんざりですよね。
それをネット内だけでなくテレビ放送でも見せつけるとなればとんでもない露出狂ですよ。

ja.wikipedia.org

話の構成はマナー違反や迷惑行為を繰り返す不届きものを善良な市民が機転を利かせて懲らしめるってやつです。
中には本当の話もあったんでしょうけど、あまりにも見えすぎた話が多すぎたので 真偽を確認するための真偽マン、確認もせずにレッテルを貼る嘘松までセットになってブームになりました。
きっとそのブームを受けてお金の匂いを嗅ぎつけて生まれたのがこの番組だと邪推しております。

dic.nicovideo.jp

ところがこの番組が始まって以来、予想外の副産物が生まれました。FacebookTwitter からこのような話がガクッと減ったのです。
ネットでいいねをもらうよりテレビで放送されて賞金をもらった方がいいもんね。
回数を重ねるごとに作品投稿のクオリティが落ちてきて誰がどう見ても作り話にしか見えないものが増えてきました。
それをフォローするために出演する役者が過剰な演技をすることになり、より一層作り話感が増しました。
最終的には役者がどれだけイラつく演技ができるかを競い合うようになって、話の本題よりも演技力を楽しむ番組になってきたのです。
ここまで来ればイラつく理由は何もありません。

それにしてもこの番組に登場する「厄介者」の利用者が完全にパターン化されてません?
まるで子供の頃に読んだ妖怪の話や昔話などにフォーマットがそっくりです。
ゲゲゲの鬼太郎に出てきても全く違和感がない。
妖怪ってきっとこうやって生まれたんだなあ。
江戸時代の妖怪の話を聞いても、我々にとっては生活習慣が違いすぎて実感がピクリともわきませんが、スカッとジャパンに出てくるような妖怪であれば実にすんなりと入ってきます。
そろそろ妖怪の世界も現代社会に合わせて再編すべき時代に来たのかもしれませんね。
きっと100年後には、この番組から派生した現代妖怪が語り継がれていて、研究家がこの番組を掘り起こしているに違いないと想像するのです。

画像認識による自動操作で Radiko ガジェットをキーボードショートカットから操作できるようにする【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

これまでの経緯。

Windows 版 Radiko ガジェット試してみてキーボードショートカットに対応していないので 使いづらいなあと言う話がありました。

そこでsiklix を使って画像認識による自動操作で使い勝手を改善しようとしました。
しかし自分のスキル不足なのか動作がゆっくりしすぎていて快適とは言えない操作感だったので結局お蔵入りになったのでした。

使い慣れたAutoHotkeyならどうか。

開発体制が徐々に整いつつあるAutoHotkeyで、いよいよ画像認識による自動操作までできるようになってきました
そこでAutoHotkeyならどこまで行けるかチャレンジしてみます。

再生までのボタン操作の段取りは以前作ったものと同じように行います。
AutoHotkeyには画像認識に特化した機能が備わっていないので少々ゴテゴテした実装となります。
手順としては次のようになります。

  • radiko ガジェットの ウィンドウをアクティブにする。
  • アクティブウィンドウのサイズを取得して Radiko ガジェットのウィンドウサイズを画像探索の範囲とします。
  • 画像が見つかった場合は発見した領域の左上の座標を返してもらえます。受け取った座標はウインドウの左上からの相対座標です。
  • 必要ならマウスポインターを受け取った座標に移動させます。

アプリケーションが見つからなかった時に起動する処理は割愛します。
このスクリプトを使う時は事前に起動しておいてくださいね。

画像探索部分はどこまで曖昧に認識してくれるか分からないので放送局を三つほどに増やして期待通りに画像認識できるか確認してみます。
三つの放送局から任意に選択できなければならんので、 WIN キー+functionキーで放送局を選択することにします。
F1で TBS ラジオ、 F2で文化放送、 F3でニッポン放送を選択できるようにします。

実装する。
いくつかの機能を関数にまとめてみましたが、どうしても画像認識周りで重厚な見た目になりますね。
使っているうちに洗練されたコードが組めるようになってくると思います。
だったらいいな。
放送局の選択で画像認識がうまくいかなかった時に永久ループになることだけは避けたかったのでループの回数が一定に達すれば諦めて処理を中断するようにしています。
一定回数として設定している30には何の根拠もありません。
多少ミスっても2周回ればなんとかなるやろ程度です。

放送局を認識するためにスクリーンショットから放送局のロゴを切り取って BMP 形式で保存します。
JPEG 形式 png 形式にも対応できますが、認識精度の点で不安があります。
と言うか JPEG ではうまくいきませんでした。
ロゴを大きく切り取るほど NG 判定される面積も大きくなって認識失敗するので特徴的な小さな画像を切り取る以外は信用ならないと考えた方が良いです。
操作ボタンについては以前撮影した png ファイルで対応できました。

使ってみる。

使ってみた様子を動画に撮影してみました。

スクリーンキーボードも動画に含めてfunctionキーを押しているところを確認できるようにしました。
文化放送ニッポン放送 TBS ラジオの順番に選択しています。
ちょっぴり音声が入ってしまってラジオコンテンツを再配布しちゃっているのはごめんなさい。
ボリュームを絞って消そうかと思いましたが、ボリュームのつまみがスピーカーのアイコンにかぶってしまって判定できないことに気がつきました。
今この瞬間は直す気力がない。
放置されたバグってやつです。
右方向にしか放送局を変えられないので一周回ってくるケースではまどろっこしさを感じます。
特に Radiko ガジェットを起動直後は放送局のロゴをダウンロードできていなくて表示できない時間がしばらく続くんですが、この際にロゴが見つからずに空回りすることがあります。
一周する間にダウンロードできるので、2週目では必ず成功しますが、さすがに2周回るとそれなりの時間がかかります。

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

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

Facebook メッセンジャーの入力ボックスを画像探索させてクリックしてフォーカスを移動させる【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

時々出くわす問題。

Facebook メッセンジャーに音声入力テキストをコピペで流すスクリプトを便利に使っています。
ところが時々入力フォーカスを見失ってコピペに失敗することがあります。
どうも相手からメッセージを受け取ると入力フォーカスがどこかに行ってしまうようです。
キーボードショートカットだけでここから復旧させるのは難しい。
そこで最近覚えた画像探索で入力ボックスを見つけ出してマウスクリックで強制的に入力フォーカスをうつしてしまおうと考えました。

計画する。

メッセージを入力する入力ボックスの特徴的な部分を探してみますと、薄いグレーでメッセージを入力と表示されていることに気づきます。
ここをクリックすれば間違いなく入力状態にはできます。
そこでこの部分の画像をスクリーンショットから切り抜きます。
画像の保存形式は BMP です。

f:id:yasushiito:20190619161003j:plain

なんだよこの中途半端に見切れた画像は!
その理由は後ほど。

処理についてはこれまでと同様です。
ブラウザをアクティブにして、アクティブウインドウのサイズを取得します。
アクティブウィンドウの範囲内で目的の画像を探索させて、ヒットしたなら相対座標でマウスポインタを移動させてクリックします。
見つからなかったら無理に解決しようとせずに、そのまま続行させます。
こんな処理をペースト処理の手前に挿入します。
ただし、画像認識は環境が変わると失敗することが多く不安定要素になるので必要な時だけトライするようにしておきます。
探索したい画像が存在する時だけトライするようにしておきましょうか。

実装する。

ほとんどコピペで済みました。
'メッセージを入力'という表示の色合いが淡いので色の誤差を少なめにしました。
画像を保存するためのディレクトリを用意したのでスクリプトディレクトリからの相対パスで指定します。
座標系はアクティブウィンドウからの距離に設定することを忘れずに。
こんなもんでしょうか。

いえいえこんなものではすみません。
一度動いたように見えましたが、何回か繰り返すと失敗するケースがあることに気づきます。
後ほど説明するとあったあれですね。
入力ボックスの左端に入力カーソルがチカチカしているんですけど、こいつのせいで画像探索に失敗してるんですね。
メッセージを入力というテキスト全体を生真面目に切り抜くと、こんな目にあいます。
画像探索全体に言えることですが、見つかった画像の左上の座標を返してくるので、あんまりギリギリいっぱいを攻めるとマウスクリックに失敗します。
探索画像の切り抜きは適当なくらいがちょうど良いかと思われます。

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

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

今日は引っ越しなので一回休みです。

さすがに引っ越しと言うと大げさですが部屋の移動が行われます。
身辺状況の変化などに応じてより快適な生活ができるように一年に一度ほど居室を変更するのであります。
私一人の移動ではないので作業は1日を要するかと思われます。
きっとブログ更新などという余裕はないでしょうから、今日はこれでお茶を濁すことにします。

とはいえひとつくらい前進しないと落ち着かないので小さなハックを行いました。
ウィンドウの端っこにマウスポインターを停滞させるとスクロールする機能を常時有効にしました。
これまでは PC を起動するたびにショートカットキーから有効にしてたのですが、便利すぎてこれがないと始まらなくなりまして、毎日使っているのでdefaultでいいじゃんとなりました。