ぺんちゃん日記

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

はてなブログの編集フォームのデザインが変わったのでエントリー開始スクリプトを修正した 改余分なバックアップをクリアする【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain
Chrome のウインドウを判定する処理を変更したことによって発生した大規模修正の動作チェックを行っていたら、ブログの記事を新規作成するスクリプトが動かなくなってました。

タイトルをコピペできない症状でした。

これは大規模修正の際にバグを入れ込んだなと判断したのでソースコードとにらめっこ。
特におかしい所もなく、スリープの時間をいじるくらいしか問題箇所を特定できないくらい。
それで30分程度、あっちのスリープを足したり引いたり、クリップボードの内容を確認してみたり。
どうしても治らないので腰を据えて手動でキー送信してみたところ、 SHIFT + tabでタイトルにフォーカスが移らないことを発見。
よく見たら「0分前に保存されたバックアップの内容を挿入する」というような、これまでになかったメッセージが表示されていて、その横に「クリア」 というボタンが追加されていました。

f:id:yasushiito:20190910102019p:plain

タイトルにフォーカスを移すつもりが、こいつに移動させてコピペしていたようです。
そりゃコピペできるわけがない。

そうとわかれば解決法はとても簡単。
SHIFT + tab を2回送信してフォーカスをタイトルまで持っていくだけ。
つまんないことで悩んだな。
これにて一件落着…… と行けば良かったんですけどね。
今朝もう一度、動作確認のために編集フォームを開いてみたのですが、 今日はない!
昨日のメッセージは夢か幻だったか?

はてなブログの編集フォームをいったりきたりして動作の様子を観察してみると 編集した記事を保存しないままページを閉じた時に 現れることがわかりました。
トラブル発生時に書きかけの記事が ロストしないようにバックアップを保存する仕組みをはてなブログが備えているということですね。

つまり状況に応じてタイトルへのフォーカス移動が tab キー1回だったり2回だったり変化するわけです。
こいつは弱ったの。
スクリプト側からは画像認識でもしない限り、バックアップ復旧のメッセージがあるかないかなんてわからない。

そこで考えた作戦は、入力フィールドでなければペーストしても無視されるだろう作戦です。
1回 SHIFT + tab でフォーカスを移動させた後にダメ元でペーストして、念のためもう一度シフト+タブで移動させてペーストさせて 見るのです。
バックアップクリアのリンクに対して Ctrl + V を送ってもショートカットキーは無視されて何も起きません。
また、バックアップ復元のメッセージがなかったとしても、行き過ぎた先はプレビューボタンなので、やはり Ctrl + V は無視されます。
我ながら姑息な手を考えたものだ。

と実装したのは良いですが、 編集フォームに何らかの編集を加えるとバックアップ復元のメッセージは消えてしまいます。
消えてしまうと、フォーカスがストップする場所もも消えてしまうので tab キーで本文の入力フィールドに戻す時に失敗してしまいます。
編集して一呼吸の間にメッセージが消えるので、タイミング次第で失敗することがあります。
こいつは困ったぜ。

どうしても無理な時は禁断の画像認識を使うまでなんですが、出来る限り避けたいですね。

そこで次に考えたのが、タイトルの入力フィールドに enter キーを送っても無視されるだろう作戦です。

なんだよその作戦名は…。

本文の入力フィールドから SHIFT + tab でフォーカスを移動させて enter キーを送信します。
もしバックアップ復元のメッセージがなかったら、フォーカスはタイトルに移動しているはずです。
ここでエンターキーを送ると入力フォーカスは本文に戻されます。
また、バックアップ復元のメッセージがある場合、フォーカスをバックアップのクリアボタンに移動しています。
ここでエンターキーを送るとバックアップはクリアされて 入力フォーカスは失われます。
いずれの場合も 、この状況から SHIFT + tab キーを送信すれば、バックアップ復元メッセージは消えた状態でタイトルをフォーカスしている状態に なるんです。

ということで、ここで満を持して タイトルをペーストして tab で本文に入力フォーカスを移動させれば期待通りです。
バックアップ復元 Message のクリアは新規エントリーを開いた直後にやりましょうか。
スクリプトにするとこんな感じです。

    ; 新規エントリページを開く。
    Clipboard := "http://blog.hatena.ne.jp/" . hatena . "/" . hatena . ".hatenablog.com/edit"
    Send, ^v
    Send,{enter}
    Sleep 3000
    ;バックアップを復元するメッセージが表示されていることがあるので 復元ボタンに移動。
    ;メッセージがない場合はタイトルに移動して enter を空打ちして フォーカスを本部に移動させる。
    ;ここで SHIFT + tab 入力すれば必ず入力フォーカスがタイトルに移動しているので不確定要素がなくなる。
    Send,+{Tab}
    Sleep 100
    Send,{enter}
    Sleep 100

myahk/blogentry.ahk at master · yasushiito/myahk · GitHub


記事をアップロードする前に問題に気が付いたから助かった。


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

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