콘텐츠로 건너뛰기

텔레그램 메시지 전달 및 백업 봇을 만드는 방법 Forward Bot

텔레그램 메시지를 전달하는 봇을 VPS에서 직접 실행하는 방법입니다.

미리 말하자면 이 방법은 본인의 컴퓨터를 켜놓거나 VPS(가상서버)를 구매해야 사용 가능하며 일련의 명령어를 입력해야 하기에 간단하게 텔레그램 메시지를 전달 혹은 백업하고 싶다! 하는 경우에는 적합한 해결책이 아닙니다.

이미 완성된 봇을 활용하고 싶다면 아래 글들을 참고하면 됩니다.

텔레그램 채팅방 대화내용을 추출하는 방법

텔레그램 채널 실시간 자동 백업하는 방법 (파일 포함)

위에 소개된 방법들은 조금 복잡하지만 이 글에서 소개할 방법은 매우 복잡합니다.

텔레그램 메시지 전달 및 백업 봇을 ‘직접’ 만드는 것의 유일한 장점은 이미 만들어진 봇을 활용하는 것과 달리 제한이 없다는 겁니다. 시중의 봇들은 용량 제한이나 횟수 제한 등등 기능 제한을 걸어놓고 해당 기능을 이용하려면 돈을 지불하도록 만들어놨습니다.

하지만 직접 봇을 만들면 아무런 제한 없이 무제한으로 메시지를 전달하거나 백업하는 게 가능합니다.

물론 여기서 소개할 봇도 제가 직접 만든 건 아니며 GitHub에 올라온 오픈소스를 활용합니다.

가상서버(VPS) 설정

시중의 텔레그램 봇들이 왜 일부 기능을 유료로 제한할까요? 텔레그램 봇을 구동하기 위해서는 컴퓨터(가상서버)가 필요하고 여기에는 비용이 필요하기 때문입니다.

VPS는 Vultr, Linode, DigitalOcean 등에서 구매하거나 오라클 프리티어를 무료로 사용할 수 있습니다.

워드프레스 무료 운영 완전 공략

오라클 프리티어에 관한 내용은 ‘워드프레스 공략’에 모아져 있으니 궁금한 분들은 참고하면 됩니다.

가상서버를 구매해서 SSH 키까지 발급 받고 PuTTY로 로그인합니다.

이지패널 설치

이지패널은 도커를 기반으로 여러가지 앱들을 쉽게 구동하도록 도와주는 패널입니다.

보통 SSH에서 명령어를 입력하며 이것저것 설치해야 하는데 이지패널을 이용하면 웹(인터넷)에 접속해 그런 과정들을 좀 생략할 수 있습니다.

오라클 클라우드 이지패널(EasyPanel) 설치 및 업그레이드

이지패널을 설치했으면 공인IP:3000을 링크 대신 입력해 이지패널에 접속합니다.

이지패널에 tgcf 설치

tgcf는 텔레그램 봇을 구동하기 위한 패널을 제공합니다. 무슨 의미인지 모릅니다. 코드 만든 사람이 tgcf라는 이름을 지었습니다.

GitHub에서 코드를 tgcf 코드를 확인할 수 있습니다.

이지패널 프로젝트

이지패널에 접속한 상태에서 새로운 프로젝트를 추가하고 오른쪽 위에 Service를 클릭합니다.

이지패널 서비스 앱

App을 클릭합니다. 말 그대로 애플리케이션을 설치할 것이니까요.

이지패널 깃헙

General 메뉴에서 Source 아래에 GitHub을 선택하고 사진과 같은 정보를 입력합니다.

GitHub을 사용하는 aahnik 이 분이 코드를 공개했습니다. tgcf는 해당 코드 이름입니다.

Branch는 해당 코드의 ‘가지’ 즉 여러 가지 다른 버전입니다. 일반적으로 깃헙에서 별도의 브랜치를 만들지 않으면 main이 기본입니다.

Build Path는 /를 입력합니다.

위로 조금 올리면 ‘Deploy’ 버튼이 있습니다. 그걸 클릭하면 앱이 설치되기 시작합니다.

‘Deploy’ 버튼은 새로고침과 비슷한 역할을 합니다. 서버 사양에 따라 설치되는데 걸리는 시간이 다를 수 있습니다. 워드프레스 등 가벼운 앱보다 크기가 크기 때문에 꽤 걸릴 수도 있으니 차분히 기다립니다.

이지패널 로그

설치가 완료되면 이지패널의 자체 콘솔에 위와 같은 문구가 표시됩니다.

External URL을 확인하면 VPS의 공인IP:8501 이렇게 적어져 있습니다.

tgcf의 패널이 8501 포트를 사용합니다.

이지패널 도메인

이지패널의 Domains 메뉴로 이동해 80으로 설정되어 있는 App Port를 8501로 바꾸고 Save를 클릭합니다.

포트포워딩 또는 방화벽 설정

포트포워딩이나 방화벽 설정이나 비슷한 의미입니다.

8501 포트는 기본적으로 닫혀 있기 때문에 본인이 이용 중인 VPS 업체에서 해당 포트를 열어줘야 합니다.

이지패널에서 설정한다고 방화벽이 바로 열리지 않습니다.

오라클 클라우드 포트포워딩, 수신 규칙, iptable

오라클 프리티어를 이용 중인 경우 위 글을 참고하면 됩니다. 오라클은 인터페이스가 불친절해 복잡한 편입니다. 다른 업체를 이용 중이라면 훨씬 간단하게 접근할 수 있을 겁니다.

그리고 오라클은 방화벽을 별도로 설정해야 하는 일이 생깁니다. 그리고 8501 포트의 경우 바로 그 경우에 해당합니다.

오라클 프리티어 포트 설정 후에도 HTTP 접속이 안되는 경우

오라클 포트 개방 후에도 접속이 안된다면 위 글을 참고하시기 바랍니다. 마찬가지로 다른 업체를 이용 중이라면 해당 과정도 필요 없습니다.

tgcf 접속 후 로그인하기

도메인 포트 8501 변경

다시 이지패널로 돌아와 오른쪽의 Open을 클릭하면 정상적으로 접속이 되는 걸 확인할 수 있습니다.

TGCF 접속과 로그인

처음 접속하면 비밀번호를 요구하는데 이지패널을 이용해 설치했기 때문에 기본 설정인 tgcf를 입력하면 됩니다.

텔레그램 API 발급받기

API란? 프로그래머가 쉽게 애플리케이션을 만들 수 있도록 텔레그램 같은 기업이 제공하는 상호작용 툴이라고 생각하면 됩니다. 일련의 문자 또는 숫자로 구성되어 있습니다.

BotFather Bot API

텔레그램의 BotFather 채널에 접속합니다. 일련의 안내문을 따라가며 새로운 봇 API를 발급받게 됩니다.

봇파더 HELP 명령어

/newbot

새로운 봇을 생성합니다.

봇의 이름을 입력합니다.

봇의 Username을 입력합니다.

고유 ID와 비슷한 역할을 하기 때문에 이미 생성된 ID로는 만들 수 없습니다. 다소 복잡한 Username을 입력해야 생성될 확률이 높습니다.

이 과정에서 계속 중복된 Username을 입력하면 오류가 나며 BotFather가 아무리 복잡한 Username을 입력해도 이미 사용 중이라고 주장합니다. 이 경우 다시 /newbot 을 입력해 처음부터 시작하면 됩니다.

봇이 생성되면 HTTP API 토큰을 알려줍니다. 다시 확인하고 싶은 경우 /mybots 를 입력하면 됩니다.

Telegram API

다음으로 텔레그램 API를 발급받습니다.

텔레그램 웹사이트에서 텔레그램 계정을 만드는 데 사용한 전화번호를 입력하면 인증번호를 텔레그램으로 보내줍니다. 가상 전화번호인 경우에도 텔레그램으로 인증번호를 보내주기에 API 발급이 가능합니다.

텔레그램 API

인증번호를 입력하면 만들고 싶은 앱의 이름 등 몇 가지 정보를 입력하라고 합니다.

전부 입력하고 my.telegram.org/apps로 이동하면 사진과 같이 api_id api_hash를 확인할 수 있습니다.

API에 관련된 총 3가지 정보를 얻었습니다.

tgcf 패널에서 API 연동과 로그인

TGCF API 입력

다시 tgcf로 돌아와 Telegram Login 메뉴로 갑니다.

지금 텔레그램 메시지를 전달(Forward) 기능을 이용해 백업하거나 실시간으로 복사하려는 건데 이게 가능하려면 프로그램에 내 계정이 로그인 되어 있는 게 유일한 방법입니다.

전달(Forward)를 계정에 로그인 한 상태에서만 할 수 있으므로 당연합니다.

API ID와 API HASH는 무조건 입력해야 되고

Bot으로 로그인하는 경우 BotFather Bot API를 입력하게 됩니다.

User로 로그인하는 경우 session string을 입력하게 됩니다.

여기서 힘들었던 게… 지금까지도 충분히 복잡했는데 개발자가 User로 로그인하는 과정을 패널에 구현하지 못했다고 합니다. session string을 확인하려면 프로그램이 내 텔레그램 계정에 로그인해야 되는데 텔레그램은 외부 로그인의 경우 보안 인증 코드를 텔레그램 메시지로 보내 해당 보안 인증 코드를 입력해야 로그인이 가능하도록 설정되어있습니다.

근데 그 과정을 구현하지 못했다고 합니다. 그래서 지금까지의 과정만큼은 아니지만 수고롭게도 별도의 프로그램을 돌려 session string을 확인해야 합니다.

그럼 그냥 Bot으로 로그인하면 안되는지 궁금할 수 있는데 그것도 괜찮습니다. 다만 실시간 백업 기능은 이용할 수 있어도 과거 메시지를 백업할 수 없습니다. 텔레그램에서 ‘봇’ 계정은 과거 메시지를 확인할 수 없도록 정책을 만들어놨기 때문입니다. 이건 어떻게 해결할 수 있는 부분이 아닙니다.

Session String 확인하기

사용 중인 VPS를 써도 되고 별도의 VPS를 만들어도 됩니다. 아주 간단한 프로그램을 이용해 session string을 확인합니다.

GitHub tg-login을 이용할건데 파이썬으로 코드가 만들어져 있어서 파이썬 가상 환경에서 실행해야 합니다.

이지패널 설치의 경우 sudo su – 명령어를 입력해 root 디렉토리에서 실행하면 알아서 경로를 찾아 설치가 되었습니다. GitHub tg-login의 경우 별도의 프로그램이니까 Home 디렉토리에서 실행하는 게 좋지 않을까 생각합니다.

다시 SSH에 접속합니다. 우분투를 설치한 경우 ubuntu@IP로 접속해도 되고 SSH 권한은 딱히 상관 없습니다.

cd ..

한 단계 상위 디렉토리로 이동하는 명령어입니다. 계속 이동하다보면 최상위 디렉토리로 가게 됩니다.

cd home

Home 디렉토리로 이동합니다.

ls

Home 디렉토리 안의 디렉토리를 확인합니다.

저 같은 경우 OS로 우분투를 설치했고 ubuntu 디렉토리가 이미 생성되어 있었지만 다른 디렉토리를 사용해도 상관없습니다.

cd ubuntu

ubuntu 디렉토리로 이동합니다.

sudo apt update && sudo apt upgrade -y

apt upgrade

sudo apt install python3-pip python3-venv

파이썬 가상환경을 설치합니다.

python3 -m venv .venv
source .venv/bin/activate

가상환경을 실행합니다.

pip install tg-login

tg-login을 설치합니다.

tg-login

tg-login을 실행합니다.

이제 tg-login이 API ID와 API HASH를 물어보고 마지막으로 전화번호를 물어봅니다.

전화번호를 입력하면 텔레그램 내에서 로그인 코드가 오는데 해당 코드를 tg-login에서 입력합니다.

그럼 텔레그램의 ‘저장한 메시지’에 session string이 전송됩니다.

TGCF SESSIOIN STRING

Enter session string에 입력하고 Save를 클릭합니다.

텔레그램 채팅방 ID 확인

이제 채팅방과 채팅방을 연결해야 합니다. 그러기 위해선 채팅방의 ID가 필요한데 이는 userinfobot을 활용해 쉽게 가능합니다.

해당 봇에 ID를 확인하고 싶은 채팅방의(채널, 그룹, 개인) 아무 메시지나 전달(Forward)하면 ID를 알려줍니다. 앞에 – 가 붙어있으니까 주의하세요.

텔레그램 채팅방 소스와 목적지 입력

Connections 메뉴에서 채팅방과 채팅방을 연결할 수 있습니다.

Source가 당연히 원본이고 Destinations가 전달할 채팅방입니다.

Source는 한 개만 지정 가능하고 Destinations는 여러 개를 지정할 수 있습니다. 단, 엔터를 눌러 줄을 바꿔야 합니다.

만약 여러 개의 채팅방에서 메시지를 복사하고 싶으면 위의 Add new connectioin을 클릭해 여러 개의 설정을 만들어줘야 합니다.

userinfobot에서 확인한 일련의 숫자를 입력하면 됩니다. 앞에 – 를 입력하지 않으면 작동하지 않습니다.

Past Mode Settings 이건 과거의 채팅을 백업하고 싶은 경우 이용합니다.

Offset이 시작 지점이고 End가 끝 지점입니다. 텔레그램은 겉으로는 보이지 않지만 채팅마다 고유 ID가 있습니다. 처음 올라온 채팅부터 순서대로 1, 2, 3 이렇게 ID가 증가합니다.

즉 Offset에 1을 입력학고 End에 10을 입력하면 첫 번째 채팅부터 열 번째 채팅을 전달합니다.

전체 채팅을 전달하고 싶은 경우 0, 0으로 설정하면 됩니다.

텔레그램 채팅 전달 모드 설정 LIVE PAST

이제 Run 메뉴에서 Configure Run을 클릭합니다. 모드가 두 가지가 있습니다.

Live는 실시간 전달이고 Past는 과거 채팅 전달입니다.

Delay in seconds는 전달 간격입니다. 1초로 설정하는 걸 추천합니다. 텔레그램 API를 활용하여 채팅을 전달하는 건데 거의 모든 종류의 API에는 Rate Limit이라고 과부하를 방지하기 위한 사용자당 할당량이 정해져 있습니다.

텔레그램 API의 Rate Limit이 얼마인지는 모르겠습니다. 아마 IP당, 초당, 10회 이런식으로 설정되어 있을 거라 예상합니다. API 제한을 초과하게 되면 프로그램이 중지되며 경고 메시지가 날라옵니다.

이를 방지하려면 1초의 간격을 설정하면 됩니다. 1초로 설정해도 가끔씩 봇이 멈추기는 하는데 이는 일시적이며 3000개의 채팅을 무난하게 전달할 수 있었습니다.

Run 버튼을 누르면 프로그램이 작동합니다.

로그 파일 다운로드를 지원하길래 제 로그를 가져와봤습니다.

[08/24/23 18:13:59] INFO     slept for 1 seconds                      past.py:75
                    INFO     forwarding message with id = 255         past.py:71
[08/24/23 18:14:00] INFO     slept for 1 seconds                      past.py:75
[08/24/23 18:14:01] INFO     forwarding message with id = 256         past.py:71
[08/24/23 18:14:02] INFO     slept for 1 seconds                      past.py:75
                    INFO     forwarding message with id = 257         past.py:71

아까 말한 것처럼 채팅에는 고유 ID가 있습니다. 255, 256, 257 채팅을 가져온 걸 확인할 수 있습니다. 이런 식으로 계속 실행됩니다. 봇을 멈추고 싶은 경우 다시 패널에 접속해 Stop을 눌러주면 됩니다.

확인 결과 램은 600MB 정도 사용하는 것 같습니다. 이지패널과 함께 돌아가니 1.2GB의 램을 사용했고 넉넉하게 2GB 램으로 구동하면 될 것 같습니다. CPU는 거의 사용하지 않습니다.

답글 남기기