ใฏใใใซ
ใใใฏใฏใฝใขใใช Advent Calendar 2021ใฎ19ๆฅ็ฎใฎ่จไบใงใใ
ใใใฏใฏใฝใขใใชๅๆฅใฎใซใฌใณใใผใ่ฆใฆใใๆใฎใใจใ
ใ้ปๅๆ้ทใใใใขใใช้ข็ฝใ๏ผใใ ใฏใชใใฏใ็ถใใใฎใใใฉใใใใใใใใ๏ผใ
ใจใใใใจใงใใซใฌใณใใผใซๅๅๆฆใใใใใซใ่ชๅใงใฏใชใใฏใใไปฃใใใซใ่ชๅใงใใฆใใใChromeๆกๅผตใใคใใใใจใซใชใใพใใใ
้ปๅใฎๆ้ทใไฝ้จใงใใใฏใฝใขใใชใซใคใใฆใฏใใกใ
ไฝฟใๆน
- ้ฃๆใใใ่ฆ็ด ใๅณใฏใชใใฏ
- [้ฃๆใใ]ใ้ธๆ
- ใใจใฏๅพ ใคใ ใ
ๆ่กในใฟใใฏ
- HTML
- CSS
- JavaScript
ใใจใใจReact+TypeScriptใงใๆกๅผตๆฉ่ฝใไฝๆใใใใจใใใฎใงใใใๆกๅผตๆฉ่ฝใฎไฝๆใTypeScriptใฏๅ จใใฎๆช็ต้จใ ใฃใใฎใง้ๆปใงๆซๆใใพใใใ
ใใจใซใใๅใใใฎใไฝใฃใฆใใใๅไปใใ ใฃใใใใชใผใใใซใชใณใผใใไฝใฃใใใใใใใใ่ใใ็งใฏใๆฌๅฝใซไธ็ชๅๆญฉ็ใชๆ่กในใฟใใฏใ็จใใฆไฝๆใใใใจใซใใพใใใใใใงใ้ๅธธใซ่ฉฐใพใใพใใใ
ๅฎ่ฃ
Chromeๆกๅผตใฎๅบ็ค็ฅ่ญ(content sctipt, action, pageใจใใ3ใคใฎๆฆๅฟต)ใใใฃใใๅญฆใใ ๅพใไปฅไธใฎใใใชๆตใใงไฝๆใใใใพใใใ(manifest_version:3ใงๅไฝใใใใใซไฝๆใใฆใใพใ)
- ้ฃๆใซ้ขใใ่จญๅฎ
- ใณใณใใญในใใกใใฅใผใฎไฝๆ
- ใกใใฅใผ้ธๆๆใฎ่ฆ็ด ๅๅพใ้ฃๆๅฎ่ก
้ฃๆใซ้ขใใ่จญๅฎ
"action": {
"default_title": "้ฃๆใใณ",
"default_popup": "popup.html"
},
"permissions": [
"storage"
],
ใใจใใจbrowser_action(ๅ
จใใผใธ)ใจpage_action(็นๅฎใใผใธ)ใซๅใใใฆใใพใใใใmanifest_version:3ใงactionใซ็ตฑไธใใใพใใใ
permissionsใซใคใใฆใฏใๅพใปใฉ่ชฌๆใใพใใ
<!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>
// ่ชญใฟ่พผใฟๆใซใๆขๅญใฎ่จญๅฎใๅๆ
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)
ใใณใณใใญในใใกใใฅใผใฎไฝๆ
"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ใธใฎใขใฏใปในๆจฉ)
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ๅดใงๅณใฏใชใใฏใ่กใฃใๆใฎ่ฆ็ด ใๅๅพใใฆใใใๅฎ้ใซใกใใฅใผใใฏใชใใฏใใใๅ ดๅใใฎ่ฆ็ด ใ้ฃๆใใใใใซใใพใใใ
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"content.js"
],
"all_frames": false,
"match_about_blank": true
}
]
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
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ใซใใพใใใ
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"content.js"
],
"all_frames": false,
"match_about_blank": true
}
]

Comments
Let's comment your feelings that are more than good