Auto Refresh

仕組み

現在 Chrome ウェブストアで公開中のバージョンに基づいて書かれています。

権限 — なぜこれほど少ししか求めないのか

タイマーでタブを再読み込みするのに、そのサイトへのアクセス権は一切要りません。拡張機能はブラウザに再読み込みを依頼するだけで、ページを見ることはありません。インストール時に「すべてのウェブサイト上のすべてのデータの読み取りと変更」というおなじみの警告が出ないのは、そのためです。

ページを読む必要があるのは 2 つの機能だけです。ページ上に描くカウントダウンと、キーワード監視です。これらは、そのサイトで初めて使うときに 1 サイトずつアクセスを求めます。許可したものはすべてオプションページに一覧表示され、サイトごとに取り消せます。

パッケージには宣言型のコンテンツスクリプトが入っていません。ページ側のコードは chrome.scripting を使って、許可済みのタブにだけ注入されます。許可していないサイトでは、私たちのコードは 1 行も動きません。

間隔、スケジュール、時刻指定

固定は N 秒ごとに繰り返します。ランダムは毎サイクルで範囲内から新しい値を取り、リクエストの間隔がまったく同じリズムになるのを避けたいときに役立ちます。カスタムは時・分・秒で指定します。

スケジュールは、選んだ曜日と開始〜終了の時間帯にルールを限定します。終了が開始より早い時間帯は日をまたぐものとして扱うので、22:00 → 02:00 は思ったとおりに動きます。

時刻指定は間隔を完全に置き換えます。09:30 と 14:00 を並べれば、その時刻にページが再読み込みされ、過ぎたぶんは翌日に繰り越されます。

ページ上に描かれるカウントダウン

拡張機能はページ自体に小さなカウントダウンを描けるので、ツールバーのポップアップを開かなくても残り時間が分かります。好きな位置へドラッグでき、位置はビューポートに対する割合としてルールごとに記憶されるため、ウィンドウサイズを変えても同じ場所に留まります。

サイトへの読み取り権限を必要とするのは、この便利機能ひとつだけです。オフにすれば、権限ゼロのまま時間指定の再読み込みは動き続けます。だからこそ全体設定ではなく、ルールごとの選択肢として用意されています。

コンパクトモードは文言を省いて数字だけを残します。部屋の向こうの壁掛けディスプレイで見張るページ向けです。

式の文法

プレーンテキストは、可視テキストのどこかに大文字小文字を区別せずに一致します。

正規表現はスラッシュで囲み、フラグを付けられます: /\$\d+(\.\d{2})?/i。他所からルールを貼り付けたときのために、$ を前置した裸のパターンも受け付けます。

CSS セレクタと XPath は語ではなく要素に一致します。XPath は // かドットで始まります。

論理式は残りすべてを組み合わせます: (In Stock OR Available) AND NOT Sold Out。フレーズを引用符で囲むのは、その中にこれらのキーワードが含まれるときだけです。

ひとつの監視に複数の式を並べると OR で結ばれます。AND が必要なときは、暗黙のルールに頼らず、ひとつの論理式として書いてください。

できあいのルール

すぐ使えるテンプレートが、これが実際に使われる場面を押さえています。品切れ商品の再入荷、価格の変動、新しい求人の掲載、ビルドの完了、社内ダッシュボードが 500 を返し始めたとき。

ひとつ選ぶと、式と一緒に妥当な間隔まで入ります。再入荷なら 30 秒、採用ページなら 10 分 —— 適切な間隔は、どんな語を書くかと同じくらいレシピの一部だからです。選んだ後は全部編集できます。

テンプレートは取得するのではなく、拡張機能に同梱されています。必要に応じてダウンロードする形にすると、誰がいつ何を見張っているかが私たちに見えてしまいます。それこそ、私たちが知らないと約束していることです。

セレクタを書く代わりに要素を選ぶ

ピッカーはページ上を移動すると要素をハイライトし、クリックするとセレクタを書いてくれます。CSS セレクタを求められる場所すべてで使えます —— 監視する領域、クリック対象、抽出する値。

div:nth-child(3) > span のような位置ベースのパスより、id や data-testid といった安定したアンカーを優先します。位置ベースのパスはサイトがバナーを 1 本足しただけで壊れますが、属性アンカーはたいていリニューアルを生き延びます。

それでもセレクタが壊れたときは、AI 修復が古いセレクタと新しいページの断片を受け取って代替案を提示します。採用する前に判断できるよう、確信度も付きます。

出現、消失、何かが変わったら

「出現」は一致が現れたときに発火します。「消失」はすべての式が一致しなくなったときに発火します —— 「売り切れ」やメンテナンスの表示が消えるのを待つのに向いています。

「何かが変わったら」はキーワード不要です。可視テキストの指紋を取り、その指紋が動いたら知らせます。最初のスキャンは基準を作るだけなので、作りたてのルールがいきなり発火することはありません。

指紋は生の HTML をあえて無視します。nonce やタイムスタンプ、インラインスクリプトはほぼ毎回の読み込みで変わるため、マークアップをハッシュ化すると通知が鳴り止みません。

スキャンの設定

スキャン前の待機は、動的なページに描画の時間を与えます。明らかに一致しているはずのサイトで監視がまったく発火しないなら、原因はほぼこれです。

CSS セレクタで監視を特定の領域に絞ると、ページ全体の付随物が対象から外れます。誤検知を減らす手として最も効果的です。

可視テキストではなく HTML ソースをスキャンすると、隠れたマークアップにも一致します。これは開発者向けの選択肢で、誰にも見えないものに一致してしまいます。

ページ操作

操作対象は CSS セレクタで、XPath のフォールバックを任意で付けられます。ポップアップや Cookie バナーを閉じる、折りたたまれた区画を開く、目的のタブに切り替えるといった操作に使います。発火のタイミングは、再読み込みのたびか、監視が発火したときだけかを選べます。複数の対象は順番に実行されます。

セレクタを手書きせずピッカーを使ってください —— 位置ベースのパスより id と data-testid を優先するので、サイトのリニューアルにずっと強く残ります。

CAPTCHA を検知するとルールを一時停止して知らせます。拡張機能はチャレンジを解読・回避・突破しようとはしません。

キオスク巡回

ルールに URL のリスト(1 行に 1 つ)を与えると、タブは同じページを再読み込みする代わりに、タイマーに合わせてそれらを順に巡回します。壁掛けディスプレイや、複数のダッシュボードを順番に映す予備モニタに使いたいモードです。

巡回カーソルはルールの実行時状態と一緒に保持されるので、ブラウザの再起動や service worker の停止があっても、リストの先頭からではなく正しい URL から再開します。

巡回中も監視は有効です。つまり 1 つのルールで 4 つのダッシュボードを回し、どれかがエラーを出し始めたら知らせる、ということができます。

値を時系列で抽出する

価格・在庫数・順位などを指定すると、チェックのたびにその時の表示を記録します。数値は周囲から切り出され、通貨記号や桁区切りは取り除かれるので、1 299,00 € はグラフ化も比較もできる数になります。

しきい値を付けると、この系列がそのまま通知になります。ある数を下回る、上回る、あるいは前回サンプルからの変動率。しきい値がなければ系列は静かに記録され、見に行ったときだけ姿を見せます。

すべて CSV に書き出せます。パネル内のグラフは軸のない 1 本線にあえて留めてあります —— パネルは幅 320px しかなく、正確に読むためにこそエクスポートがあります。

変更履歴

監視が発火するたび、時刻・ページ・一致したテキストが書き留められます。放っておく見張りを動かし続ける価値があるのはこのためです。数時間後に、見逃した通知を見つけるのではなく、何がいつ起きたのかを正確に確認できます。

スナップショットは発火した瞬間の周辺テキストを保持するので、「何かが動いた」だけでなく、前後を比べられます。

ローカル履歴はリングバッファで、サイズはオプションで決めます。新しい記録が入ると古いものから落ちていきます。より長い保持期間はアカウント側にあり、クラウド同期を有効にした場合に限られます。

AI は何のためにあるのか

ルール生成は一文を受け取り ——「在庫が戻って 200 ドルを切ったら教えて」—— 式・モード・推奨間隔を返します。正規表現を一生学ばないし、学ぶ必要もない人にとって、文法を飛び越す最短経路です。

変更要約は発火前後のテキストを受け取り、実際に何が変わったのかを 1 行で述べます。有用な差分がタイムスタンプや回転する広告に埋もれているページでは、これが効きます。

変更分類は差分が意味あるものかノイズかを判定し、セレクタ修復はサイトのリニューアルで壊れたセレクタの代替を提案します。この 4 つはすべて私たちのサーバー上で動きます。拡張機能のパッケージのどこにもモデルの鍵はなく、リクエストが運ぶのは解析対象の断片であって、閲覧履歴ではありません。

通知

ブラウザ内では、通知・音・ページ上での一致箇所のハイライト・タブを前面に出す、のいずれか。

ブラウザ外では、メール・Webhook・Telegram・Discord・Slack。ダッシュボードで設定します。アカウントと Pro プランが必要です。

通知は再送しません。10 分遅れて届く再入荷の知らせは無いより悪いので、送信失敗はキューに積むのではなくそのまま報告します。

以下の各チャネルにはダッシュボード上に専用の設定があり、ダッシュボードからはこれらの段落へ直接リンクしています。

メール

ダッシュボードでアドレスを追加すると、そこへ確認メールを 1 通送ります。中のリンクが開かれるまでチャネルは沈黙したままです。リンクは 1 回だけ有効で、24 時間で失効します。

この二重確認は形式ではありません。これがなければ、アカウントを持つ誰もが他人のアドレスを打ち込み、私たちのドメインに好きな文面を届けさせられます —— それはオープンメールリレーの形であり、送信レピュテーションを失う最短ルートです。したがって「テスト」ボタンでアドレスを確認することはできず、確認済みのアドレスだけがテストできます。

メールは 1 日の割り当てを消費する唯一のチャネルです。私たちが費用を払う唯一のチャネルだからです。確認メールは割り当てに数えませんが、再送には頻度制限があります。

Webhook

あなたが管理する https:// のエンドポイントを貼ってください。{ source, title, body, url, at } の形をした application/json を POST します。命中のタイトルと本文、それが起きたページ、そして ISO 形式のタイムスタンプです。

試行は 1 回、タイムアウトは 8 秒、再試行なし。あなた側で認証トークンが必要なら、カスタムヘッダーをチャネルと一緒に保存できます。

URL は https でなければならず、プライベートアドレスやリンクローカルアドレスに解決されるホストはチャネル追加時に拒否されます —— クラウドのメタデータアドレスも含みます。このチェックは、このフォームが誰かの代わりに私たちのサーバーへ内部ネットワークを探らせる手段にならないために存在します。

Telegram

Telegram には 2 つの値が必要で、ダッシュボードは両方を尋ねます。bot token と chat id です。@BotFather にメッセージを送り、/newbot を送信して、返ってきた token をコピーします。次に新しい bot へ何かメッセージを送り(bot の側から会話を始めることはできません)、https://api.telegram.org/bot<token>/getUpdates から chat.id を読み取ります。

あなたの token を使って Telegram Bot API の sendMessage を呼びます。token はあなたのアカウントに保管され、他の用途には使われず、拡張機能に渡されることも決してありません。BotFather で失効させれば、配信は即座に止まります。

Discord

サーバー設定 → 連携サービス → ウェブフック → 新しいウェブフック、投稿先チャンネルを選び、ウェブフック URL をコピーしてダッシュボードに貼り付けます。

タイトル・一致したテキスト・ページへのリンクを載せた Discord の embed を POST します。この URL 自体が資格情報です —— 持っている人は誰でもそのチャンネルに投稿できます —— ので、秘密として扱ってください。Discord 側でウェブフックを削除すれば即座に失効し、私たちの側で変更は要りません。

Slack

Slack アプリの Incoming Webhooks で機能を有効にし、ワークスペースに 1 つ追加してチャンネルを選び、hooks.slack.com の URL をコピーします。

タイトル・一致したテキスト・ページ URL を含む { text } を POST します。この webhook は選んだ 1 つのチャンネルに紐づき、それ自体が資格情報です。配信を止めるには Slack 側で失効させてください。

Chrome がバックグラウンドタブを凍結したとき

Chrome のメモリセーバーは、使っていないと判断したタブを破棄し、再読み込みのサイクルが止まります。拡張機能は破棄されたタブに気づき、再読み込みして復帰させます。

ウィンドウを表示したままにしておけば、そもそも起きません。オプションの「パソコンをスリープさせない」は、システムのスリープが夜間に同じ結果をもたらすのを防ぎます。

同期・デバイス・何がマシンの外に出るのか

アカウントを作らなければ、何ひとつブラウザの外には出ません。

クラウド同期を有効にすると、あなたが書いたルールと、それが生んだ命中を保存します。あなたが訪れたサイトの一覧は保存しませんし、それに関心もありません。

マージはデバイス上で、ルール単位・最終更新時刻に基づいて行われます。ノートPCでの編集がデスクトップで組んだ設定を上書きすることはありません。タブに紐づいたルールは決して同期しません。tab id は別のマシンでは何の意味も持たないからです。

試用期間と、無料プランに残るもの

試用はすべて解放された 7 日間で、時間はローカルで計ります。アカウントもカードも不要で、解約するものもありません。期限が切れると Pro 機能は消えるのではなく読み取り専用になるので、設定したものは何ひとつ失われません。

無料プランはデモではなく、本当に使えるものを目指しています。無制限の更新ルール、更新まわりのすべての選択肢、そしてプレーンテキストの監視 3 件。ランダム間隔・音・通知は従量ではありません。通知 1 件ごとに課金することこそ、競合の拡張機能を使い続けにくくしている当のものだからです。

Pro が足すのは規模とクラウドです。無制限の監視、高度な式、スケジュール、ページ操作、値の抽出、履歴、AI、そしてブラウザの外へ出る通知。買い切りは機能セットは同じで、AI の割り当てが毎月ではなく毎年リセットされます —— 支払いは一度きりでも、推論のコストは繰り返し発生するからです。