반응형
1. 텔레그램 봇 만들기
- 텔레그램 앱에서 BotFather 검색:
- 텔레그램 앱을 열고 BotFather를 검색하세요. BotFather는 텔레그램 봇을 생성할 수 있는 공식 봇입니다.
- 봇 생성하기:
- BotFather와 채팅을 시작한 후, /newbot을 입력하여 새로운 봇을 만듭니다.
- 봇의 이름을 입력하고, 고유한 사용자 이름(유저네임)을 설정합니다. 이 유저네임은 @를 포함해야 하며, 이미 존재하는 이름은 사용할 수 없습니다.
- 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
반응형
댓글