๐Ÿ’ป Back-End

Telegram Bot API

์˜ฌใ„น1๋ธŒ 2019. 10. 1. 19:04
๋ฐ˜์‘ํ˜•

-- ๋ฒˆ์—ญ : https://core.telegram.org/bots/api

Telegram Bot Api

๋ด‡ API๋Š” ํ…”๋ ˆ๊ทธ๋žจ์—์„œ ๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ HTTP ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์„ธํŒ… ๋ฐฉ๋ฒ•์„ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š”, Introduction to Bots ํŽ˜์ด์ง€์™€ Bot FAQ ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Authorizing your bot (๋ด‡ ์ธ์ฆ)

๊ฐ๊ฐ์˜ ๋ด‡๋งˆ๋‹ค ๋งŒ๋“ค์–ด์งˆ ๋•Œ ํŠน๋ณ„ํ•œ ์ธ์ฆํ‚ค๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ํ† ํฐ์€ ๋งˆ์น˜ 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11 ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ์ƒ๊ฒผ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ์ด ๋ฌธ์„œ์—์„œ <token> ์ด๋ผ๋Š” ๋‹จ์–ด๋กœ ๋Œ€์ฒดํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํ† ํฐ์„ ์†Œ์œ ํ•˜๊ณ  ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ด ํŽ˜์ด์ง€์—์„œ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Making request (์š”์ฒญํ•˜๊ธฐ)

๋ชจ๋“  ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡ API์˜ ์ฟผ๋ฆฌ๋“ค์€ HTTPS ์—์„œ ๋ฐ›์œผ๋ฉฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์–‘์‹์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค: https://api.telegram.org/bot<token>/METHOD_NAME. ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ƒ˜ํ”Œ์„ ๋ณด์ž๋ฉด:

https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe

ํ…”๋ ˆ๊ทธ๋žจ์—์„œ๋Š” HTTP ๋ฉ”์†Œ๋“œ์ธ GET, POST์„ ๋ชจ๋‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ด‡ API ์š”์ฒญ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋„ค ๊ฐ€์ง€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  1. URL query string
  2. application/x-www-form-urlencoded
  3. application/json (except for uploading files)
  4. multipart/form-data (use to upload files)

์‘๋‹ต (response)์œผ๋กœ๋Š” 'OK' ํ•„๋“œ์™€ 'description'์„ ๊ฐ€์ง„ JSON Object๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 'OK' ํ•„๋“œ(Boolean)์˜ ๊ฒฝ์šฐ ํ•ญ์ƒ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๊ณ , 'description' ํ•„๋“œ(String)๋Š” ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ์„ ํฌํ•จํ•˜์—ฌ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ 'ok' ํ•„๋“œ์˜ ๋‚ด์šฉ์ด true์™€ ๊ฐ™๋‹ค๋ฉด, ์š”์ฒญ (request)๋Š” ์„ฑ๊ณต์ ์ด์—ˆ์œผ๋ฉฐ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋กœ 'result' ํ•„๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต์ ์ด์ง€ ๋ชปํ•œ ์š”์ฒญ์˜ ๊ฒฝ์šฐ, 'ok' ํ•„๋“œ์˜ ๋‚ด์šฉ์€ false๊ฐ€ ๋  ๊ฒƒ์ด๋ฉฐ, ์—๋Ÿฌ๋Š” 'description' ํ•„๋“œ์— ์„ค๋ช…๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 'error_code' ํ•„๋“œ(Integer) ๋˜ํ•œ ๋ฐ˜ํ™˜๋˜์ง€๋งŒ, ํ•ด๋‹น ๋‚ด์šฉ์€ ๋ฏธ๋ž˜์— ์–ธ์ œ๋“ ์ง€ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋– ํ•œ ์—๋Ÿฌ๋Š” 'parameters' ํ•„๋“œ(ResponseParameters ํƒ€์ž…)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ž๋™์ ์œผ๋กœ ์—๋Ÿฌ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ๋” ๋„์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  ๋ด‡ API์˜ ๋ฉ”์†Œ๋“œ๋Š” ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ณ„ํ•ฉ๋‹ˆ๋‹ค. (case-insensitive)
  2. ๋ชจ๋“  ์ฟผ๋ฆฌ๋Š” UTF-8์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (encoding)

Making result when getting updates

๋งŒ์•ฝ ๋‹น์‹ ์ด ์›นํ›…(webhooks)์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋‹น์‹ ์€ ์›นํ›…์— ๋‹ต๋ณ€์„ ๋ณด๋‚ด๋ฉด์„œ ๋ด‡ API๋กœ ์š”์ฒญ(request)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด application/json, application/x-www-form-urlencoded, multipart/form-data ์‘๋‹ต ์ปจํ…ํŠธ ํƒ€์ž…์„ ์ง€์ •ํ•˜์„ธ์š”. ์š”์ฒญํ•œ ๋ฉ”์„œ๋“œ ๋งค๊ฐœ ๋ณ€์ˆ˜์—์„œ ํ˜ธ์ถœ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์ •ํ•˜์„ธ์š”. ๊ทธ๋Ÿฌํ•œ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์ด์—ˆ๋Š”์ง€, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

** Updates (์—…๋ฐ์ดํŠธ)
๋‚ด๊ฐ€ ๋ณด๊ธฐ์—” ์ด ์—…๋ฐ์ดํŠธ๋Š” ๋งํ’์„  ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ชจ์–‘.

Getting updates (์—…๋ฐ์ดํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ)

๋‹น์‹ ์˜ ๋ด‡์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: getUpdates ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ, Webhooks ์‚ฌ์šฉํ•˜๊ธฐ. ๋ด‡์ด ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฐฉ์‹์„ ํ†ตํ•ด ๋ฐ›์•„์˜ฌ ๋•Œ๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๋Š” ์„œ๋ฒ„์— ์ €์žฅ๋˜๋‚˜, ์ €์žฅ์€ 24์‹œ๊ฐ„ ์ด๋‚ด๋กœ ์ง€์†๋ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€์™€ ๊ด€๊ณ„ ์—†์ด, ๋‹น์‹ ์€ ๊ทธ ๊ฒฐ๊ณผ๋กœ์„œ JSON Objects์ธ Update ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Update

์ด ๊ฐ์ฒด๋Š” ๋“ค์–ด์˜ค๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

getUpdates

ํ•œ ๊ฐœ ์ด์ƒ์˜ ์—ฌ๋Ÿฌ ๋“ค์–ด์˜ค๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Update ๊ฐ์ฒด ๋ฐฐ์—ด์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ :

  1. ๋งŒ์•ฝ outgoing webhook์ด ์„ธํŒ…๋œ๋‹ค๋ฉด, ์ด ๋ฉ”์†Œ๋“œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  2. ์ค‘๋ณต๋œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๊ฐ๊ฐ์˜ ์„œ๋ฒ„ ์‘๋‹ต ์ดํ›„ offset๋ฅผ ์žฌ๊ณ„์‚ฐํ•˜์‹ญ์‹œ์˜ค.

setWebhook

url์„ ๋ช…์‹œํ•˜๊ณ  outgoing webhook๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋ด‡์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์–ธ์ œ ์ด๋ฃจ์–ด์ง€๋“  ๊ฐ„์—, ํ…”๋ ˆ๊ทธ๋žจ์€ HTTPS POST ์š”์ฒญ์„ ํŠน์ • url๋กœ ์ „์†กํ•˜๋ฉฐ, JSON Object์ธ Update ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์š”์ฒญ์ด ์„ฑ๊ณต์ ์ด์ง€ ์•Š์•˜๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋ช‡์ฐจ๋ก€์˜ ์‹œ๋„ ํ›„์— ํฌ๊ธฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ฑ๊ณต์ผ ๊ฒฝ์šฐ True๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

์›น ์‚ฌ์ดํŠธ์˜ ์š”์ฒญ์ด Telegram์—์„œ ์ „์†ก๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด https://www.example.com/<token> ์™€ ๊ฐ™์€ ๋น„๋ฐ€์Šค๋Ÿฌ์šด ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‹น์‹  ๋ด‡์˜ ํ† ํฐ์„ ๋ชจ๋ฅด๋‹ˆ๊นŒ, ์šฐ๋ฆฌ๋ผ๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

 

---

 

ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡์„ ํ†ตํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ธ๋“ฏ ํ•˜๋‹ค.

1. sendMessage : ๋‹จ์ˆœ ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ. ๋‹จ์ˆœ ์•Œ๋ฆผ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

2. webhook ๋งŒ๋“ค๊ธฐ : ๋‹จ์ˆœ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ด๋Š” ๋ช…๋ น์–ด์— ๋”ฐ๋ผ ๋ฐ˜์‘์„ ํ•  ์ˆ˜๋„ ์žˆ๋Š” ์ƒํ˜ธ์ž‘์šฉํ˜• ๋ด‡ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ.

๋ฐ˜์‘ํ˜•