BV1AL 之無所不記

2015-05-22

大家來寫 Telegram 機器人

微軟把MSN玩死了,現在沒有MSN server可玩,以前根據 msnlib 寫的機器人都不能動了!
而 LINE 則是商業軟體,有人解出它的通訊模式, 寫成python 模組,就被LINE公司發函封口!
所以也不能寫 LINE 機器人。

還好有open source 的 Telegram !
Telegram 真是好物,因為它是open source 所以有了各種可能!
Telegram 跟LINE 的使用方式幾乎完全一樣,會用 LINE 的人幾乎立即可以上手。
Telegram 跟LINE 一樣有iOS, Android, Windows, MacOS 等版本, 但不同的是
Telegram 有Linux 版本!

Telegram 更有文字模式版本!就是 telegram-cli
git clone --recursive https://github.com/vysheng/tg.git
cd tg; ./configure --disable-liblua (用不到 lua 的話)
make
不過在make 之前你可能要先裝
libreadline-dev libconfig-dev libssl-dev libevent-dev 幾項libraries.
雖然它不是Telegram 團隊寫的,但因為 Telegram 是open source, 所以
telegram-cli 跟Telegram 完全相容!

網路上有一些以 lua 或 python 寫的 telegram-cli BOT, 也就是搭配 telegram-cli
可以自動收發資訊的外層程式,但是各有限制,所以我想想不如自己寫一個。

自己寫的好處是完全以容易寫、方便自己用,為目標,
只要利用 python 的 pexect 就能完成一個相當實用的 telegram-cli 機器人!

這裡來說一下重點,重點抓到後,細節可以千變萬化!

第一是
tg = pexpect.spawn('telegram-cli -k /path/server.pub -CNW')
tg.timeout = None
這樣會保持不跳開

第二是
tg.expect("> ")
這是 telegram-cli 在 standby 狀態時的提示符號,我們等它出現這個值,
然後來定義一些常數以便往下能使用。

第三是
while True:
進入無限迴圈,這樣便能處理「收、發」,這裡第一個要的是
tg.expect(">>> ")
這是有外來的資訊時會出現的指標,根據這個指標我們可以獲取兩段資訊。

在 ">>> " 出現之前的一段,是來訊的序號以及發訊人
Usend = tg.before.split()     #這是我們要的前一段
UID = Usend[-2]+'_'+Usend[-1] #這個可以得到對方的代號,用來送訊給對方

後一段就是資訊文,要再次利用系統提示號來區隔資訊文
tg.expect("> ")
在上面那個 ">>> " 之後,到這個 "> " 之前的一段,就是資訊文,或者就像是
我們在 LINE 聊天所送出的文字。
Umsg = tg.before
Ump = Umsg.split()
這裡故意分成一個未分割的 Umsg,以及一個分割的 Ump

如果 Umsg 的開頭是 "[photo" 或 "[image"
if Umsg.startswith('[photo') or Umsg.startswith('[image'):
我們的機器人就自動下載存檔(所以一開始 telegram-cli 的執行參數要有大寫 "N")
tg.sendline('load_photo %s'%Usend[-4])

上面只是一個例子,我們還可以定好指令字串,像收到對方送來 "get /path/file"
就可以區隔出他的指令是 "get" 也就是
if Ump[0] == 'get':
然後再區隔出後面非固定長度的的路徑+檔名
FILE = Umsg[4:].strip() 然後加上來訊對方的 UID
tg.sendline('send_file %s %s'%(UID,FILE))
來送出對方指定要抓取的檔名

也可以訂一個指令,像說
if Ump[0] == 'temp':
然後經由analog GPIO 去讀取 LM35 感溫晶體來回報目前溫度
tg.sendline('send_text %s %s'%(UID,temperature))

當然我們還可以訂一個自由指令,就是不事先訂好的字串,像說
if Ump[0] == 'cmd':
然後再來區隔出 'cmd ' 之後的任何字串
Ucmd = Umsg[4:].strip()
然後以 os.system 或 os.popen 來進行自由指令的執行
os.system('%s > /path/ucmd.txt'%Ucmd) 再由
tg.sendline('send_text %s /path/ucmd.txt'%UID)

這樣我們又有機器人可玩了!

標籤: , , ,

0 Comments:

張貼留言

<< Home