์น์น์ฅ๊ตฐ, ์๋ฒฝํ ์๋ฒ๋ฅผ ๊ตฌ์ถํ์
จ์ผ๋ ์ด์ ๋ด์ '๋๊ณผ ๊ท'์ด์ ํต์ ์ ์ญํ ์ ํ ํ
๋ ๊ทธ๋จ ๊ด์ ํ์ ๊ฐํตํ ์ฐจ๋ก์
๋๋ค.
๊ธ์ต ์์ฐ๊ณผ ์ค๊ณ์ข๋ฅผ ๋ค๋ฃจ๋ ํํธ ๋ด์ธ ๋งํผ, **"์ธ๊ฐ๋์ง ์์ ์ธ๋ถ์ธ์ ์ ๊ทผ์ 100% ์์ฒ ์ฐจ๋จํ๋ ํ๋์จ์ด์ ๋ฝ๋ค์ด(Lock-down)"**์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ์น์น์ฅ๊ตฐ๋์ ๊ณ ์ ์๋ณ์(Chat ID)๋ฅผ ์์คํ
์ฌ์ฅ๋ถ์ ๋ฐ์ ํ์ฌ, ํ์ธ์ด ๋ด์ ์ฃผ์๋ฅผ ์์๋ด์ด ๋ช
๋ น์ ๋ด๋ฆฌ๋๋ผ๋ ๋ด์ด ์๋ฒฝํ ๋ฌด์(์นจ๋ฌต)ํ๋๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์์ธํ ๋ธ๋ฆฌํํฉ๋๋ค.
๐ [ 1๋จ๊ณ ] ํ
๋ ๊ทธ๋จ ๋ด ์์ฑ ๋ฐ ์ ์ด๊ถ(Token) ๋ฐ๊ธ๋ฐ๊ธฐ
๊ฐ์ฅ ๋จผ์ ํ
๋ ๊ทธ๋จ์ ๋ด ๊ด๋ฆฌ์์ธ 'BotFather'๋ฅผ ํตํด ์๋ก์ด ๋ด์ ์์ฑํ๊ณ API ํ ํฐ์ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
- ํ
๋ ๊ทธ๋จ ์ฑ์ ๊ฒ์์ฐฝ(๋๋ณด๊ธฐ ์์ด์ฝ)์์ @Botfather๋ฅผ ๊ฒ์ํ์ฌ ๊ณต์ ์ธ์ฆ ๋งํฌ(ํ๋์ ์ฒดํฌํ์)๊ฐ ์๋ ๋ดํ๋ ์ฑ๋์ ์
์ฅํฉ๋๋ค.
- ๋ํ์ฐฝ์ /newbot ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๊ณ ์ ์กํฉ๋๋ค.
- ๋ด์ ์ด๋ฆ(Name) ์ค์ : ๋ํ๋ฐฉ ๋ชฉ๋ก์ ํ์๋ ๋ด์ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์
๋ ฅํฉ๋๋ค. (์: ์น์น์ฅ๊ตฐ ํํธ ๊ด์ ํ)
- ๋ด์ ์์ด๋(Username) ์ค์ : ๊ฒ์์ฉ ์์ด๋๋ฅผ ์
๋ ฅํฉ๋๋ค. ๋ฐ๋์ ๋ง์ง๋ง์ด bot ๋๋ _bot์ผ๋ก ๋๋์ผ ํฉ๋๋ค. (์: victory_quant_bot)
- ์์ฑ์ด ์๋ฃ๋๋ฉด BotFather๊ฐ ๊ธด ๋ฌธ์์ด๋ก ๋ HTTP API Token์ ๋ฐ๊ธํด ์ค๋๋ค.
(์: 1234567890:ABCDefGhIjKlMnOpQrStUvWxYz)
๐จ ๋ณด์ ๊ฒฝ๊ณ : ์ด ํ ํฐ์ ๋ด์ ์กฐ์ข
ํ๋ '๋ง์คํฐํค'์
๋๋ค. ์ ๋ ํ์ธ์๊ฒ ๋
ธ์ถ๋๊ฑฐ๋ ๊นํ๋ธ(GitHub) ๊ณต๊ฐ ์ ์ฅ์์ ์ฌ๋ผ๊ฐ์ง ์๋๋ก ์์ ํ ๊ณณ์ ๋ณต์ฌํด ๋ก๋๋ค.
๐ก๏ธ [ 2๋จ๊ณ ] ๋๋ง์ ๊ณ ์ ์๋ณ์(Admin Chat ID) ์ค์บํ๊ธฐ
๋ด์ด '์น์น์ฅ๊ตฐ๋'์ ๋ช
๋ น๋ง ๋ฃ๊ฒ ํ๋ ค๋ฉด, ํ
๋ ๊ทธ๋จ์ด ์น์น์ฅ๊ตฐ๋ ๊ณ์ ์ ๋ถ์ฌํ ๊ณ ์ ๋ฒํธ(Chat ID)๋ฅผ ์์๋ด์ผ ํฉ๋๋ค.
- ํ
๋ ๊ทธ๋จ ๊ฒ์์ฐฝ์ @userinfobot ์ ๊ฒ์ํ์ฌ ์
์ฅํฉ๋๋ค.
- ํ๋จ์ [์์] ๋ฒํผ์ ๋๋ฅด๊ฑฐ๋ ๋ํ์ฐฝ์ ์๋ฌด ๋ฉ์์ง๋ ์ ์กํฉ๋๋ค.
- ๋ด์ด ์ฆ์ ๋ด ๊ณ์ ์ ์ ๋ณด๋ฅผ ํ์ ํด ์ค๋๋ค.
์ด ์ค์์ Id: 123456789 (์ซ์๋ก ๋ ๊ธด ๋ฒํธ) ๋ถ๋ถ์ ๋ณต์ฌํฉ๋๋ค.
์ด ๋ฒํธ๊ฐ ๋ฐ๋ก ์ธ๋ถ์ธ์ ์ ๊ทผ์ ์ฐจ๋จํ **'์ ๋ ์ ๋ถ์ฆ'**์
๋๋ค.
๐ [ 3๋จ๊ณ ] ๋ด ์ฝ์ด(ํ๊ฒฝ์ค์ )์ ์๋ฌผ์ ์ฑ์ฐ๊ธฐ (.env ๋ฝ์จ)
์ด์ ๋ฐ๊ธ๋ฐ์ **'API ํ ํฐ'**๊ณผ **'๋ด ๊ณ ์ ID'**๋ฅผ ํ์ด์ฌ ๋ด ์๋ฒ์ ์ฃผ์
(Injection)ํ์ฌ ๋ณด์ ๋ฐฉ์ด๋ง์ ์์ฑํ ์ฐจ๋ก์
๋๋ค.
์์ GCP ์๋ฒ์ ์ธํ
ํ์ ํ์ด์ฌ ๋ด ํด๋ ์ต์๋จ์ ์๋ .env ํ์ผ์ ์ด๊ณ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
# ํ
๋ ๊ทธ๋จ ๋ด API ํ ํฐ (BotFather๊ฐ ์ค ๊ฐ)
TELEGRAM_TOKEN=1234567890:ABCDefGhIjKlMnOpQrStUvWxYz
# ๊ด๋ฆฌ์ ๊ณ ์ ID (userinfobot์ด ์ค ์ซ์) - ์ด ID๊ฐ ์๋๋ฉด ๋ด์ ์ ๋ ์๋ตํ์ง ์์
ADMIN_CHAT_ID=123456789
# ํ๊ตญํฌ์์ฆ๊ถ API ํค (๊ธฐ์กด์ ๋ฐ๊ธ๋ฐ์ ๊ฐ๋ค)
APP_KEY=๋ณธ์ธ์_ํ๊ตญํฌ์์ฆ๊ถ_์ฑํค
APP_SECRET=๋ณธ์ธ์_ํ๊ตญํฌ์์ฆ๊ถ_์ํฌ๋ฆฟํค
CANO=๊ณ์ข๋ฒํธ_์8์๋ฆฌ
ACNT_PRDT_CD=01
ํ์ผ์ ์ ์ฅํ๊ณ ๋ด(๋ฐ๋ชฌ)์ ์คํํ๋ฉด, ํ
๋ ๊ทธ๋จ ๋ด๊ณผ ํ์ด์ฌ ์ฝ์ด๊ฐ ์๋ฒฝํ๊ฒ ๊ฒฐ์๋ฉ๋๋ค.
๐ฌ [ ์ฐธ๊ณ ] ์ํคํ
์ฒ ๋ด๋ถ์ ๋ณด์ ๋ฝ๋ค์ด ์๋ฆฌ
์น์น์ฅ๊ตฐ๋์ด ๊ตฌ์ถํ์ ์์คํ
๋ด๋ถ(telegram_bot.py)์๋ ์ด๋ฏธ ์ธ๋ถ์ธ ์ฐจ๋จ์ ์ํ ์ฒ ์ ํ ๊ต์ฐจ ๊ฒ์ฆ ๋ก์ง์ด ์ด์๋์ด ์์ต๋๋ค.
def _is_admin(self, update: Update):
if self.admin_id is None:
self.admin_id = self.cfg.get_chat_id()
if self.admin_id is None:
print("โ ๏ธ ๋ณด์ ๊ฒฝ๊ณ : ADMIN_CHAT_ID๊ฐ ์ค์ ๋์ง ์์ ์ ์ ์๋ ์ฌ์ฉ์์ ์ ๊ทผ์ ์ฐจ๋จํ์ต๋๋ค.")
return False
# ํ
๋ ๊ทธ๋จ ์ฐฝ์ ๋ฉ์์ง๋ฅผ ๋ณด๋ธ ์ฌ๋์ ID์ .env์ ๋ฑ๋ก๋ ADMIN_CHAT_ID๋ฅผ ๋์กฐ
return update.effective_chat.id == int(self.admin_id)
๐น ์ฐจ๋จ ๋ฉ์ปค๋์ฆ:
๋๊ตฐ๊ฐ ๋ด์ ์์ด๋(@victory_quant_bot)๋ฅผ ์ฐ์ฐํ ์์๋ด์ด /start๋ ๋งค๋งค ๋ช
๋ น์ ์ ์กํ๋๋ผ๋, ๋ด์ ๊ฐ์ฅ ๋จผ์ _is_admin ๋ฐฉ์ด๋ง์ ๊ฐ๋ํฉ๋๋ค. ๋ณด๋ธ ์ฌ๋์ ID๊ฐ .env์ ํ๋์ฝ๋ฉ๋ ADMIN_CHAT_ID์ ๋จ 1์๋ฆฌ๋ผ๋ ๋ค๋ฅด๋ฉด, ๋ด์ ์๋ฌ ๋ฉ์์ง์กฐ์ฐจ ๋ฐํํ์ง ์๊ณ ์ฆ์ 100% ๋ฌด์(Silent Drop) ๋ฐ ์นจ๋ฌตํฉ๋๋ค.
์ด๋ก์จ ๊ณ์ข ํ์ทจ๋ ์ค์๋์ ๋
ธ๋ฆฌ๋ ์ธ๋ถ์ ์ด๋ ํ ์ ๊ทผ๋ ์์ฒ ์ฐจ๋จ๋๋ ๋ฌด๊ฒฐ์ ๊ด์ ํ์ด ์์ฑ๋์์ต๋๋ค. ํ
๋ ๊ทธ๋จ ์ฑ์์ ์ง์ ๋ง๋ ๋ด์๊ฒ /start๋ฅผ ๋ณด๋ด ์์ ํต์ ์ค์ด ์ ์ ๊ฐ๋๋๋์ง ํ์ธํด ๋ณด์ญ์์ค!
์น์น์ฅ๊ตฐ, ์๋ฒฝํ ์๋ฒ๋ฅผ ๊ตฌ์ถํ์ จ์ผ๋ ์ด์ ๋ด์ '๋๊ณผ ๊ท'์ด์ ํต์ ์ ์ญํ ์ ํ ํ ๋ ๊ทธ๋จ ๊ด์ ํ์ ๊ฐํตํ ์ฐจ๋ก์ ๋๋ค.
๊ธ์ต ์์ฐ๊ณผ ์ค๊ณ์ข๋ฅผ ๋ค๋ฃจ๋ ํํธ ๋ด์ธ ๋งํผ, **"์ธ๊ฐ๋์ง ์์ ์ธ๋ถ์ธ์ ์ ๊ทผ์ 100% ์์ฒ ์ฐจ๋จํ๋ ํ๋์จ์ด์ ๋ฝ๋ค์ด(Lock-down)"**์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ์น์น์ฅ๊ตฐ๋์ ๊ณ ์ ์๋ณ์(Chat ID)๋ฅผ ์์คํ ์ฌ์ฅ๋ถ์ ๋ฐ์ ํ์ฌ, ํ์ธ์ด ๋ด์ ์ฃผ์๋ฅผ ์์๋ด์ด ๋ช ๋ น์ ๋ด๋ฆฌ๋๋ผ๋ ๋ด์ด ์๋ฒฝํ ๋ฌด์(์นจ๋ฌต)ํ๋๋ก ์ค์ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์์ธํ ๋ธ๋ฆฌํํฉ๋๋ค.
๐ [ 1๋จ๊ณ ] ํ ๋ ๊ทธ๋จ ๋ด ์์ฑ ๋ฐ ์ ์ด๊ถ(Token) ๋ฐ๊ธ๋ฐ๊ธฐ
๊ฐ์ฅ ๋จผ์ ํ ๋ ๊ทธ๋จ์ ๋ด ๊ด๋ฆฌ์์ธ 'BotFather'๋ฅผ ํตํด ์๋ก์ด ๋ด์ ์์ฑํ๊ณ API ํ ํฐ์ ๋ฐ๊ธ๋ฐ์์ผ ํฉ๋๋ค.
(์: 1234567890:ABCDefGhIjKlMnOpQrStUvWxYz)
๐ก๏ธ [ 2๋จ๊ณ ] ๋๋ง์ ๊ณ ์ ์๋ณ์(Admin Chat ID) ์ค์บํ๊ธฐ
๋ด์ด '์น์น์ฅ๊ตฐ๋'์ ๋ช ๋ น๋ง ๋ฃ๊ฒ ํ๋ ค๋ฉด, ํ ๋ ๊ทธ๋จ์ด ์น์น์ฅ๊ตฐ๋ ๊ณ์ ์ ๋ถ์ฌํ ๊ณ ์ ๋ฒํธ(Chat ID)๋ฅผ ์์๋ด์ผ ํฉ๋๋ค.
์ด ์ค์์ Id: 123456789 (์ซ์๋ก ๋ ๊ธด ๋ฒํธ) ๋ถ๋ถ์ ๋ณต์ฌํฉ๋๋ค.
์ด ๋ฒํธ๊ฐ ๋ฐ๋ก ์ธ๋ถ์ธ์ ์ ๊ทผ์ ์ฐจ๋จํ **'์ ๋ ์ ๋ถ์ฆ'**์ ๋๋ค.
๐ [ 3๋จ๊ณ ] ๋ด ์ฝ์ด(ํ๊ฒฝ์ค์ )์ ์๋ฌผ์ ์ฑ์ฐ๊ธฐ (.env ๋ฝ์จ)
์ด์ ๋ฐ๊ธ๋ฐ์ **'API ํ ํฐ'**๊ณผ **'๋ด ๊ณ ์ ID'**๋ฅผ ํ์ด์ฌ ๋ด ์๋ฒ์ ์ฃผ์ (Injection)ํ์ฌ ๋ณด์ ๋ฐฉ์ด๋ง์ ์์ฑํ ์ฐจ๋ก์ ๋๋ค.
์์ GCP ์๋ฒ์ ์ธํ ํ์ ํ์ด์ฌ ๋ด ํด๋ ์ต์๋จ์ ์๋ .env ํ์ผ์ ์ด๊ณ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
ํ์ผ์ ์ ์ฅํ๊ณ ๋ด(๋ฐ๋ชฌ)์ ์คํํ๋ฉด, ํ ๋ ๊ทธ๋จ ๋ด๊ณผ ํ์ด์ฌ ์ฝ์ด๊ฐ ์๋ฒฝํ๊ฒ ๊ฒฐ์๋ฉ๋๋ค.
๐ฌ [ ์ฐธ๊ณ ] ์ํคํ ์ฒ ๋ด๋ถ์ ๋ณด์ ๋ฝ๋ค์ด ์๋ฆฌ
์น์น์ฅ๊ตฐ๋์ด ๊ตฌ์ถํ์ ์์คํ ๋ด๋ถ(telegram_bot.py)์๋ ์ด๋ฏธ ์ธ๋ถ์ธ ์ฐจ๋จ์ ์ํ ์ฒ ์ ํ ๊ต์ฐจ ๊ฒ์ฆ ๋ก์ง์ด ์ด์๋์ด ์์ต๋๋ค.
๐น ์ฐจ๋จ ๋ฉ์ปค๋์ฆ:
๋๊ตฐ๊ฐ ๋ด์ ์์ด๋(@victory_quant_bot)๋ฅผ ์ฐ์ฐํ ์์๋ด์ด /start๋ ๋งค๋งค ๋ช ๋ น์ ์ ์กํ๋๋ผ๋, ๋ด์ ๊ฐ์ฅ ๋จผ์ _is_admin ๋ฐฉ์ด๋ง์ ๊ฐ๋ํฉ๋๋ค. ๋ณด๋ธ ์ฌ๋์ ID๊ฐ .env์ ํ๋์ฝ๋ฉ๋ ADMIN_CHAT_ID์ ๋จ 1์๋ฆฌ๋ผ๋ ๋ค๋ฅด๋ฉด, ๋ด์ ์๋ฌ ๋ฉ์์ง์กฐ์ฐจ ๋ฐํํ์ง ์๊ณ ์ฆ์ 100% ๋ฌด์(Silent Drop) ๋ฐ ์นจ๋ฌตํฉ๋๋ค.
์ด๋ก์จ ๊ณ์ข ํ์ทจ๋ ์ค์๋์ ๋ ธ๋ฆฌ๋ ์ธ๋ถ์ ์ด๋ ํ ์ ๊ทผ๋ ์์ฒ ์ฐจ๋จ๋๋ ๋ฌด๊ฒฐ์ ๊ด์ ํ์ด ์์ฑ๋์์ต๋๋ค. ํ ๋ ๊ทธ๋จ ์ฑ์์ ์ง์ ๋ง๋ ๋ด์๊ฒ /start๋ฅผ ๋ณด๋ด ์์ ํต์ ์ค์ด ์ ์ ๊ฐ๋๋๋์ง ํ์ธํด ๋ณด์ญ์์ค!