【Telegram API】Python打造Telegram機器人手把手教學:最輕鬆最詳細的方法
一、前言
在這篇文章中你可以學到,如何用python結合telegram打造專屬客服機器人。
這手把手教學在後續端段落分成:二、在Telegram端步驟、三、Python步驟含解說、四、改造你的Telegram Bot(進階應用)
在Telegram端步驟:在Telegram取得TOKEN
Python步驟含解說:快速讓機器人答話並上線,手把手解說每個要點
改造你的Telegram Bot(進階應用):讓機器人可以做更多事情,回答選單、過濾訊息回答、問題與答覆、主動與對象發話
(11/19/更新
【Telegram API】python用Telegram api來傳送圖片、文件、聲音、影片、影像等 可以參考這篇
https://pixnashpython.pixnet.net/blog/post/46428874
進入教學前,不要忘了訂閱按讚分享唷!
部落格教學網站:
https://pixnashpython.pixnet.net/blog
想要即時訂閱最新文章:
https://forms.gle/MdXmiF2HgHhNChL46
訂閱Telegram來接收最新資訊:
https://t.me/joinchat/VUUuDt67Uq5l6CIQ
YouTube:恩哥想當快樂社畜
https://youtube.com/channel/UCuj9oYDXt4D0mBgae4ODK-g
二、Telegram端步驟
這部份很簡單,在telegram中找到BotFather並跟他申請一個機器人,取得你機器人的token。
五大步驟一次無痛申請好(如下附圖):
步驟一:在Telegram搜尋欄輸入BotFather並打開
步驟二:輸入 /newbot
步驟三:輸入機器人名稱
步驟四:輸入機器人使用者名稱
步驟五:取得TOKEN複製起來(PYTHON用)
三、Python步驟含解說
一樣五大步驟手把手帶你pyrhon用到好,更炫的互動方式寫在第四段
(1) pip 安裝 python-telegram-bot
pip install python-telegram-bot
# telegram.__version__ = 13.3
首先pip安裝python-telegram-bot我用的是telegram.__version__ = 13.3的版本,
版本差異好像蠻大的,建議大家可以選擇跟我一樣的版本。
還不會安裝套件的可以看:【Python基礎】pip安裝Python套件包(package)的三大方法一種裝不好還有其他兩種!
(2) 設定TOKEN及初始化BOT
# 匯入相關套件
from telegram.ext import Updater # 更新者
from telegram.ext import CommandHandler, CallbackQueryHandler # 註冊處理 一般用 回答用
from telegram.ext import MessageHandler, Filters # Filters過濾訊息
from telegram import InlineKeyboardMarkup, InlineKeyboardButton # 互動式按鈕
# 設定 token
token = '填入你剛取得的TOKEN'
# 初始化bot
updater = Updater(token=token, use_context=False)
Updater更新者可以依照你給的TOKEN取得Telegram上的所有事件,
包含誰對你的機器人發訊息、訊息內容等等所有事件,如果把機器人丟進群組一樣會取得群組內的事件狀況。
(3) 設定一個dispatcher(調度器)
# 設定一個dispatcher(調度器)
dispatcher = updater.dispatcher
dispatcher(調度器)像是一個調度者,它的功用就是處理你有定義的handler,
handler是你等等要定義的對事件的處理方式。
(4) 新增handler並加入dispatcher
# 定義收到訊息後的動作(新增handler)
def start(bot, update): # 新增指令/start
message = update.message
chat = message['chat']
update.message.reply_text(text='HI ' + str(chat['id']))
dispatcher.add_handler(CommandHandler('start', start))
定義一個handler叫做start,當機器人收到 /start 指定時,就要去進行start方法裡面的動作。
我們先定義出start方法而後藉由CommandHandler跟指令/start做綁定。
而後使用dispatcher.add_handler把一個handler加入我們的dispatcher(調度器)。
如此一來我們只要輸入/start 機器人就會回答HI + 發送訊息群組或個人的ID。
最後來看一下我們可以藉由update中的可以取得哪些訊息,你可以在start的函數中加上print(update)看一下,
這樣才知道我們的回覆需要用到那些資訊。
update>>>
{'update_id': 165102561, 'message': {'message_id': 194, 'date': 1615440626, 'chat': {'id': 發送端id,
'type': 'private',
'first_name': '名稱',
'last_name': '姓'},
'text': '/test',
'entities': [{'type': 'bot_command', 'offset': 0, 'length': 5}],
'caption_entities': [],
'photo': [],
'new_chat_members': [],
'new_chat_photo': [],
'delete_chat_photo': False,
'group_chat_created': False,
'supergroup_chat_created': False,
'channel_chat_created': False,
'from': {'id': 來自哪個人,
'first_name': '名稱',
'is_bot': False,
'last_name': '姓',
'language_code': 'zh-hant'}}}
chat與from最大的差別在,一個是指取得對方是從何個群組發動訊息給機器人,
也就是說如果是以直接對機器人發訊息chat與from會是一樣的,但如果機器人在某群組,
則chat取得群組資料,from取得群組裡發送訊息的人資訊。
在我們的範例中,我先對update取得message取得訊息後,在繼續往下找我所需要的訊息。
最後找到message下chat下的id大家可以跟我用一樣的方法,比較好理解。
update.message.reply_text則用這個方法把我們的訊息回覆出去。
# 定義收到訊息後的動作(新增handler)
def start(bot, update): # 新增指令/start
message = update.message
chat = message['chat']
update.message.reply_text(text='HI ' + str(chat['id']))
(5) 開始運作Telegram Bot
# 開始運作bot
updater.start_polling()
# 待命 若要停止按Ctrl-C 就好
#updater.idle()
# 離開
#updater.stop()
讓Telegram Bot運轉起來,updater.start_polling()就可以使機器人運作。
updater.idle()這行帶入的話,則在開始運作後你無法對機器人做任何動作,例如對指定人發訊,
但其實updater.start_polling()已經讓你的機器人開始上線瞜。
四、改造你的Telegram Bot(進階應用)
(1) 對指定對象發話
# 發指定對象訊息
who = '對象ID, '
text = '我是機器人可以問我問題喔!'
dispatcher.bot.send_message(chat_id=who, text=text) # 發送訊息
使用dispatcher.bot.send_message方法就可以把訊息藉由機器人送到某人、或聊天室。
這個id是chat的id可以藉由上面update中取得。
(2) 回答非指定或其他種問題(回答不是/ 指令 問題)
from telegram.ext import MessageHandler, Filters # Filters過濾訊息
def echo(bot, update): # 其他訊息
message = update.message
text = message.text + ' <<< 這個部份我就不太懂了~'
update.message.reply_text(text=text)
dispatcher.add_handler(MessageHandler(Filters.text, echo)) # Filters如果是文字就呼叫echo
使用from telegram.ext import MessageHandler, Filters,
Filters.text意思是如果聊天端發送的訊息是文字就是True,
而後藉由MessageHandler來與我們定義的echo連結,最後使用dispatcher.add_handler加入調度器。
(3) 回答選單
from telegram import InlineKeyboardMarkup, InlineKeyboardButton # 互動式按鈕
def blog(bot, update): # /btc 互動式按鈕
update.message.reply_text('量化交易中心',
reply_markup = InlineKeyboardMarkup([[
InlineKeyboardButton('恩哥Python量化教室',
url = 'https://pixnashpython.pixnet.net/blog'),
InlineKeyboardButton('你的網路生活教授Nash',
url = 'https://pixnashlife.pixnet.net/blog')
]])
)
dispatcher.add_handler(CommandHandler('blog', blog))
使用InlineKeyboardMarkup, InlineKeyboardButton來建立回答的是按鈕,使用方式如程式碼所述。
(4) 與機器人選單問與答
from telegram.ext import CommandHandler, CallbackQueryHandler # 註冊處理 一般用 回答用 from telegram import InlineKeyboardMarkup, InlineKeyboardButton # 互動式按鈕 # 定義問題 qt = { 'Q1': '你是誰?', 'Q2': '有新文章嗎?', 'Q3': '今天會下雨嗎?' } # 問題以選單方式提出 def question(bot, update): update.message.reply_text('你問我答', reply_markup = InlineKeyboardMarkup([[ InlineKeyboardButton(qt, callback_data = name) for name, qt in qt.items() ]])) # 回答問題 def answer(bot, update): yours = update.callback_query.data # 一樣從update中抽取資料 update.callback_query.edit_message_text(text=yours)
dispatcher.add_handler(CommandHandler('question', question)) # 問題 dispatcher.add_handler(CallbackQueryHandler(answer)) # 回答問題
先建立問題及回答問題的方式如上面定義的question及answer方法,
最後question使用CommandHandler綁定 /question,
answer使用CallbackQueryHandler綁定,就可以取得對方按下按鈕後的資訊,並且去做處理。
callback_query取得對方按下的資訊,哪個按鈕、按鈕內容等,
用callback_query.edit_message_text把資訊回覆出去。
點下你是誰後出現我們定義的回答方式
五、成果與後記
完整程式碼
# pip install python-telegram-bot
# telegram.__version__ = 13.3
from telegram.ext import Updater # 更新者
from telegram.ext import CommandHandler, CallbackQueryHandler # 註冊處理器 一般用 回答用
from telegram.ext import MessageHandler, Filters # Filters過濾訊息
from telegram import InlineKeyboardMarkup, InlineKeyboardButton # 互動式按鈕
#import telegram
# 設定 token
token = '你的機器人TOKEN'
# 初始化bot
updater = Updater(token=token, use_context=False)
# 設定一個dispatcher(調度器)
dispatcher = updater.dispatcher
# 定義收到訊息後的動作(新增handler)
def start(bot, update): # 新增指令/start
message = update.message
chat = message['chat']
update.message.reply_text(text='HI ' + str(chat['id']))
def blog(bot, update): # /btc 互動式按鈕
update.message.reply_text('量化交易中心',
reply_markup = InlineKeyboardMarkup([[
InlineKeyboardButton('恩哥Python量化教室',
url = 'https://pixnashpython.pixnet.net/blog'),
InlineKeyboardButton('你的網路生活教授Nash',
url = 'https://pixnashlife.pixnet.net/blog')
]])
)
qt = {
'Q1': '你是誰?',
'Q2': '有新文章嗎?',
'Q3': '今天會下雨嗎?'
}
def question(bot, update):
update.message.reply_text('你問我答',
reply_markup = InlineKeyboardMarkup([[
InlineKeyboardButton(qt, callback_data = name) for name, qt in qt.items()
]]))
def answer(bot, update):
yours = update.callback_query.data # 一樣從update中抽取資料
update.callback_query.edit_message_text(text=yours)
def echo(bot, update): # 其他訊息
message = update.message
text = message.text + ' <<< 這個部份我就不太懂了~'
update.message.reply_text(text=text)
# 把handler加入dispatcher()
dispatcher.add_handler(CommandHandler('start', start))
dispatcher.add_handler(CommandHandler('blog', blog))
dispatcher.add_handler(CommandHandler('question', question)) # 問題
dispatcher.add_handler(CallbackQueryHandler(answer)) # 回答問題
dispatcher.add_handler(MessageHandler(Filters.text, echo)) # Filters如果是文字就呼叫start
# 發指定對象訊息
who = '對象ID, '
text = '我是機器人可以問我問題喔!'
dispatcher.bot.send_message(chat_id=who, text=text) # 發送訊息
# 開始運作bot
updater.start_polling()
# 待命 若要停止按Ctrl-C 就好
#updater.idle()
# 離開
#updater.stop()
如果這樣還不清楚的話,之後考慮出一篇專案式教學,如果想看的可以留言告訴我。
【Telegram API】python用Telegram api來傳送圖片、文件、聲音、影片、影像等 可以參考這篇
https://pixnashpython.pixnet.net/blog/post/46428874
部落格教學網站:
https://pixnashpython.pixnet.net/blog
想要即時訂閱最新文章:
https://forms.gle/MdXmiF2HgHhNChL46
訂閱Telegram來接收最新資訊:
https://t.me/joinchat/VUUuDt67Uq5l6CIQ
留言列表