5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

クソアプリAdvent Calendar 2024

Day 20

とにかくやれ!なChrome拡張

Last updated at Posted at 2024-12-19

この記事は、クソアプリ Advent Calendar 2024の20日目の記事です。
昨日は@toffyさんの記事でした。

はじめに

こんにちは、@rs_tukkiです。

突然ですが、私は今月とても〆切に追われていました。
この記事を含めて執筆するアドベントカレンダーが3本と、年末の某コミックなマーケットの原稿の〆切も控えてました。
でもなかなかやる気が出ない。ついついTwitterを眺めてしまう。

今日はそんな人たちに向けたChrome拡張を紹介しようと思います。

今まで作ったクソ拡張

今回のテーマ

まずはこちらの動画をご覧ください。

『星のカービィ』シリーズ等のディレクターでおなじみ、桜井政博さんの金言ですね。
やる気がない時はとにかくやれ。
身も蓋もないような気もしますが、結構的を射ている言葉ではないかと思います。

でも、そんな言葉を知っていても、結局やらないときはやらないものです。

であれば、強制的にやらざるを得ない状況にすればよいのでは?

成果物

という訳で、作りました。こんなChrome拡張。

twitter-Google-検索-Google-Chrome-2024-12-19-01-27-08.gif

とにかくChromeで何かサイトを見ようとすると問答無用で「とにかくやれ」の動画に飛ばしてくれます。
ここまで無限に「とにかくやれ」の圧を浴び続ければ、流石にやらずにはいられないでしょう。

image.png

あなたを焦らせるために、「とにかくやれ」を開いた回数と秒数のカウンターも完備しています。
飛ばす先を自由に決めることもできます。

仕組み

仕組みはとにかく単純です。
何かしらのサイトをロードした時に自身のURLでなかったらリダイレクトさせるだけ。

実装については大半をChatGPTの力をお借りしながら作成しました。

let redirectUrl = "";
let redirectCount = 0;
let totalTimeSpent = 0;
let startTime = null;
const defaultRedirectUrl = "https://www.youtube.com/watch?v=JV3KOJ_Z4Vs";

  // 設定値の初期化
  chrome.runtime.onInstalled.addListener(() => {
    chrome.storage.local.set({
      redirectUrl: defaultRedirectUrl,
      redirectCount: 0,
      totalTimeSpent: 0
    }, () => {
      redirectUrl = defaultRedirectUrl;
    });
  });

  // タブを開いた際の処理
  chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
    if (changeInfo.status === "complete" && tab.url.startsWith("http")) {
      chrome.storage.local.get("redirectUrl", (data) => {
        const currentRedirectUrl = data.redirectUrl || defaultRedirectUrl;
        if (tab.url !== currentRedirectUrl) {
          chrome.tabs.update(tabId, { url: currentRedirectUrl });
          redirectCount++;
          chrome.storage.local.set({ redirectCount });
          startTime = Date.now();
          startInterval();
        }
      });
    }
  });

  // タブを移動した時の処理
  chrome.tabs.onActivated.addListener(() => {
    if (startTime) {
      recordElapsedTime();
      stopInterval();
    }
  });

  // タブを閉じたときの処理
  chrome.tabs.onRemoved.addListener(() => {
    if (startTime) {
      recordElapsedTime();
      stopInterval();
    }
  });

  // サイトを開いていた時間をDBに保存する
  function recordElapsedTime() {
    if (startTime) {
      const elapsedTime = (Date.now() - startTime) / 1000;
      totalTimeSpent += elapsedTime;
      chrome.storage.local.set({ totalTimeSpent });
      startTime = null;
    }
  }

  // 1秒ごとに時間を計測する
  function startInterval() {
    if (!intervalId) {
      intervalId = setInterval(() => {
        recordElapsedTime();
        startTime = Date.now();
      }, 1000);
    }
  }

  // 計測を終了する
  function stopInterval() {
    if (intervalId) {
      clearInterval(intervalId);
      intervalId = null;
    }
  }

chrome.tabsAPIを使うことで、裏側から各タブの挙動を検知しています。
タブを開いている間だけその時間を計測しておき、タブを移動するか閉じるかしてとにかくやる態勢になったときに計測を終了するような仕組みです。
あまりにも作りが単純なところもクソアプリ

まとめ

というわけで、今回はとにかくやるためのChrome拡張を作成しました。
みなさんもやる気がないときはこれを使ってとにかくやらせるようにしましょう。

...え?
それで結局とにかくやれたのかって?

...PC作業をする私の手元にはスマートフォンがありました。
あとは察してください。 一応原稿は間に合いました。なんとか。

明日は@RyoKatsuseさんです!

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?