πŸŽ‰ Node.js와 ν•¨κ»˜ν•˜λŠ” WhatsApp λ©”μ‹œμ§€ μžλ™ν™”λ‘œ μƒˆν•΄ 인사 πŸŽ‰

λ°œν–‰: (2025λ…„ 12μ›” 29일 μ˜€μ „ 05:46 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

κ°œμš”

Node.js와 whatsapp-web.jsλ₯Ό μ‚¬μš©ν•˜μ—¬ WhatsAppμ—μ„œ μƒˆν•΄ 인사 λ©”μ‹œμ§€λ₯Ό μžλ™μœΌλ‘œ μ „μ†‘ν•©λ‹ˆλ‹€.
μžλ™ν™”λŠ” μ „μ μœΌλ‘œ μ»΄ν“¨ν„°μ—μ„œ μ‹€ν–‰λ˜λ©°, WhatsApp 계정을 λΉ„κ³΅κ°œλ‘œ μœ μ§€ν•˜κ³  자격 증λͺ…을 μ•ˆμ „ν•˜κ²Œ λ³΄ν˜Έν•©λ‹ˆλ‹€.

사전 μš”κ΅¬ 사항

  • Node.js v18 LTS 이상
  • (선택 사항) macOSμ—μ„œ Node.jsλ₯Ό μ‰½κ²Œ μ„€μΉ˜ν•˜κΈ° μœ„ν•œ Homebrew

μ„€μΉ˜

macOS (Homebrew)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brew install node@18
echo 'export PATH="/usr/local/opt/node@18/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

μ„€μΉ˜ 확인:

node -v
npm -v

Windows / μˆ˜λ™ μ„€μΉ˜

Node.js LTS (v18 이상)λ₯Ό λ‹€μš΄λ‘œλ“œν•˜κ³  β€œAdd to PATH” μ˜΅μ…˜μ„ μ²΄ν¬ν•©λ‹ˆλ‹€.

node -v
npm -v

ν”„λ‘œμ νŠΈ μ„€μ •

ν”„λ‘œμ νŠΈ 폴더λ₯Ό λ§Œλ“€κ³  ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.

macOS / Linux

mkdir ~/whatsapp-bot
cd ~/whatsapp-bot
npm init -y
npm install whatsapp-web.js qrcode-terminal formdata-node

Windows

mkdir C:\whatsapp-bot
cd C:\whatsapp-bot
npm init -y
npm install whatsapp-web.js qrcode-terminal formdata-node

슀크립트: contacts2025_send.js

ν”„λ‘œμ νŠΈ 폴더에 contacts2025_send.js νŒŒμΌμ„ λ§Œλ“€κ³  μ•„λž˜ μ½”λ“œλ₯Ό λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€:

// contacts2025_send.js
const { Client, LocalAuth } = require('whatsapp-web.js');

const client = new Client({
  authStrategy: new LocalAuth({ clientId: 'default' }),
  puppeteer: { headless: false } // Opens Chrome for authentication
});

client.on('ready', async () => {
  console.log('βœ… WhatsApp Web authenticated');

  const chats = await client.getChats();
  const contacts2025 = [];

  for (const chat of chats) {
    if (chat.isGroup) continue; // skip groups; remove this line to include groups

    const messages = await chat.fetchMessages({ limit: 50 });
    for (const msg of messages) {
      if (!msg.fromMe) {
        const msgDate = new Date(msg.timestamp * 1000);
        if (msgDate.getFullYear() === 2025) {
          contacts2025.push({
            id: chat.id._serialized,
            name: chat.name || chat.id._serialized
          });
          break;
        }
      }
    }
  }

  console.log('Contacts who messaged you in 2025:');
  contacts2025.forEach(c => console.log(c.name));

  for (const contact of contacts2025) {
    await client.sendMessage(contact.id, 'πŸŽ‰ Happy New Year! πŸŽ‰');
    console.log(`Message sent to ${contact.name}`);
    await new Promise(r => setTimeout(r, 5000)); // 5‑second delay
  }

  client.destroy();
});

client.initialize();

슀크립트 μ‹€ν–‰

macOS / Linux

cd ~/whatsapp-bot
node contacts2025_send.js

Windows

cd C:\whatsapp-bot
node contacts2025_send.js

첫 μ‹€ν–‰ μ‹œ 터미널에 QR μ½”λ“œκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€. WhatsApp β†’ Linked Devices β†’ Link a Deviceμ—μ„œ μŠ€μΊ”ν•˜μ„Έμš”. μ„Έμ…˜μ€ LocalAuth둜 λ‘œμ»¬μ— μ €μž₯λ˜λ―€λ‘œ 이후 μ‹€ν–‰μ—μ„œλŠ” λ‹€μ‹œ μŠ€μΊ”ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ»€μŠ€ν„°λ§ˆμ΄μ§•

κ·Έλ£Ή 포함

λ‹€μŒ 라인을 μ œκ±°ν•˜κ±°λ‚˜ 주석 μ²˜λ¦¬ν•©λ‹ˆλ‹€:

if (chat.isGroup) continue;

κ°œμΈν™” λ©”μ‹œμ§€

정적 λ©”μ‹œμ§€λ₯Ό ν…œν”Œλ¦ΏμœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€:

await client.sendMessage(contact.id, `πŸŽ‰ Happy New Year, ${contact.name}! πŸŽ‰`);

μ§€μ—° μ‹œκ°„ μ‘°μ •

WhatsApp 속도 μ œν•œμ„ κ³ λ €ν•˜μ—¬ νƒ€μž„μ•„μ›ƒμ„ λŠ˜λ¦½λ‹ˆλ‹€:

await new Promise(r => setTimeout(r, 8000)); // 8‑second delay

λ‘œκΉ…

보낸 λ©”μ‹œμ§€λ₯Ό 둜그 νŒŒμΌμ— μΆ”κ°€ν•˜μ—¬ 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€:

const fs = require('fs');
...
await client.sendMessage(contact.id, 'πŸŽ‰ Happy New Year! οΏ½οΏ½');
fs.appendFileSync('sent_log.txt', `${new Date().toISOString()} - Sent to ${contact.name}\n`);
Back to Blog

κ΄€λ ¨ κΈ€

더 보기 Β»

πŸš€ λ‚˜λŠ” WhatsApp Web μžλ™ν™” Chrome ν™•μž₯ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€μ—ˆλ‹€ (Manifest V3)

μ™œ 이걸 λ§Œλ“€μ—ˆλŠ”κ°€? λ‚΄κ°€ 찾은 λŒ€λΆ€λΆ„μ˜ WhatsApp μžλ™ν™” λ„κ΅¬λŠ” λ‹€μŒ 쀑 ν•˜λ‚˜μ˜€λ‹€: - λ„ˆλ¬΄ 곡격적이라 차단 μœ„ν—˜μ΄ λ†’μŒ, ν˜Ήμ€ - νμ‡„ν˜• μ†ŒμŠ€μ΄λ©° μ‚¬μš©μž ν”„λΌμ΄λ²„μ‹œλ₯Ό λ¬΄μ‹œν•¨. λ‚˜λŠ” t...

Python으둜 DOCX 파일의 이미지 μΆ”μΆœ μžλ™ν™”

Python을 μ‚¬μš©ν•œ Word λ¬Έμ„œμ—μ„œ 이미지 μΆ”μΆœ Word λ¬Έμ„œλ₯Ό λ‹€λ£° λ•ŒλŠ” ν…μŠ€νŠΈλΏλ§Œ μ•„λ‹ˆλΌ 이미지도 μ€‘μš”ν•©λ‹ˆλ‹€. μ΄λ―Έμ§€λŠ” λ§Žμ€ λ³΄κ³ μ„œ, ν”„λ ˆμ  ν…Œμ΄μ…˜ 등에 ν•„μˆ˜μ μž…λ‹ˆλ‹€.