Day 29 : 撰写LineBot,利用短短三天认识自动化机器人(下)

今天来继续接着昨天的LineBot。我们昨天讲到,我们可以使用ngrok来让程序连上公开网路,也就是说,整个flask框架是连上网路的,所以flask可以做到的东西基本上都可以让LineBot运作,所以Python能做到的爬虫等功能LineBot也能做到。

我们来帮昨天的程序码加点东西吧,我想弄两个抽签功能,所以我将程序码改成这样:

import random #加到第一行
@ handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    if "运势" in event.message.text:
        fortune = random.choice(['大凶', '凶', '末吉', '吉','中吉','大吉'])
        line_bot_api.reply_message(event.reply_token, TextSendMessage(text=fortune))  
    if "吃什麽" in event.message.text:
        eat = random.choice(['水饺', '小7', '火锅', '炒饭','拉面','阳春面'])
        line_bot_api.reply_message(event.reply_token, TextSendMessage(text=eat))

我使用了Random函式,设定如果使用者输入有运势包含在输入内,就会在下面的串列中随机挑一个

元素输出。开启ngrok做测试,记得每一次测试ngrok的网址都会换,记得要去Webhook URL里面改网址。
https://ithelp.ithome.com.tw/upload/images/20211012/20138060gJeYrCH0Ra.png
分开是没问题的,可是当两个选项都符合时,cmd会报错加上机器人只会回你第一个判断式的结果。这是因为line_bot_api.reply_message()这个函式只会使用一次,第二次会因为使用过了所以不执行并且报错。这有一种方法可以解决,那就是将line_bot_api.reply_message()里面的元素当成串列资料,再把每一次的结果用append的方式存到这个阵列中一起传出,具体程序码长这样:

@ handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    msg = []
    if "运势" in event.message.text:
        fortune = random.choice(['大凶', '凶', '末吉', '吉','中吉','大吉'])
        msg.append(TextSendMessage(text=fortune))
    if "吃什麽" in event.message.text:
        eat = random.choice(['水饺', '小7', '火锅', '炒饭','拉面','阳春面'])
        msg.append(TextSendMessage(text=eat)) 
    line_bot_api.reply_message(event.reply_token, messages=msg[:2])

https://ithelp.ithome.com.tw/upload/images/20211012/20138060oE8X0WjEQa.png
这样机器人就可以正常运作了~

再来一定有人想过如果这个机器人在群组里面,会不会也可以达成同样的作用呢?答案是可以的,机器人不管在私聊或群通有着一样的效果,不过要邀请机器人到群组我们需要将Messaging API设定中的Allow bot to join group chats调成启用,点进Edit後调整Toogle features中的Group and multi-person chats:
https://ithelp.ithome.com.tw/upload/images/20211012/20138060RooKDaLrFB.png
https://ithelp.ithome.com.tw/upload/images/20211012/20138060mrebKn7DjD.png
这样就可以将机器人邀进群组了!

既然讲到群组了一定有人会想说可不可以针对不同人来撰写特定的程序码,让不同人讲同样的话会有不同的回应,或是特定的人讲话才会有回应等,这部分当然是可以的,我们只要知道每个人的User ID就好了,那这部分要怎麽取得呢,这之间要有个动作,也就是对方讲话的时候,我们就可以用特定函式取得他的User ID:

UID = event.source.user_id

我们在函式最前面加上这行,利用event.source.user_id可以取得使用者ID。利用event.source.user_id还可以帮你取得当前讲话的帐号名字,大头照位置以及个人介绍。

if event.message.text == 'UID':
        msg.append(TextSendMessage(text=line_bot_api.get_profile(UID).display_name+':\n'+'你的UID为:' + UID))
    if event.message.text == 'UID':
        msg.append(TextSendMessage(text='你的大头贴图片位置:'+line_bot_api.get_profile(UID).picture_url))
    if event.message.text == 'UID':
        msg.append(TextSendMessage(text='你的个人介绍:'+line_bot_api.get_profile(UID).status_message))

这边有三个功能:

**line_bot_api.get_profile().display_name:**取得指定User ID的名称

**line_bot_api.get_profile().picture_url:**取得指定User ID的图片位置

**line_bot_api.get_profile().status_message:**取得指定User ID的个人简介

参数放的都是发讯息那个人的UID,所以我放入前面的UID变数。

line_bot_api.reply_message(event.reply_token, messages=msg[:5]) #改成:5

记得要把阵列范围条大再进行测试:
https://ithelp.ithome.com.tw/upload/images/20211012/20138060718f5KUmdX.jpg
这样就可以同时取得这个人的UID以及他的其他资讯了!也可以利用print功能来将使用者说的话显示在cmd上,就可以做到聊天纪录备份的功能。

print(f'{UID}说:{event.message.text}')

https://ithelp.ithome.com.tw/upload/images/20211012/20138060Yz7UezVZDo.png
https://ithelp.ithome.com.tw/upload/images/20211012/20138060Xo0kOG9o42.png
对了,有User ID,那有没有Group ID?当然是有,用的是event.source.group_id这个功能。利用判别Group ID也能让不同群组的指令有不一样的变化。像是之前我就有实际测试一种方案,就是利用push_message的形式,这个发送讯息的模式是主动的,不需要有人传讯息才会发送:

line_bot_api.push_message('别群的Group ID',TextSendMessage(text=event.message.text))

大概长得像这样,使用**line_bot_api.push_message()**这个函式达到自动推送,参数就放想发送的群组的Group ID,後面放的是想发送的讯息,这是拿来干嘛的呢?就是将群组的讯息,备份到这个群组内,可是最後我不用这方法了,原因是因为这种推送讯息普通帐号一个月只能发送500则,对於群组讯息真的是不够用,所以建议要做到这种讯息备份比较好的做法是用前面的方法抓到本地再处理成文字档。

LineBot还可以发送各种不同的讯息,单纯用Python的功能也可以放入各种功能(例如爬取指定网站资料或是将使用者的图片本地端用PIL处理完後再发送回去等)。以上就是我的LineBot介绍,希望这三篇可以让各位对於LineBot有简单的认识,关於其他讯息发送(图片、影片等)可以多参考研究官方文件,因为本人没用到所以不熟,就不多做介绍了。明天就来把最後的结语以及在这铁人赛过程中的心得、期许讲出来吧!


<<:  Day29:翻译蒟蒻

>>:  【从实作学习ASP.NET Core】Day30 | 总结与回顾

超级好用的avast删除方法

你想从 Mac 中删除 Avast 吗? 事实上,卸载 Avast 并不像其他程序那麽容易。 许多用...

Day 15 - Asynchronous 非同步进化顺序 - Callback 与 Promise

前言 在上一篇文章中,我们深入了解 Javascript 非同步的核心,到底在背景做了哪些事,才构成...

失误的修补智慧

在各行各业工作时,很多人都有因为工作上失误,而被上司责骂的经验,这些必经的过程,被视为「学习」和「记...

Day29-"练习-4"

今天也是练习CPE的题目 世界闻名的黑社会老大A先生要搬到纽约来了。在那里他有一个大家族,并且他们都...

硬体的讯号怎麽丢给软件?

预设 先要有一个开发板,可以接各种sensor。 可以先跟电脑有实体连接,这样就有指定的port可以...