Overview
๋๋ฌด์ํค ์ค์๊ฐ ๊ฒ์์ด ์์ ์์นด๋ผ์ด๋ธ ๋งํฌ๋ฅผ ์ถ๊ฐํ๊ณ , ๊ฒ์์ด ๋ณ๊ฒฝ์ ์๋ ์ถ์ ํฉ๋๋ค
# ๋๋ฌด์ํค ์ค๊ฒ ์์นด๋ผ์ด๋ธ ๋ง์ปค ๋๋ฌด์ํค ์ค์๊ฐ ๊ฒ์์ด ์์ ์์นด๋ผ์ด๋ธ ๋งํฌ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํด์ฃผ๋ Chrome Extension์ ๋๋ค. ## ๐ ํ๋ก์ ํธ ๊ฐ์ - **ํ์ **: Chrome Extension (Manifest V3) - **๋ชฉ์ **: ๋๋ฌด์ํค ์ค์๊ฐ ๊ฒ์์ด์์ ์์นด๋ผ์ด๋ธ๋ก ๋น ๋ฅด๊ฒ ์ด๋ ## ๐ฏ ์ฃผ์ ๊ธฐ๋ฅ - โ ๋๋ฌด์ํค ์ค์๊ฐ ๊ฒ์์ด ์๋ ๊ฐ์ง - โ ๊ฐ ๊ฒ์์ด ์์ ์์นด๋ผ์ด๋ธ ๋งํฌ ์ถ๊ฐ (์?) - โ **์์นด๋ผ์ด๋ธ ๋๋ฌด์ํค ์ค๊ฒ ์ฑ๋** (`/b/namuhotnow`)์์ ํด๋น ํค์๋ ๊ฒ์ - โ ์ค๊ฒ ๊ฐฑ์ ์ ์๋์ผ๋ก ๋งํฌ ์ ๋ฐ์ดํธ - โ **์ค์๊ฐ ๊ฒ์์ด ๋ณ๊ฒฝ ์ถ์ ** (v1.1.0 NEW!) - ๊ฒ์์ด ์ถ๊ฐ/๋ณ๊ฒฝ/์ญ์ ์๋ ๊ฐ์ง - Fade ์ ๋๋ฉ์ด์ ์ผ๋ก ๋ถ๋๋ฌ์ด ๋งํฌ ์ ๋ฐ์ดํธ - โ ๋คํฌ๋ชจ๋/๋ผ์ดํธ๋ชจ๋ ์ง์ - โ ๋ฐ์ํ ๋์์ธ ## ๐ฆ ์ค์น ๋ฐฉ๋ฒ ### Chrome ์น์คํ ์ด์์ ์ค์น (์ถ์ ์์ ) **ํ์ฌ Chrome ์น์คํ ์ด ์ ์ถ ์ค๋น ์ค์ ๋๋ค!** ์ถ์ ํ ๋งํฌ๊ฐ ์ถ๊ฐ๋ ์์ ์ ๋๋ค. ### ๋ก์ปฌ์์ ๊ฐ๋ฐ์ ๋ชจ๋๋ก ์ค์น 1. ์ด ์ ์ฅ์๋ฅผ ํด๋ก ํ๊ฑฐ๋ ๋ค์ด๋ก๋ํฉ๋๋ค. ```bash git clone https://github.com/[username]/namu_arca.git cd namu_arca ``` 2. Chrome ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฝ๋๋ค. 3. ์ฃผ์์ฐฝ์ `chrome://extensions/` ๋ฅผ ์ ๋ ฅํฉ๋๋ค. 4. ์ฐ์ธก ์๋จ์ **"๊ฐ๋ฐ์ ๋ชจ๋"** ๋ฅผ ํ์ฑํํฉ๋๋ค. 5. **"์์ถ ํด์ ๋ ํ์ฅ ํ๋ก๊ทธ๋จ ๋ก๋"** ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค. 6. ๋ค์ด๋ก๋ํ ํ๋ก์ ํธ ํด๋๋ฅผ ์ ํํฉ๋๋ค. 7. ์ต์คํ ์ ์ด ์ค์น๋์์ต๋๋ค! ๐ ### 2. ์์ด์ฝ ์ถ๊ฐ (์ ํ์ฌํญ) `icons/` ํด๋์ ๋ค์ ํฌ๊ธฐ์ ์์ด์ฝ์ ์ถ๊ฐํ์ธ์: - `icon16.png` - 16x16 ํฝ์ - `icon48.png` - 48x48 ํฝ์ - `icon128.png` - 128x128 ํฝ์ ์์ด์ฝ ์์ด๋ ์ต์คํ ์ ์ ์ ์ ์๋ํฉ๋๋ค. ## ๐ ์ฌ์ฉ ๋ฐฉ๋ฒ 1. [๋๋ฌด์ํค](https://namu.wiki) ๋ฉ์ธ ํ์ด์ง์ ์ ์ํฉ๋๋ค. 2. ์ค์๊ฐ ๊ฒ์์ด ์น์ ์ ํ์ธํฉ๋๋ค. 3. ๊ฐ ๊ฒ์์ด ์์ **์?** ๋งํฌ๊ฐ ์๋์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค. 4. ๋งํฌ๋ฅผ ํด๋ฆญํ๋ฉด ์์นด๋ผ์ด๋ธ ๋๋ฌด์ํค ์ค๊ฒ ์ฑ๋(`/b/namuhotnow`)์ ํด๋น ํค์๋ ๊ฒ์ ๊ฒฐ๊ณผ๋ก ์ด๋ํฉ๋๋ค. ## ๐ ๏ธ ๊ธฐ์ ์คํ - **JavaScript** (Vanilla) - **Chrome Extension API** - Content Scripts - MutationObserver - **CSS** (๋คํฌ๋ชจ๋ ์ง์) - **Manifest V3** ## ๐ ํ๋ก์ ํธ ๊ตฌ์กฐ ``` namu_arca/ โโโ manifest.json # Chrome Extension ์ค์ โโโ content.js # ๋ฉ์ธ ๋ก์ง (DOM ์กฐ์, ๋งํฌ ์ถ๊ฐ) โโโ styles.css # ๋งํฌ ์คํ์ผ๋ง โโโ icons/ # ์์ด์ฝ ์ด๋ฏธ์ง ํด๋ โ โโโ README.md # ์์ด์ฝ ์ถ๊ฐ ์๋ด โโโ README.md # ํ๋ก์ ํธ ์ค๋ช ``` ## ๐ ์๋ ์๋ฆฌ ### 1. ์ค๊ฒ ๊ฐ์ง ์ฌ๋ฌ CSS ์ ํ์๋ฅผ ์๋ํ์ฌ ๋๋ฌด์ํค์ ์ค์๊ฐ ๊ฒ์์ด๋ฅผ ์ฐพ์ต๋๋ค: ```javascript const REALTIME_SELECTORS = [ '[class*="realtime"] li a', '[class*="trending"] li a', '[class*="popular"] li a' // ... ๋ ๋ง์ ์ ํ์ ] ``` ### 2. ์์นด๋ผ์ด๋ธ ๋งํฌ ์์ฑ ๊ฐ ๊ฒ์์ด์ ๋ํด ์์นด๋ผ์ด๋ธ `/b/namuhotnow` ์ฑ๋ ๊ฒ์ URL์ ์์ฑํฉ๋๋ค: ```javascript function getArcaSearchUrl(keyword) { const encodedKeyword = encodeURIComponent(keyword) return `https://arca.live/b/namuhotnow?target=all&keyword=${encodedKeyword}` } ``` ### 3. ๋์ ๊ฐ์ง ๋ฐ ๋ณ๊ฒฝ ์ถ์ MutationObserver๋ฅผ ์ฌ์ฉํ์ฌ ์ค๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค: ```javascript const observer = new MutationObserver(mutations => { childList: true, // DOM ์ถ๊ฐ/์ ๊ฑฐ ๊ฐ์ง attributes: true, // ์์ฑ ๋ณ๊ฒฝ ๊ฐ์ง attributeFilter: ['href'] // href ์์ฑ๋ง ๊ฐ์ }) ``` ### 4. ๊ฒ์์ด ๋ณ๊ฒฝ ๊ฐ์ง (v1.1.0 NEW!) ๊ฒ์์ด๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก ๊ฐ์งํ๊ณ Diff ๊ณ์ฐ์ ์ํํฉ๋๋ค: ```javascript // ๋ณ๊ฒฝ ํ์ : added, modified, removed const changes = detectKeywordChanges() // ๊ฐ ๋ณ๊ฒฝ์ ๋ํด ๋งํฌ ์ ๋ฐ์ดํธ for (const change of changes) { if (change.type === 'modified') { // Fade-out (200ms) โ ์ ๊ฑฐ โ ์์ฑ โ Fade-in (200ms) await updateExistingLink(element, oldKeyword, newKeyword) } } ``` ## ๐งช ๋๋ฒ๊น ๋ฐ ํ ์คํธ ### ์ฝ์ ๋ก๊ทธ ํ์ธ 1. ๋๋ฌด์ํค ํ์ด์ง์์ `F12`๋ฅผ ๋๋ฌ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ฝ๋๋ค. 2. **Console** ํญ์ ํ์ธํฉ๋๋ค. 3. ๋ค์๊ณผ ๊ฐ์ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค: ``` [๋๋ฌด์ํค ์์นด๋ง์ปค] ์ต์คํ ์ ์์ [๋๋ฌด์ํค ์์นด๋ง์ปค] ์ ํ์ "..." ๋ก N๊ฐ ํญ๋ชฉ ๋ฐ๊ฒฌ [๋๋ฌด์ํค ์์นด๋ง์ปค] N๊ฐ ํญ๋ชฉ์ ๋งํฌ ์ถ๊ฐ ์๋ฃ ``` ### ์ค๊ฒ์ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝ์ฐ ๋ก๊ทธ์ "์ค์๊ฐ ๊ฒ์์ด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค"๊ฐ ํ์๋๋ ๊ฒฝ์ฐ: 1. ๊ฐ๋ฐ์ ๋๊ตฌ(F12)์์ **Elements** ํญ์ ์ฝ๋๋ค. 2. ์ค์๊ฐ ๊ฒ์์ด ์น์ ์ ์ฐพ์ HTML ๊ตฌ์กฐ๋ฅผ ํ์ธํฉ๋๋ค. 3. ์ ํํ ํด๋์ค๋ช ์ด๋ ID๋ฅผ ํ์ ํฉ๋๋ค. 4. `content.js`์ `REALTIME_SELECTORS` ๋ฐฐ์ด์ ํด๋น ์ ํ์๋ฅผ ์ถ๊ฐํฉ๋๋ค: ```javascript const REALTIME_SELECTORS = [ // ๊ธฐ์กด ์ ํ์๋ค... '.your-new-selector' // ์ฌ๊ธฐ์ ์ถ๊ฐ ] ``` 5. ์ต์คํ ์ ์ ์๋ก๊ณ ์นจํฉ๋๋ค (`chrome://extensions/`์์ ๐ ๋ฒํผ ํด๋ฆญ). ## ๐จ ์ปค์คํฐ๋ง์ด์ง ### ๋งํฌ ํ ์คํธ ๋ณ๊ฒฝ `content.js`์์ ๋งํฌ ํ ์คํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค: ```javascript arcaLink.textContent = '์?' // ์ํ๋ ํ ์คํธ๋ก ๋ณ๊ฒฝ ``` ### ์คํ์ผ ๋ณ๊ฒฝ `styles.css`์์ ๋งํฌ์ ์์, ํฌ๊ธฐ, ๋ชจ์ ๋ฑ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค: ```css .arca-link { color: #0066cc; /* ์์ ๋ณ๊ฒฝ */ font-size: 11px; /* ํฌ๊ธฐ ๋ณ๊ฒฝ */ border-radius: 3px; /* ๋ฅ๊ทผ ๋ชจ์๋ฆฌ */ /* ... */ } ``` ### ์์นด๋ผ์ด๋ธ ์ฑ๋ ๋ณ๊ฒฝ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ฌด์ํค ์ค๊ฒ ์ฑ๋(`/b/namuhotnow`)๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฑ๋๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด `content.js`์ `getArcaSearchUrl` ํจ์๋ฅผ ์์ ํ์ธ์: ```javascript function getArcaSearchUrl(keyword) { const encodedKeyword = encodeURIComponent(keyword) return `https://arca.live/b/your-channel?target=all&keyword=${encodedKeyword}` // ์ฑ๋ ๋ณ๊ฒฝ } ``` ## ๐ ์๋ ค์ง ์ด์ 1. **์ค๊ฒ์ ์ฐพ์ง ๋ชปํ๋ ๊ฒฝ์ฐ** - ๋๋ฌด์ํค ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์์ ์ ์์ต๋๋ค. - ์์ "๋๋ฒ๊น ๋ฐ ํ ์คํธ" ์น์ ์ ์ฐธ๊ณ ํ์ธ์. 2. **๋งํฌ๊ฐ ์ค๋ณต ์์ฑ๋๋ ๊ฒฝ์ฐ** - ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจํ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค. - ์ง์๋๋ ๊ฒฝ์ฐ ์ด์๋ฅผ ์ ๋ณดํด์ฃผ์ธ์. ## ๐ค ๊ธฐ์ฌํ๊ธฐ ๋ฒ๊ทธ ์ ๋ณด, ๊ธฐ๋ฅ ์ ์, Pull Request ๋ชจ๋ ํ์ํฉ๋๋ค! 1. Fork the Project 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 4. Push to the Branch (`git push origin feature/AmazingFeature`) 5. Open a Pull Request ## ๐ ๋ฌธ์ ํ๋ก์ ํธ ๋งํฌ: [https://github.com/jellive/namu_arca_linker](https://github.com/jellive/namu_arca_linker) ## ๐ ๊ฐ์ฌ์ ๋ง - [๋๋ฌด์ํค](https://namu.wiki) - ์ค์๊ฐ ๊ฒ์์ด ๋ฐ์ดํฐ ์ ๊ณต - [์์นด๋ผ์ด๋ธ](https://arca.live) - ์ปค๋ฎค๋ํฐ ํ๋ซํผ --- #chrome-extension #side-project #namuwiki #arca-live #Jell
Details
- Version1.1.0
- UpdatedNovember 12, 2025
- Size27.41KiB
- Languagesํ๊ตญ์ด
- DeveloperWebsite
Email
jellive7@gmail.com - Non-traderThis developer has not identified itself as a trader. For consumers in the European Union, please note that consumer rights do not apply to contracts between you and this developer.
Privacy
This developer declares that your data is
- Not being sold to third parties, outside of the approved use cases
- Not being used or transferred for purposes that are unrelated to the item's core functionality
- Not being used or transferred to determine creditworthiness or for lending purposes
Support
For help with questions, suggestions, or problems, visit the developer's support site