전체 보기

크롬 확장프로그램 개발 시작하기

작성일자
2023/05/22
태그
ETC
프로젝트
책 종류
1 more property

크롬 확장 프로그램 만들기

서론

현재 수강 중인 기계 학습 심화 수업에서 프로젝트를 진행 중인데, 우리 팀의 주제는 문자 captcha solver 만들기다,,, 나는 그 중 captcha solver 모델을 주입한 크롬 확장 프로그램 만들기를 맡았다,,,,, 확장 프로그램 개발에 관심 있었지만, 한 번도 해본 적 없었어서 바로 내가 하겠다고 했다! 어차피 확장 프로그램 개발 경험이 있는 사람이 없어서 누군가 나서야 하는 상황이었다
오늘은 그 과정을 정리해보겠다. 크롬 확장 프로그램 만드는 게 처음이라 살짝 쫄았는데 그냥 웹 페이지 만드는 작업이랑 거의 똑같다. 어렵지 않다. 다만, ai 모델을 주입하는 게 살짝 어려울 것 같지만 이는 내일 마무리 작업할 것 같다!

본론

가장 먼저 내가 작업중인 리포지토리다!
Chrome-Extension
Captcha-Recognition-Team

1. 정의

확장 프로그램을 개발할 때 보통은 프론트 로직으로만 구현하기도 하고, db 저장이 필요하거나 하면 백엔드쪽도 붙는 거 같다. 웹 개발을 해본 사람들이라면 분명 쉽게 적응할 수 있다. 도전해보자!

2. 과정

manifest.json ← 확장 프로그램 만드는 데 꼭 필요한 녀석이다. 이 녀석을 통해 만든 웹페이지를 확장 프로그램 형식으로 올릴 수 있다.
{ "manifest_version": 3, "name": "Capture Extension", "version": "1.0", "permissions": ["activeTab"], "action": { "default_popup": "popup.html" }, "background": { "service_worker": "background.js" } }
JSON
복사
popup.html
<!DOCTYPE html> <html> <head> <title>Capture Extension</title> <script src="popup.js"></script> <style> body { width: 300px; height: 150px; } </style> </head> <body> <button id="captureButton">Capture</button> <div id="imageContainer"></div> </body> </html>
HTML
복사
popup.js
따로 만드는 이유 : 크롬확장프로그램은 보안상 html에 inline방식으로 js 코드를 넣을 수 없다!! 실제로 inline으로 js코드를 넣어보면 동작하지 않는 걸 확인할 수 있다. 하지만, 이렇게 js 파일을 분리해 넣어주면 넣어진다!
아래 코드는 나는 캡처 기능을 만들어 보고 싶어 넣은 코드인데, 간단한 확장 프로그램 만들기 테스트만 해보고 싶은 사람은 그냥 popup.js 파일 자체를 만들지 말자!
document.addEventListener("DOMContentLoaded", function () { const captureButton = document.getElementById("captureButton"); const imageContainer = document.getElementById("imageContainer"); let isCapturing = false; let startX, startY; captureButton.addEventListener("click", function () { if (!isCapturing) { isCapturing = true; captureButton.textContent = "Stop Capture"; document.body.style.cursor = "crosshair"; } else { isCapturing = false; captureButton.textContent = "Capture"; document.body.style.cursor = "default"; } }); document.addEventListener("mousedown", function (event) { if (isCapturing) { startX = event.clientX; startY = event.clientY; } }); document.addEventListener("mouseup", function (event) { if (isCapturing) { const endX = event.clientX; const endY = event.clientY; const left = Math.min(startX, endX); const top = Math.min(startY, endY); const width = Math.abs(endX - startX); const height = Math.abs(endY - startY); chrome.tabs.captureVisibleTab(function (screenshotUrl) { const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); const image = new Image(); image.onload = function () { canvas.width = width; canvas.height = height; context.drawImage(image, left, top, width, height, 0, 0, width, height); const capturedImageUrl = canvas.toDataURL("image/png"); const capturedImage = new Image(); capturedImage.src = capturedImageUrl; imageContainer.innerHTML = ""; imageContainer.appendChild(capturedImage); }; image.src = screenshotUrl; }); isCapturing = false; captureButton.textContent = "Capture"; document.body.style.cursor = "default"; } }); });
JavaScript
복사
background.js
이 부분도 나는 추가적인 작업을 위해 만들어둔 것인데, 간단한 테스트만 원하는 사람은 만들지 말자!
chrome.action.onClicked.addListener(function (tab) { chrome.tabs.captureVisibleTab(function (screenshotUrl) { // 캡처된 이미지를 사용하여 원하는 작업 수행 // 예: 이미지 저장, API 전송 등 console.log(screenshotUrl); }); });
JavaScript
복사

3. 실행

결론적으로 manifest.json과 popup.html 만 있으면 사실상 확장프로그램 하나 뚝딱 만들 수 있다. 물론 세부 기능은 부족하겠지만,, 실행하는 법은 매우매우 간단하다!
크롬 오른쪽 상단에 퍼즐모양을 누르면 확장프로그램 팝업이 뜨는데 거기서 가장 하단을 보면 확장 프로그램 관리라는 페이지로 들어갈 수 있다.
해당 페이지에서 압축 해제된 확장프로그램을 로드합니다 를 클릭하고 html, js 파일들이 들어있는 폴더 자체를 선택해 로드해주면 끝이다!
다시 퍼즐모양을 누르면 확장프로그램 팝업 속에 내가 만든 확장프로그램이 올라와있다! 이를 클릭해서 만든 걸 확인하면 끝이다.
만일 코드를 수정하고 새 버전을 다시 확인하고 싶다면 확장 프로그램 관리 페이지에 다시 들어가보면 내가 올려둔 확장프로그램이 목록에 있을텐데 그 프로그램의 새로 고침 버튼을 눌러주면 끝이다!

결론

오늘은 단순히 팝업창을 띄우는 것만 했지만, 내일은 팝업창을 띄우고 기존 탭 페이지에 조작을 가해보겠다. 이도 크게 어렵지 않다.