라즈베리파이에 텔레그램 봇 올려서 알림받기
본문 바로가기
IT/파이썬

라즈베리파이에 텔레그램 봇 올려서 알림받기

by SageIN 2025. 3. 4.
반응형

1. 텔레그램 봇 만들기

  1. 텔레그램 앱에서 BotFather 검색:
    • 텔레그램 앱을 열고 BotFather를 검색하세요. BotFather는 텔레그램 봇을 생성할 수 있는 공식 봇입니다.
  2. 봇 생성하기:
    • BotFather와 채팅을 시작한 후, /newbot을 입력하여 새로운 봇을 만듭니다.
    • 봇의 이름을 입력하고, 고유한 사용자 이름(유저네임)을 설정합니다. 이 유저네임은 @를 포함해야 하며, 이미 존재하는 이름은 사용할 수 없습니다.
  3. API Token 받기:
    • 봇을 생성하면 BotFather가 봇을 위한 API 토큰을 제공합니다. 이 토큰은 봇을 제어하는 데 필요하니 잘 보관해 주세요.

2. 봇 코드 작성

라이브러리 설치

pip install python-telegram-bot

 

코드

농업기술센터와 시청 공지사항을 알림으로 받으려고 만든 코드입니다. 

import requests
from bs4 import BeautifulSoup
from telegram.ext import Application
import asyncio
import datetime
from urllib.parse import urljoin
# 봇 API 토큰
BOT_TOKEN = '봇파더에서 받은 코드 넣기'

# 채널 ID (예: @channelusername)
CHANNEL_ID = '채널 ID 넣기'

# 크롤링할 URL 리스트
URL_list = [
        'https://www.seosan.go.kr/agritech/selectBbsNttList.do?bbsNo=15&key=882',
    'https://www.seosan.go.kr/agritech/selectBbsNttList.do?bbsNo=13&key=879',
	'https://www.seosan.go.kr/emd/selectBbsNttList.do?bbsNo=196&key=1769',
	'https://www.seosan.go.kr/www/selectBbsNttList.do?key=1256&bbsNo=97'
]

# 이미 전송된 게시물을 추적하기 위한 집합
sent_posts = set()

async def fetch_latest_posts():
    """
    URL_list에 있는 페이지를 크롤링하고, 새로운 게시물을 찾습니다.
    """
    new_posts = []
    for url in URL_list:
        response = requests.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        # 각 사이트의 구조에 따라 다른 CSS 선택자 사용
        if 'seosan.go.kr/agritech' in url:
            # 농업기술센터 사이트: 게시글 제목은 표의 특정 셀 내 링크에 있음
            post_links = soup.select('td.subject a')
            if not post_links:
                post_links = soup.select('table tbody tr td.title a')  # 예비 선택자
        elif 'seosan.go.kr/emd' in url:
            # 읍면동 사이트: 농업기술센터와 유사한 구조로 처리
            post_links = soup.select('td.subject a')
            if not post_links:
                post_links = soup.select('table tbody tr td.title a')
        elif 'seosan.go.kr/www' in url and 'selectBbsNttList.do?key=1256&bbsNo=97' in url:
            # 서산시청 메인 사이트 (고시/공고 페이지): 목록이 리스트로 구성되어 있을 수 있음
            post_links = soup.select('td.subject a')
            if not post_links:
                # 표 형태일 경우 대비
                post_links = soup.select('td.subject a')
        else:
            # 기타 경우: 게시글 상세 페이지 링크 패턴으로 검색
            post_links = soup.select('a[href*="selectBbsNttView.do"]')
        # 크롤링한 게시글의 제목과 전체 링크 추출
        for a in post_links:
            title = a.get_text(strip=True)
            link = a.get('href', '')
            if not link:
                continue
            # 상대경로 링크 처리: 도메인과 결합하여 전체 URL 생성
            full_link = urljoin(url, link)
            # 이미 보낸 게시글은 건너뛰기
            if full_link not in sent_posts:
                new_posts.append((title, full_link))
                sent_posts.add(full_link)
    return new_posts

async def send_new_posts():
    """
    새로운 게시물을 텔레그램 채널에 전송합니다.
    """
    new_posts = await fetch_latest_posts()
    if new_posts:
        for title, link in new_posts:
            message = f'새로운 게시물이 등록되었습니다:\n\n제목: {title}\n링크: {link}'
            await application.bot.send_message(chat_id=CHANNEL_ID, text=message)
    else:
        # 새 게시물이 없을 경우 메시지 전송
        await application.bot.send_message(chat_id=CHANNEL_ID, text="오늘은 새로운 게시물이 없습니다.")

async def schedule_posts():
    """
    매일 아침 10시와 오후 6시에 게시물을 전송합니다.
    """
    while True:
        
        now = datetime.datetime.now()
        print(now)
        next_10am = now.replace(hour=10, minute=0, second=0, microsecond=0)
        next_6pm = now.replace(hour=18, minute=0, second=0, microsecond=0)

        # 현재 시간이 이미 10시나 18시 이후라면 다음 날로 설정
        if now > next_10am:
            next_10am += datetime.timedelta(days=1)
        if now > next_6pm:
            next_6pm += datetime.timedelta(days=1)

        # 다음 알림 시간 계산
        next_alarm = min(next_10am, next_6pm)
        sleep_seconds = (next_alarm - now).total_seconds()
        print(f"다음 알림 시간: {next_alarm}. {sleep_seconds:.2f}초 후 실행합니다.")

        # 다음 알림 시간까지 대기
        await asyncio.sleep(sleep_seconds)
        
        # 게시물 전송
        await send_new_posts()

# Application 객체 전역 생성
application = Application.builder().token(BOT_TOKEN).build()

# 메인 실행
if __name__ == '__main__':
    print("텔레그램 봇 시작 중...")
    asyncio.run(schedule_posts())

 

3: Systemd 서비스로 설정 

1. 서비스 파일 작성

/etc/systemd/system/telegram_bot.service 파일을 생성합니다.

sudo nano /etc/systemd/system/telegram_bot.service

 

 

아래 내용을 붙여 넣습니다. (파일 경로를 실제 Python 스크립트 위치로 변경하세요.)

 

[Unit]
Description=Telegram Bot Service
After=network.target

[Service]
ExecStart=/usr/bin/python3 /path/to/your_script.py
Restart=always
User=your_user_name
WorkingDirectory=/path/to/your_script_directory

[Install]
WantedBy=multi-user.target
  • ExecStart: Python 스크립트 실행 경로를 설정.
  • User: 봇을 실행할 사용자 이름.
  • WorkingDirectory: 스크립트가 위치한 디렉토리.
     

2. 서비스 파일 등록 및 실행

서비스 등록

 
sudo systemctl daemon-reload sudo systemctl enable telegram_bot.service

 

서비스 시작

sudo systemctl start telegram_bot.service

 

서비스 상태확

sudo systemctl status telegram_bot.service

3. 서비스 로그 확인

journalctl -u telegram_bot.service -f

 

반응형

댓글


TOP

Designed by 티스토리