보은군청 일반공고 게시판에 새 글이 올라오면 자동으로 카카오톡으로 알려주는 Node.js 봇입니다.
- ⏰ 1시간마다 자동 확인: 보은군청 게시판을 1시간마다 자동으로 크롤링합니다.
- 📱 카카오톡 알림: 새 게시글이 올라오면 '나에게 보내기'로 즉시 알림을 보냅니다.
- 🔄 토큰 자동 갱신: Access Token이 만료되면 Refresh Token으로 자동 갱신합니다.
- 💾 중복 알림 방지: 마지막 확인한 게시글을 저장하여 같은 글을 반복해서 알리지 않습니다.
npm install필요한 패키지:
axios- HTTP 요청cheerio- 웹 크롤링node-cron- 스케줄 관리
- Kakao Developers 접속
- 로그인 후 내 애플리케이션 메뉴로 이동
- 애플리케이션 추가하기 클릭
- 앱 이름 입력 (예: "보은군청 알림봇")
- 앱이 생성되면 앱 키 메뉴에서 REST API 키 복사
- 좌측 메뉴에서 카카오 로그인 클릭
- 활성화 설정을 ON으로 변경
- Redirect URI 등록 섹션에서
http://localhost:3000/oauth추가 - 저장
- 좌측 메뉴에서 동의 항목 클릭
- 카카오톡 메시지 전송 항목 찾기
- 설정 버튼 클릭하여 활성화
이 부분이 가장 복잡합니다. 처음 한 번만 수동으로 해야 합니다.
방법 1: 브라우저로 수동 발급 (추천)
- 브라우저에서 아래 URL 접속 (YOUR_REST_API_KEY를 실제 키로 변경):
https://kauth.kakao.com/oauth/authorize?client_id=YOUR_REST_API_KEY&redirect_uri=http://localhost:3000/oauth&response_type=code
- 카카오 로그인 후 동의하면 주소창이 다음과 같이 변경됩니다:
http://localhost:3000/oauth?code=AUTHORIZATION_CODE
-
code=뒤의 값을 복사 (이것이 인증 코드입니다) -
PowerShell이나 명령 프롬프트에서 아래 명령 실행:
curl -X POST "https://kauth.kakao.com/oauth/token" \
-d "grant_type=authorization_code" \
-d "client_id=YOUR_REST_API_KEY" \
-d "redirect_uri=http://localhost:3000/oauth" \
-d "code=AUTHORIZATION_CODE"Windows PowerShell의 경우:
$body = @{
grant_type = "authorization_code"
client_id = "YOUR_REST_API_KEY"
redirect_uri = "http://localhost:3000/oauth"
code = "AUTHORIZATION_CODE"
}
Invoke-RestMethod -Uri "https://kauth.kakao.com/oauth/token" -Method Post -Body $body- 응답에서
access_token과refresh_token을 복사
방법 2: 토큰 발급 도우미 스크립트 사용
아래 코드를 getToken.js로 저장하고 실행:
const http = require('http');
const axios = require('axios');
const REST_API_KEY = 'YOUR_REST_API_KEY'; // 여기에 REST API 키 입력
const REDIRECT_URI = 'http://localhost:3000/oauth';
console.log('1. 아래 URL을 브라우저에서 열어주세요:');
console.log(`https://kauth.kakao.com/oauth/authorize?client_id=${REST_API_KEY}&redirect_uri=${REDIRECT_URI}&response_type=code`);
console.log('\n2. 로그인 후 리다이렉트되면 이 스크립트가 자동으로 토큰을 받아옵니다...\n');
const server = http.createServer(async (req, res) => {
const url = new URL(req.url, `http://localhost:3000`);
const code = url.searchParams.get('code');
if (code) {
try {
const response = await axios.post('https://kauth.kakao.com/oauth/token', null, {
params: {
grant_type: 'authorization_code',
client_id: REST_API_KEY,
redirect_uri: REDIRECT_URI,
code: code
}
});
console.log('\n✅ 토큰 발급 성공!\n');
console.log('ACCESS_TOKEN:', response.data.access_token);
console.log('REFRESH_TOKEN:', response.data.refresh_token);
console.log('\n위 토큰들을 .env 파일에 복사하세요!\n');
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('<h1>✅ 토큰 발급 완료!</h1><p>터미널을 확인하세요.</p>');
server.close();
} catch (error) {
console.error('토큰 발급 실패:', error.response?.data || error.message);
res.writeHead(500);
res.end('토큰 발급 실패');
}
}
});
server.listen(3000, () => {
console.log('서버가 http://localhost:3000 에서 대기 중입니다...');
});실행:
node getToken.js.env.example파일을.env로 복사:
copy .env.example .env.env파일을 열어서 발급받은 값들을 입력:
KAKAO_REST_API_KEY=your_rest_api_key_here
KAKAO_REDIRECT_URI=http://localhost:3000/oauth
KAKAO_ACCESS_TOKEN=your_access_token_here
KAKAO_REFRESH_TOKEN=your_refresh_token_hereWindows:
# 더블클릭으로 실행
start-windows.bat
# 또는 명령 프롬프트에서
.\start-windows.batLinux:
# 실행 권한 부여 (처음 한 번만)
chmod +x start-linux.sh
# 실행
./start-linux.sh테스트 실행 (추천)
처음 사용하시면 테스트 모드로 실행해보세요:
npm run test
# 또는
node index.js --test이것은:
- ✅ 보은군청 게시판 크롤링 테스트
- ✅ 카카오톡 메시지 전송 테스트 를 실행합니다.
node index.js --oncenpm start
# 또는
node index.js실행 후 1시간마다 자동으로 게시판을 확인하고 새 글이 있으면 알림을 보냅니다.
종료하려면 Ctrl + C를 누르세요.
boeun-kakao-notifier/
├── package.json # 프로젝트 정보 및 의존성
├── .env # 환경 변수 (카카오 API 키, 토큰)
├── .env.example # 환경 변수 예시
├── config.js # 설정 관리 모듈
├── kakaoAuth.js # 카카오 API 인증 모듈
├── crawler.js # 보은군청 크롤링 모듈
├── notifier.js # 카카오톡 메시지 전송 모듈
├── index.js # 메인 실행 파일
├── tokens.json # 토큰 저장 파일 (자동 생성)
└── lastPost.json # 마지막 게시글 정보 (자동 생성)
index.js 파일에서 스케줄을 변경할 수 있습니다:
// 1시간마다 (기본)
cron.schedule('0 * * * *', () => { ... });
// 30분마다
cron.schedule('*/30 * * * *', () => { ... });
// 매일 오전 9시
cron.schedule('0 9 * * *', () => { ... });
// 월-금 오전 9시부터 오후 6시까지 매시간
cron.schedule('0 9-18 * * 1-5', () => { ... });crawler.js 파일에서 URL을 변경하면 다른 게시판도 확인할 수 있습니다:
this.targetUrl = 'https://www.boeun.go.kr/prog/bbs/all/sub02_01_01/list.do';.env 파일에 토큰이 제대로 설정되지 않았습니다. 2단계를 다시 확인하세요.
Refresh Token이 만료되었거나 잘못되었습니다. 2단계의 토큰 발급 과정을 다시 진행하세요.
- 인터넷 연결을 확인하세요.
- 보은군청 웹사이트 구조가 변경되었을 수 있습니다. crawler.js의 선택자를 확인하세요.
- Access Token이 유효한지 확인하세요.
- 카카오 디벨로퍼스에서 '카카오톡 메시지 전송' 권한이 활성화되어 있는지 확인하세요.
- 작업 스케줄러 열기
- "기본 작업 만들기" 선택
- 트리거: 시스템 시작 시
- 작업:
node "D:\MyProject\Work\vscode\bd\index.js"실행
PM2는 Node.js 프로세스 관리 도구입니다:
# PM2 설치
npm install -g pm2
# 봇 시작
pm2 start index.js --name boeun-bot
# 부팅 시 자동 시작 설정
pm2 startup
pm2 save
# 상태 확인
pm2 status
# 로그 확인
pm2 logs boeun-bot
# 중지
pm2 stop boeun-bot
# 재시작
pm2 restart boeun-botindex.js에서 로그를 파일로 저장하려면:
const fs = require('fs');
function log(message) {
const logMessage = `[${new Date().toISOString()}] ${message}\n`;
console.log(logMessage);
fs.appendFileSync('bot.log', logMessage);
}카카오 API가 너무 복잡하다면, 안드로이드 폰을 활용한 방식도 있습니다:
- 메신저봇R 같은 앱을 안드로이드 폰에 설치
- Node.js 서버에서 새 게시글 감지 시 안드로이드 폰으로 신호 전송
- 안드로이드 앱이 카카오톡 메시지 자동 전송
이 방식이 필요하시면 별도로 말씀해주세요!
ISC
문제가 발생하면:
- 에러 메시지를 확인하세요.
.env파일 설정을 다시 확인하세요.node index.js --test명령으로 각 기능을 테스트하세요.
즐거운 코딩 되세요! 🎉