NAS서버에서 텔레그램 봇 이미지 예약 전송하기
2024. 10. 18. 08:31
이번에는 텔레그램 봇으로 이미지를 주중 예약된 시간에 전송하는 방법을 알아보겠습니다.
시작하기에 앞서 VSCode, 파이썬, 레이드라이브등 기본적인 것들은 설치되었단 가정하에 작성하겠습니다.
텔레그램 설정
▲ 텔레그램 검색창에 BotFather을 검색
▲ /start
▲ /newbot -> 봇 이름 설정 -> 유저네임 설정
▲ 텔레그램 봇 채팅방 주소와 토큰 API가 생성됩니다.
API는 클릭하면 자동으로 복사가 됩니다.
크롬 설정
▲ 크롬 확장 프로그램 -> JSON Viewer 설치
https://api.telegram.org/bot[토큰]/getUpdates
https://api.telegram.org/bot[토큰]/getUpdates
▲ 텔레그램에 있는 토큰 API를 복사하여 위 주소의 토큰 부분에 입력
▲ 완성된 URL 주소를 크롬 주소창에 입력
"ok": true 가 나오면 정상작동이 된 것입니다.
텔레그램 CHAT_ID 획득하기
▲ 텔레그램에 이미지를 받을 사람들을 모아 방을 하나 만듭니다.
▲ BotFather방에서 t.me/로 시작된 링크를 클릭하여 텔레그램 봇 방으로 들어갑니다
▲ 봇 이름을 클릭
▲ 그룹에 추가하여 조금 전에 만든 새로운 방으로 입장합니다
또는 봇의 유저네임을 @your_bot_username 검색하여 추가할 수 있습니다
https://api.telegram.org/bot[토큰]/getUpdates
▲ 그곳에서 채팅을 한 후 위 주소를 새로고침합니다.
▲ 새로고침을 하면 chat_id를 확인할 수 있습니다
VSCode
from telegram import Bot
# 1. 텔레그램 봇의 API 토큰과 채팅 ID를 설정합니다.
TOKEN = 'your-telegram-bot-token' # BotFather에게서 받은 API 토큰
CHAT_ID = 'your-chat-id' # 메시지를 보낼 텔레그램 채팅 ID
IMAGE_PATH = 'path-to-your-image-file' # 전송할 이미지 파일 경로
# 2. 비동기 이미지 전송 함수 정의
async def send_image():
bot = Bot(token=TOKEN)
with open(IMAGE_PATH, 'rb') as image:
await bot.send_photo(chat_id=CHAT_ID, photo=image) # await로 비동기 함수 호출
print("이미지를 전송했습니다.") # 로그용 출력
# 3. asyncio.run()으로 비동기 함수 실행
asyncio.run(send_image())
▲ 파이썬 파일을 만들고 위 코드를 입력
pip install python-telegram-bot
▲ 위 명령어를 복사한 후
▲ VSCode에서 Ctrl + ` 를 눌러 터미널을 실행합니다.
터미널에서 위 명령어를 입력하여 설치합니다
▲ TOKEN, CHAT_ID, IMAGE_PATH를 입력합니다.
IMAGE_PATH는 텔레그램에 전송할 이미지 경로를 넣어줍니다.
코드를 실행하여 봇이 이미지 전송을 하는지 테스트를 합니다.
import os
import asyncio
from telegram import Bot
from datetime import datetime
# 1. 텔레그램 봇의 API 토큰과 채팅 ID를 설정합니다.
TOKEN = 'your-telegram-bot-token' # BotFather에게서 받은 API 토큰
CHAT_ID = 'your-chat-id' # 메시지를 보낼 텔레그램 채팅 ID
IMAGE_PATH = 'path-to-your-image-file' # 전송할 이미지 파일 경로
# 한국어 요일 변환을 위한 딕셔너리
day_of_week_kor = {
'Monday': '월',
'Tuesday': '화',
'Wednesday': '수',
'Thursday': '목',
'Friday': '금',
'Saturday': '토',
'Sunday': '일'
}
# 2. 비동기 이미지 전송 함수 정의
async def send_image(image_path):
bot = Bot(token=TOKEN)
with open(image_path, 'rb') as image:
await bot.send_photo(chat_id=CHAT_ID, photo=image)
print(f"이미지 {image_path}를 전송했습니다.") # 로그용 출력
# 3. 비동기 텍스트 메시지 전송 함수 정의
async def send_message(text):
bot = Bot(token=TOKEN)
await bot.send_message(chat_id=CHAT_ID, text=text)
print(f"메시지 '{text}'를 전송했습니다.") # 로그용 출력
# 4. 오늘 날짜로 시작하는 파일 찾기
def get_files_for_today():
today = datetime.now().strftime('%Y-%m-%d') # 오늘 날짜를 "YYYY-MM-DD" 형식으로 가져옴
files_to_upload = []
# 폴더에서 오늘 날짜로 시작하는 파일 찾기
for filename in os.listdir(IMAGE_FOLDER_PATH):
if filename.startswith(today): # 파일명이 '오늘 날짜'로 시작하는지 확인
files_to_upload.append(os.path.join(IMAGE_FOLDER_PATH, filename))
# 파일 이름 순으로 정렬 (이미 YYYY-MM-DD-순번 형식이므로, 이 순서로 정렬됨)
files_to_upload.sort()
return files_to_upload
# 5. 이미지를 업로드하고 메시지 전송
def upload_and_notify():
# 오늘 날짜에 해당하는 파일들 가져오기
files = get_files_for_today()
# 비동기 함수로 이미지 업로드 실행
if files:
print(f"{len(files)}개의 파일을 업로드합니다.")
for file in files:
asyncio.run(send_image(file)) # asyncio.run()으로 비동기 코드 실행
# 이미지 업로드 후 텍스트 메시지 보내기
today = datetime.now().strftime('%Y-%m-%d')
day_of_week = datetime.now().strftime('%A') # 영어로 요일을 가져옴
korean_day_of_week = day_of_week_kor[day_of_week] # 한국어 요일 변환
message = f"■■■{today}({korean_day_of_week}) 업로드 완료"
asyncio.run(send_message(message)) # 텍스트 메시지도 asyncio.run()으로 실행
else:
print("오늘 업로드할 파일이 없습니다.")
# 6. 즉시 실행
if __name__ == "__main__":
upload_and_notify()
▲ 테스트로 정상동작됨을 확인했으니, 위 코드로 수정을 합니다.
위 코드내용은 아래와 같습니다.
1. "YYYY-MM-DD-순번"의 이미지 파일명을 순번대로 전송
2. 이미지 전송 후 "당일 날짜 업로드 완료" 텍스트 전송
따라서 파일명을 YYYY-MM-DD-01.jpg 이런 식으로 정해줘야 합니다.
확장자는 jpg, png 가리지 않고 전송됩니다.
시놀로지 NAS 설정
▲ 패키지 센터에서 python을 검색하여 설치합니다.
▲ NAS에서 제어판 > 공유 폴더 > 생성을 해줍니다.
예시로 python이라고 하겠습니다
▲ 레이드라이브에서 바로 폴더를 생성하려고 하면 대상 폴더 액세스 거부 창이 발생합니다.
그러므로 NAS 제어판 공유 폴더에서 생성을 해줘야 합니다.
▲ python 폴더 내에 작성된 파이썬 코드를 넣습니다.
images 폴더도 생성합니다.
▲ 이미지 폴더에는 파일명을 위 이미지처럼 작성해야 합니다.
NAS서버 SSH 활성화
NAS에서 python 스크립트를 실행하려면 라이브러리를 설치해야 합니다. ssh로만 설치가 가능하므로 ssh 활성화 후 PuTTY로 접속해야 합니다.
더불어 아이피타임 공유기를 사용하는 경우 포트포워드 설정도 같이 해줘야 합니다.
▲ 제어판 > 터미널 및 SNMP > 터미널 > SSH 서비스 활성화
아이피타임 공유기 포트포워드 설정
▲ 아이피타임 > 고급 설정 > NAT/라우터 관리 > 포트포워드 설정 > 서버 내부 IP와 포트번호 22를 설정해 줍니다.
PuTTY로 서버 접속 후 라이브러리 설치
▲ PuTTY 설치 후 SSH 접속을 합니다.
▲ login as 가 나오면 아이디를 입력하고, password에 암호를 입력합니다.
▲ 볼륨이 1이므로 PuTTY에서도 볼륨 1로 이동해야 합니다.
▲ cd /volume1 입력 이동 후에 python으로 이동할 수 있습니다.
▲ nas에 python 라이브러리를 설치하기 위해 아래 명령어를 입력합니다.
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
▲ python3 get-pip.py 설치 시 오류가 날 수 있습니다. PATH에 환경 변수를 추가해줘야 합니다.
경로는 노란색 글씨가 나와 있습니다. 드래그를 하면 자동 복사가 되므로 드래그 복사를 합니다.
▲ VI 로 환경변수를 추가해 줍니다.
vi ~/.bashrc
위 명령어를 입력 후 i 를 눌러 편집 모드로 들어갑니다.
export PATH=$PATH:[노란색 글씨의 경로]
노란색 경로를 복사한 것을 위 경로로 입력해 줍니다.
환경 변수를 입력했으면 ESC 누른 후 :wq 입력하여 저장하고 종료합니다.
source ~/.bashrc
위 명령어를 입력하여 bash파일을 다시 로드합니다.
그리고 다시 python3 get-pip.py 설치를 하면 설치가 될 것입니다.
▲ 아래 명령어를 입력하여 라이브러리를 설치합니다.
pip3 install python-telegram-bot
▲ 이미지가 들어있는 경로를 확인하기 위해 images폴더로 이동 후 pwd 를 입력합니다.
확인된 이미지 경로를 복사합니다.
▲ NAS 서버에 있는 파이썬 파일을 엽니다.
NAS 서버에 있는 이미지 폴더로 경로를 수정합니다.
▲ PuTTY에서 아래 명령어를 입력하여 테스트해 봅니다.
python telegram_bot.py
작업 스케줄러에 등록하기 위해 경로확인이 필요합니다.
아래 명령어를 입력하여 경로를 확인합니다.
which python3
NAS 작업 스케줄러 설정
▲ 제어판 > 작업 스케줄러 > 생성 > 예약된 작업 > 사용자 정의 스크립
▲ 작업 이름을 설정해 줍니다.
▲ 스케줄은 원하는 요일로 설정합니다.
▲ 시간도 상황에 맞게 설정합니다.
▲ 작업 설정에서 사용자 정의 스크립트를 넣어줘야 합니다.
PuTTY에서 which python3을 입력하여 위치를 찾고
pwd를 입력하여 파이썬의 위치파일을 찾아서 입력을 해줍니다.
예시로 아래와 같이 입력해 주면 됩니다.
/bin/python3 /volume1/python/telegram_bot/telegram_bot.py
▲ 설정을 클릭하여 스크립트 로그도 설정할 수 있습니다.
▲ 마지막으로 SSH 포트는 보안상 닫아주는 것이 좋습니다.
SSH 서비스 활성화 체크박스를 해제하여 포트를 닫아주면 됩니다.
'컴퓨터' 카테고리의 다른 글
삼성 프린터 SL-J1680 인쇄 출력 속도 느린 현상 (0) | 2024.10.17 |
---|---|
신도리코 복합기 D450 스캔 설정 시 FTP 파일 설치 경로 (0) | 2022.11.21 |
네트워크 드라이브 연결하기 (0) | 2022.11.14 |
텔레그램 슈퍼그룹방 확인하기 (0) | 2022.06.29 |
네트워크 폴더 공유하기(USB없이 파일 옮기기) (0) | 2022.06.20 |