Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ใƒฆใƒผใ‚ถใƒผใฎใ‹ใ‚ใ‚Šใซ้€ฃๆ‰“ใ—ใฆใใ‚Œใ‚‹ๆ‹กๅผตๆฉŸ่ƒฝใ‚’ไฝœใฃใŸ

Last updated at Posted at 2021-12-20

ใฏใ˜ใ‚ใซ

ใ“ใ‚Œใฏใ‚ฏใ‚ฝใ‚ขใƒ—ใƒช Advent Calendar 2021ใฎ19ๆ—ฅ็›ฎใฎ่จ˜ไบ‹ใงใ™ใ€‚

ใใ‚Œใฏใ‚ฏใ‚ฝใ‚ขใƒ—ใƒชๅˆๆ—ฅใฎใ‚ซใƒฌใƒณใƒ€ใƒผใ‚’่ฆ‹ใฆใ„ใŸๆ™‚ใฎใ“ใจใ€‚

ใ€Œ้›ปๅ“ๆˆ้•ทใ•ใ›ใ‚‹ใ‚ขใƒ—ใƒช้ข็™ฝใ„๏ผใŸใ ใ‚ฏใƒชใƒƒใ‚ฏใ—็ถšใ‘ใ‚‹ใฎใ‚ใ‚“ใฉใ„ใ€ใ€ใ€ใ€‚ใใ†ใ‚„๏ผใ€

ใจใ„ใ†ใ“ใจใงใ€ใ‚ซใƒฌใƒณใƒ€ใƒผใซๅˆๅ‚ๆˆฆใ™ใ‚‹ใŸใ‚ใซใ€่‡ชๅˆ†ใงใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹ไปฃใ‚ใ‚Šใซใ€่‡ชๅ‹•ใงใ—ใฆใใ‚Œใ‚‹Chromeๆ‹กๅผตใ‚’ใคใใ‚‹ใ“ใจใซใชใ‚Šใพใ—ใŸใ€‚

้›ปๅ“ใฎๆˆ้•ทใ‚’ไฝ“้จ“ใงใใ‚‹ใ‚ฏใ‚ฝใ‚ขใƒ—ใƒชใซใคใ„ใฆใฏใ“ใกใ‚‰

ไฝฟใ„ๆ–น

  1. ้€ฃๆ‰“ใ—ใŸใ„่ฆ็ด ใ‚’ๅณใ‚ฏใƒชใƒƒใ‚ฏ
  2. [้€ฃๆ‰“ใ™ใ‚‹]ใ‚’้ธๆŠž
  3. ใ‚ใจใฏๅพ…ใคใ ใ‘

renda.gif
)

ๆŠ€่ก“ใ‚นใ‚ฟใƒƒใ‚ฏ

  • HTML
  • CSS
  • JavaScript

ใ‚ณใƒผใƒ‰

ใ‚‚ใจใ‚‚ใจReact+TypeScriptใงใ€ๆ‹กๅผตๆฉŸ่ƒฝใ‚’ไฝœๆˆใ—ใ‚ˆใ†ใจใ—ใŸใฎใงใ™ใŒใ€ๆ‹กๅผตๆฉŸ่ƒฝใฎไฝœๆˆใ€TypeScriptใฏๅ…จใใฎๆœช็ตŒ้จ“ใ ใฃใŸใฎใง้€Ÿๆ”ปใงๆŒซๆŠ˜ใ—ใพใ—ใŸใ€‚

ใ€Œใจใซใ‹ใๅ‹•ใใ‚‚ใฎใ‚’ไฝœใฃใฆใ‹ใ‚‰ใ€ๅž‹ไป˜ใ‘ใ ใฃใŸใ‚Šใ€ใƒชใƒผใƒ€ใƒ–ใƒซใชใ‚ณใƒผใƒ‰ใ‚’ไฝœใฃใŸใ‚Šใ—ใ‚ˆใ†ใ€ใใ†่€ƒใˆใŸ็งใฏใ€ๆœฌๅฝ“ใซไธ€็•ชๅˆๆญฉ็š„ใชๆŠ€่ก“ใ‚นใ‚ฟใƒƒใ‚ฏใ‚’็”จใ„ใฆไฝœๆˆใ™ใ‚‹ใ“ใจใซใ—ใพใ—ใŸใ€‚ใใ‚Œใงใ‚‚้žๅธธใซ่ฉฐใพใ‚Šใพใ—ใŸใ€‚

ๅฎŸ่ฃ…

Chromeๆ‹กๅผตใฎๅŸบ็คŽ็Ÿฅ่ญ˜(content sctipt, action, pageใจใ„ใ†3ใคใฎๆฆ‚ๅฟต)ใ‚’ใ–ใฃใใ‚Šๅญฆใ‚“ใ ๅพŒใ€ไปฅไธ‹ใฎใ‚ˆใ†ใชๆตใ‚Œใงไฝœๆˆใ„ใŸใ—ใพใ—ใŸใ€‚(manifest_version:3ใงๅ‹•ไฝœใ™ใ‚‹ใ‚ˆใ†ใซไฝœๆˆใ—ใฆใ„ใพใ™)

  • ้€ฃๆ‰“ใซ้–ขใ™ใ‚‹่จญๅฎš
  • ใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใƒกใƒ‹ใƒฅใƒผใฎไฝœๆˆ
  • ใƒกใƒ‹ใƒฅใƒผ้ธๆŠžๆ™‚ใฎ่ฆ็ด ๅ–ๅพ—ใ€้€ฃๆ‰“ๅฎŸ่กŒ

้€ฃๆ‰“ใซ้–ขใ™ใ‚‹่จญๅฎš

manifest.json
    "action": {
        "default_title": "้€ฃๆ‰“ใƒžใƒณ",
        "default_popup": "popup.html"
    },
    "permissions": [
        "storage"
    ],

ใ‚‚ใจใ‚‚ใจbrowser_action(ๅ…จใƒšใƒผใ‚ธ)ใจpage_action(็‰นๅฎšใƒšใƒผใ‚ธ)ใซๅˆ†ใ‹ใ‚Œใฆใ„ใพใ—ใŸใŒใ€manifest_version:3ใงactionใซ็ตฑไธ€ใ•ใ‚Œใพใ—ใŸใ€‚
permissionsใซใคใ„ใฆใฏใ€ๅพŒใปใฉ่ชฌๆ˜Žใ—ใพใ™ใ€‚

popup.html
<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="utf-8" />
    <title>Rendaman</title>
</head>

<body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root">
        <p>่จญๅฎš</p>
        <div>
            <label>
                ้€ฃๆ‰“ๅ›žๆ•ฐ:
                <input type="number" id="renda_count" />
            </label>
            <label>
                ้€ฃๆ‰“้–“้š”(ms):
                <input type="number" id="renda_interval" />
            </label>

            <button id="renda_set">่จญๅฎšใ™ใ‚‹</button>
        </div>
    </div>
    <script src="popup.js"></script>
</body>

</html>
popup.js
// ่ชญใฟ่พผใฟๆ™‚ใซใ€ๆ—ขๅญ˜ใฎ่จญๅฎšใ‚’ๅๆ˜ 
window.onload = function () {
    let count = document.querySelector('#renda_count');
    let interval = document.querySelector('#renda_interval');
    chrome.storage.local.get(['renda_count', 'renda_interval'], function (result) {
        count.value = result.renda_count ? result.renda_count : 100;
        interval.value = result.renda_interval ? result.renda_interval : 100;
    });
}

const clickEvent = () => {
// ่จญๅฎšใƒœใ‚ฟใƒณใ‚ฏใƒชใƒƒใ‚ฏๆ™‚ใซใ€ใƒ‡ใƒผใ‚ฟใ‚’ใƒญใƒผใ‚ซใƒซใ‚นใƒˆใƒฌใƒผใ‚ธใซไฟๅญ˜
    const count = document.querySelector('#renda_count').value ? document.querySelector('#renda_count').value : 100;
    chrome.storage.local.set({ renda_count: count });

// ่จญๅฎšใƒœใ‚ฟใƒณใ‚ฏใƒชใƒƒใ‚ฏๆ™‚ใซใ€ใƒ‡ใƒผใ‚ฟใ‚’ใƒญใƒผใ‚ซใƒซใ‚นใƒˆใƒฌใƒผใ‚ธใซไฟๅญ˜
    const interval = document.querySelector('#renda_interval').value ? document.querySelector('#renda_interval').value : 100;//ms
    chrome.storage.local.set({ renda_interval: interval });
}

document.querySelector("#renda_set").addEventListener('click', clickEvent)

ใ€€ใ‚ณใƒณใƒ†ใ‚ญใ‚นใƒˆใƒกใƒ‹ใƒฅใƒผใฎไฝœๆˆ

manifest.json
    "host_permissions": [
        "*://*/*"
    ],
    "permissions": [
        "contextMenus",
        "tabs",
        "activeTab",
        "storage"
    ],
    "background": {
        "service_worker": "background.js"
    }

permissionsใฏใ€chromeใŒๆไพ›ใ™ใ‚‹APIใ‚’ๅˆฉ็”จใ™ใ‚‹ใŸใ‚ใซๅฟ…่ฆใช่จ˜่ฟฐใงใ™ใ€‚ไปŠๅ›žใฏใ€

  • contextMenus (chrome.contextMenus APIใธใฎใ‚ขใ‚ฏใ‚ปใ‚นๆจฉ)
  • tabs (chrome.tabs APIใธใฎใ‚ขใ‚ฏใ‚ปใ‚นๆจฉ)
  • activeTab(่กจ็คบไธญใฎใ‚ฟใƒ–ใธใฎใ‚ขใ‚ฏใ‚ปใ‚นๆจฉ้™)
  • storage (chrome.storage APIใธใฎใ‚ขใ‚ฏใ‚ปใ‚นๆจฉ)
background.js
chrome.runtime.onInstalled.addListener(function () {
    // ใƒกใƒ‹ใƒฅใƒผ่ฟฝๅŠ 
    chrome.contextMenus.create(
        {
            id: "rendaman",
            title: "้€ฃๆ‰“ใ™ใ‚‹",
            contexts: ["all"] // ใ™ในใฆใฎ่ฆ็ด ใงๅณใ‚ฏใƒชใƒƒใ‚ฏๆ™‚ใซ่กจ็คบ
        }
    )

    // // ่ฟฝๅŠ ใ—ใŸใƒกใƒ‹ใƒฅใƒผใŒใ‚ฏใƒชใƒƒใ‚ฏใ•ใ‚ŒใŸๆ™‚
    chrome.contextMenus.onClicked.addListener(() => {
        // ่กจ็คบไธญใฎใ‚ฟใƒ–ใ‚’ๅ–ๅพ—ใ—ใ€content scriptใซใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ใ‚‹
        chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
            chrome.tabs.sendMessage(tabs[0].id, { action: "rendaman" });
        });
    });
})

ใƒกใƒ‹ใƒฅใƒผ้ธๆŠžๆ™‚ใฎ่ฆ็ด ๅ–ๅพ—

ใƒกใƒ‹ใƒฅใƒผ้ธๆŠžๆ™‚ใฎ่ฆ็ด ใ‚’chrome.contextMenus.onClickedใ‚คใƒ™ใƒณใƒˆใฎๅผ•ๆ•ฐใ‹ใ‚‰ๅ–ๅพ—ใ™ใ‚‹ใ“ใจใฏใ€ๆฎ‹ๅฟตใชใŒใ‚‰ใงใใพใ›ใ‚“ใ€‚

ใชใฎใงไปŠๅ›žใฏใ€content scriptๅดใงๅณใ‚ฏใƒชใƒƒใ‚ฏใ‚’่กŒใฃใŸๆ™‚ใฎ่ฆ็ด ใ‚’ๅ–ๅพ—ใ—ใฆใŠใใ€ๅฎŸ้š›ใซใƒกใƒ‹ใƒฅใƒผใŒใ‚ฏใƒชใƒƒใ‚ฏใ•ใ‚ŒใŸๅ ดๅˆใใฎ่ฆ็ด ใ‚’้€ฃๆ‰“ใ™ใ‚‹ใ‚ˆใ†ใซใ—ใพใ—ใŸใ€‚

manifest.json
"content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "content.js"
            ],
            "all_frames": false,
            "match_about_blank": true
        }
    ]
content.js

let clickedEl = null;
// ๅณใ‚ฏใƒชใƒƒใ‚ฏใงใƒกใƒ‹ใƒฅใƒผใ‚’้–‹ใ„ใŸ้š›ใฎ่ฆ็ด ใ‚’ๅ–ๅพ—
document.addEventListener("contextmenu", function (event) {
    clickedEl = event.target;
}, true);

// ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’ๅ—ใ‘ๅ–ใฃใŸ้š›ใฎๅ‹•ไฝœใ‚’ๆŒ‡ๅฎš
chrome.runtime.onMessage.addListener(rendaman);

function rendaman(request, sender, sendResponse) {
    if (!clickedEl) return false;

    // ๆƒณๅฎšใฎใƒกใƒƒใ‚ปใƒผใ‚ธใ‹ใ‚’ใƒใ‚งใƒƒใ‚ฏ
    if (request.action != "rendaman") return false;

    let renda_count, renda_interval, clickInterval;

    // ๆ—ขๅญ˜ใฎ้€ฃๆ‰“ๅ‡ฆ็†ใŒใ‚ใ‚Œใฐๅ‰Š้™ค
    if (clickInterval) {
        clearInterval(clickInterval);
    }

    // ใ‚นใƒˆใƒฌใƒผใ‚ธใ‹ใ‚‰้€ฃๆ‰“ๅ›žๆ•ฐใ€้€ฃๆ‰“้–“้š”ใซ้–ขใ™ใ‚‹ใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ—ใ€้€ฃๆ‰“ใ‚’ๅฎŸ่กŒ
    chrome.storage.local.get(['renda_count', 'renda_interval'], function (result) {
        renda_count = result.renda_count ? result.renda_count : 100;
        renda_interval = result.renda_interval ? result.renda_interval : 100;

        clickInterval = setInterval(function () {
            if (renda_count <= 0) {
                clearInterval(clickInterval);
                // ้€ฃๆ‰“ใŒใ†ใพใๅฎŸ่กŒใ•ใ‚Œใ‚‹ใจใƒกใƒƒใ‚ปใƒผใ‚ธใซๅฏพใ™ใ‚‹ใƒฌใ‚นใƒใƒณใ‚นใ‚’ใ‹ใˆใ™
                sendResponse({ message: "renda completed!!" });
                return;
            }

            clickedEl.click();
            renda_count--;
        }, renda_interval);
    });

    return true;
}

ไปฅไธŠใงๆŒ‡ๅฎšๅ›žๆ•ฐใ€้–“้š”ใง่ฆ็ด ใ‚’้€ฃๆ‰“ใ™ใ‚‹ๆ‹กๅผตใฎๅฎŒๆˆใงใ™๏ผๅ‡บๆฅไธŠใŒใฃใฆใฟใ‚‹ใจใ€ๆกˆๅค–็ฐกๅ˜ใงใ—ใŸใŒใ€ไฝœๆˆไธญใฏ็Ÿฅใ‚‰ใชใ„ๅ†…ๅฎนใฐใ‹ใ‚Šใ ใฃใŸใฎใงใ€ใ•ใพใ‚ˆใฃใฆใ„ใพใ—ใŸใ€‚

่ฉฐใพใ‚Šใƒใ‚คใƒณใƒˆโ‘  manifest_version

chromeๆ‹กๅผตใ‚’ไฝœใ‚‹้š›ใซๆŒ‡ๅฎšใ™ใ‚‹manifest_versionใฏใ€ใ“ใ‚Œใพใง2ใ ใ‘ใงใ—ใŸใŒใ€chrome88ใฎใƒชใƒชใƒผใ‚นๆ™‚ใซใง3ใŒๅฐŽๅ…ฅใพใ—ใŸใ€‚

ใ“ใ‚Œใซใ‚ˆใ‚Šใ€versionใซใ‚ˆใ‚‹ๆŒ™ๅ‹•ใฎ้•ใ„ใซๆททไนฑใ—ใพใ—ใŸใ€‚

่ฉฐใพใ‚Šใƒใ‚คใƒณใƒˆโ‘ก Message Passing

Simple one-time requests

chrome.runtime.sendMessage({greeting: "hello"}, function(response) {
  console.log(response.farewell);
});

ไธŠ่จ˜ใฎURLใฎ้€šใ‚Šใ€ใ‚„ใฃใฆใ„ใ‚‹ใฎใซไฝ•ๅบฆ่ฉฆใ—ใฆใ‚‚ErrorใŒใงใ‚‹ใชใจๆ€ใฃใฆใ„ใŸใ‚‰ใ€extensionใ‹ใ‚‰content scriptใซ้€ใ‚ŠใŸใ„ๅ ดๅˆใซใฏไธ‹ใฎใ‚ณใƒผใƒ‰ใ‚’ไฝฟใ„ใชใ•ใ„ใจๆ›ธใ„ใฆใ„ใพใ—ใŸใ€‚ใ€‚ใ€‚ใ€‚

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
  chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) {
    console.log(response.farewell);
  });
});

่ฉฐใพใ‚Šใƒใ‚คใƒณใƒˆโ‘ก ไฝ•ๅบฆใ‚‚EventใŒ็™บ็ซใ™ใ‚‹

ๅณใ‚ฏใƒชใƒƒใ‚ฏใงใ€ใƒกใƒ‹ใƒฅใƒผใ‚’้ธๆŠžใ—ใŸใจใใซใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’้€ใ‚‹ใ‚ˆใ†ใซใ—ใฆใ„ใŸใฎใงใ™ใŒใ€ๅ—ใ‘ๅ–ใ‚‹ๅดใฎconsole.logใŒใชใœใ‹่ค‡ๆ•ฐๅ›ž่กจ็คบใ•ใ‚Œใ‚‹ใ“ใจใŒใ‚ใ‚Šใพใ—ใŸใ€‚

ๅŽŸๅ› ใฏใ€manifest.jsonใฎall_frames:trueใซใ—ใฆใ„ใŸใŸใ‚ใงใ—ใŸใ€‚
่กจ็คบใƒšใƒผใ‚ธใฎใ™ในใฆใฎiframeใงใ‚‚content scriptใ‚’ๅฎŸ่กŒใ™ใ‚‹ใ‹ใ‚’ๆŒ‡ๅฎšใ™ใ‚‹ใ‚‚ใฎใงใ™ใ€‚
ไปŠๅ›žใฏใ€iframeใฏๅฟ…่ฆใชใ‹ใฃใŸใฎใงใ€offใซใ—ใพใ—ใŸใ€‚

manifest.json
"content_scripts": [
        {
            "matches": [
                "<all_urls>"
            ],
            "js": [
                "content.js"
            ],
            "all_frames": false,
            "match_about_blank": true
        }
    ]

ๅ‚่€ƒ

10
5
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
hayato07

@hayato07(hayato07)

้™ใ‹ใซใ€ๅฅใ‚„ใ‹ใซใ€้ ใใพใง

Today's trending articles

Comments

No comments

Let's comment your feelings that are more than good

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar ๐ŸŽ…

Some calendars come with gifts and some gifts are drawn from all calendars ๐Ÿ‘€

Please tie the article to your calendar and let's enjoy Christmas together!

10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address