Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔔 보은군청 카카오톡 알림 봇

보은군청 일반공고 게시판에 새 글이 올라오면 자동으로 카카오톡으로 알려주는 Node.js 봇입니다.

📋 주요 기능

  • 1시간마다 자동 확인: 보은군청 게시판을 1시간마다 자동으로 크롤링합니다.
  • 📱 카카오톡 알림: 새 게시글이 올라오면 '나에게 보내기'로 즉시 알림을 보냅니다.
  • 🔄 토큰 자동 갱신: Access Token이 만료되면 Refresh Token으로 자동 갱신합니다.
  • 💾 중복 알림 방지: 마지막 확인한 게시글을 저장하여 같은 글을 반복해서 알리지 않습니다.

🚀 시작하기

1단계: 패키지 설치

npm install

필요한 패키지:

  • axios - HTTP 요청
  • cheerio - 웹 크롤링
  • node-cron - 스케줄 관리

2단계: 카카오 API 설정

2-1. 카카오 디벨로퍼스 앱 만들기

  1. Kakao Developers 접속
  2. 로그인 후 내 애플리케이션 메뉴로 이동
  3. 애플리케이션 추가하기 클릭
  4. 앱 이름 입력 (예: "보은군청 알림봇")
  5. 앱이 생성되면 앱 키 메뉴에서 REST API 키 복사

2-2. 카카오 로그인 설정

  1. 좌측 메뉴에서 카카오 로그인 클릭
  2. 활성화 설정을 ON으로 변경
  3. Redirect URI 등록 섹션에서 http://localhost:3000/oauth 추가
  4. 저장

2-3. 메시지 권한 설정

  1. 좌측 메뉴에서 동의 항목 클릭
  2. 카카오톡 메시지 전송 항목 찾기
  3. 설정 버튼 클릭하여 활성화

2-4. 토큰 발급받기

이 부분이 가장 복잡합니다. 처음 한 번만 수동으로 해야 합니다.

방법 1: 브라우저로 수동 발급 (추천)

  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
  1. 카카오 로그인 후 동의하면 주소창이 다음과 같이 변경됩니다:
http://localhost:3000/oauth?code=AUTHORIZATION_CODE
  1. code= 뒤의 값을 복사 (이것이 인증 코드입니다)

  2. 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
  1. 응답에서 access_tokenrefresh_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

3단계: 환경 설정

  1. .env.example 파일을 .env로 복사:
copy .env.example .env
  1. .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_here

4단계: 실행

방법 1: 실행 스크립트 사용 (추천)

Windows:

# 더블클릭으로 실행
start-windows.bat

# 또는 명령 프롬프트에서
.\start-windows.bat

Linux:

# 실행 권한 부여 (처음 한 번만)
chmod +x start-linux.sh

# 실행
./start-linux.sh

방법 2: Node.js 직접 실행

테스트 실행 (추천)

처음 사용하시면 테스트 모드로 실행해보세요:

npm run test
# 또는
node index.js --test

이것은:

  • ✅ 보은군청 게시판 크롤링 테스트
  • ✅ 카카오톡 메시지 전송 테스트 를 실행합니다.

한 번만 실행

node index.js --once

정상 실행 (1시간마다 자동)

npm 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단계의 토큰 발급 과정을 다시 진행하세요.

"크롤링 실패" 오류

  1. 인터넷 연결을 확인하세요.
  2. 보은군청 웹사이트 구조가 변경되었을 수 있습니다. crawler.js의 선택자를 확인하세요.

"메시지 전송 실패" 오류

  1. Access Token이 유효한지 확인하세요.
  2. 카카오 디벨로퍼스에서 '카카오톡 메시지 전송' 권한이 활성화되어 있는지 확인하세요.

💡 유용한 팁

24시간 실행하기

Windows 작업 스케줄러 사용

  1. 작업 스케줄러 열기
  2. "기본 작업 만들기" 선택
  3. 트리거: 시스템 시작 시
  4. 작업: node "D:\MyProject\Work\vscode\bd\index.js" 실행

PM2 사용 (추천)

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-bot

로그 파일 저장

index.js에서 로그를 파일로 저장하려면:

const fs = require('fs');

function log(message) {
  const logMessage = `[${new Date().toISOString()}] ${message}\n`;
  console.log(logMessage);
  fs.appendFileSync('bot.log', logMessage);
}

📱 안드로이드 봇 방식

카카오 API가 너무 복잡하다면, 안드로이드 폰을 활용한 방식도 있습니다:

  1. 메신저봇R 같은 앱을 안드로이드 폰에 설치
  2. Node.js 서버에서 새 게시글 감지 시 안드로이드 폰으로 신호 전송
  3. 안드로이드 앱이 카카오톡 메시지 자동 전송

이 방식이 필요하시면 별도로 말씀해주세요!

📄 라이선스

ISC

🙋‍♂️ 도움이 필요하신가요?

문제가 발생하면:

  1. 에러 메시지를 확인하세요.
  2. .env 파일 설정을 다시 확인하세요.
  3. node index.js --test 명령으로 각 기능을 테스트하세요.

즐거운 코딩 되세요! 🎉

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages