jovaughn-stephens-559088

Background

有需求做一個telegrame的bot來達成一些監控消息的傳遞. 所以來研究一下怎麼實作並且記錄.

Installation

github 上面有人提供了 python-telegram-bot 看起來方便好用所以就直接拿來用了, 比較省時間. (https://github.com/python-telegram-bot/python-telegram-bot)

$ mkdir telegram-bot
$ cd telegram-bot
$ virtualenv .venv
$ source .venv/bin/activate
$ pip3 install python-telegram-bot --upgrade

Your first Bot

1. add botfather

首先要跟botfather溝通, 這是telegram官方的bot處理各種bot的問題. (https://telegram.me/botfather)

/help可以得到個多資訊如下圖:

Screen-Shot-2018-02-16-at-9.32.59-PM

所以今天我要一個新的bot我就必須接著打 /newbot 接著 botfather會有一連串要你填入的資訊, 照著填就好. 如下圖所示:

Screen-Shot-2018-02-16-at-9.34.00-PM

填完之後就可以順利的拿掉一個api token. 之後我們就會透過這個token來跟telegram溝通來打造一個自己的telegram bot.

2. start chat with bot

透過botfather的連結你應該可以找到你自己的bot並跟她開始對話. 如下圖所示:

photo6068959377215301624

那剛開始當然打什麼都沒有反應. 因為你後端的程式還沒有啟動.

simplebot.py

那simplebot這個程式的目的很簡單. 就是bot要知道誰在下什麼指令, 並且做出相對應的反應
. 那我們就來看一下程式.

import logging
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters
from telegram.error import NetworkError, Unauthorized
from time import sleep

def start(bot, update):
    """Send a message when the command /start is issued."""
    print("chat_id: ", update.message.chat_id)
    print("user info: ", update.message.from_user)
    print("message text: ", update.message.text)
    update.message.reply_text('Hi!')

def help(bot, update):
    """Send a message when the command /help is issued."""
    print("chat_id: ", update.message.chat_id)
    print("user info: ", update.message.from_user)
    print("message text: ", update.message.text)
    update.message.reply_text('Help!')

def main():
    """Start the bot."""
    # Create the EventHandler and pass it your bot's token.
    updater = Updater("API_TOKEN")

    # Get the dispatcher to register handlers
    dp = updater.dispatcher

    # on different commands - answer in Telegram
    dp.add_handler(CommandHandler("start", start))
    dp.add_handler(CommandHandler("help", help))

    # Start the Bot
    updater.start_polling()

    # Run the bot until you press Ctrl-C or the process receives SIGINT,
    # SIGTERM or SIGABRT. This should be used most of the time, since
    # start_polling() is non-blocking and will stop the bot gracefully.
    updater.idle()
    
if __name__ == '__main__':
    main()

然後就在終端機執行這個程式. 然後這個程式是會一直執行的除非你按ctrl+c之類的東西來取消他. 因為這支程式必須一直跟telegram保持連線來得到最新bot所接收到的指令, 這樣bot才能做出反應.

P.S 把程式中 API_TOKEN 換成你剛得到的api token.

執行後就可以開始跟bot對話了. 如下圖所示:

Screen-Shot-2018-02-16-at-9.50.32-PM

那我們切到終端機的畫面, 會發現會印出一些資訊, 分別是chat_id, user_info, message_text. 如下圖所示:

Screen-Shot-2018-02-16-at-9.53.26-PM

當然你就可以透過這些資訊做更多的事. 詳細的內容可以參考:https://python-telegram-bot.readthedocs.io/en/stable/index.html.

Others

就從網路上記錄一下他跟line不太一樣的地方, 方便以後查詢&順便了解一下.

群組

Telegram 的群組稱為「Group」,也就是類似於 LINE 群組的東西。Telegram 的群組分為兩類:

  • 普通群組:與 LINE 的群組類似,且上限為 200 位使用者
  • 超級群組(Supergroup)優於普通群組的地方:
    • 使用者上限為 5,000 人
    • 訊息 PIN 功能,即置頂功能
    • 管理者可以刪除任何訊息
    • 可建立自定義的邀請加入連結
    • 可以看到加入群組之前的歷史聊天記錄
    • 頻道管理員可隨時將普通群組免費升級至超級群組,讓群組更加強大。

頻道

頻道是一個有些類似群組的東西,但是性質卻不太一樣。
你可以這樣理解:使用者「訂閱」頻道,然後頻道管理者會以頻道的名字、大頭照在頻道內「廣播」訊息,但是使用者無法發言。而且,頻道是可以有無上限的訂閱人的!

Reference