이번에는 텔레그램 봇으로 이미지를 주중 예약된 시간에 전송하는 방법을 알아보겠습니다.

시작하기에 앞서 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 서비스 활성화 체크박스를 해제하여 포트를 닫아주면 됩니다.