【Day 09】Text Message 应用

前一天我们讲到综合版可以接收所有种类的讯息。

@csrf_exempt
def callback(request):
    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)  # 传入的事件
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            print("event", event.message.id)
            # print("event", type(event))
            if isinstance(event, MessageEvent):  # 如果有讯息事件
                print("message", event.message)
                message = []
                if event.message.type == 'text':
                    text_ = event.message.text
                    message.append(TextSendMessage(text=text_))

                elif event.message.type == 'sticker':
                    text_ = event.message.id
                    message.append(TextSendMessage(text=text_))

                elif event.message.type == 'image':
                    text_ = event.message.id
                    message.append(TextSendMessage(text=text_))

                elif event.message.type == 'video':
                    text_ = event.message.id
                    message.append(TextSendMessage(text=text_))

                elif event.message.type == 'audio':
                    text_ = event.message.id
                    message.append(TextSendMessage(text=text_))

                elif event.message.type == 'location':
                    text_ = event.message.id
                    message.append(TextSendMessage(text=text_))

                # 回复传入的讯息文字
                line_bot_api.reply_message( event.reply_token, message )

            
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

那我们先专心讲解关於 type()text 的讯息

tyep == text

@csrf_exempt
def callback(request):
    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)  # 传入的事件
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            print("event", event.message.id)
            # print("event", type(event))
            if isinstance(event, MessageEvent):  # 如果有讯息事件
                print("message", event.message)
                message = []
                if event.message.type == 'text':
                    text_ = event.message.text
                    message.append(TextSendMessage(text=text_))
                line_bot_api.reply_message( event.reply_token, message )
                
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

我们在 line 19 宣告了一个 list,message 好让我们之後 line_bot_api.reply_message() 推送讯息比较方便。

这边跟之前一样都没有改过,就是回推送传过的讯息。

那我们改成如果遇到关键字就传送某些讯息的话...

from django.shortcuts import render

# Create your views here.

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from django.conf import settings

from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextSendMessage
import os

line_bot_api = LineBotApi(settings.LINE_CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(settings.LINE_CHANNEL_SECRET)

@csrf_exempt
def callback(request):
    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            events = parser.parse(body, signature)  # 传入的事件
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()

        for event in events:
            print("event", event.message.id)
            # print("event", type(event))
            if isinstance(event, MessageEvent):  # 如果有讯息事件
                print("message", event.message)
                message = []

                if event.message.type == 'text':
                    mtext = event.message.text
                    if "嗨" in mtext:
                        text_ = "哈罗你好"
                    else:
                        text_ = 'What?'

                    message.append(TextSendMessage(text=text_))


                # 回复传入的讯息文字
                line_bot_api.reply_message( event.reply_token, message )

        return HttpResponse()
    else:
        return HttpResponseBadRequest()
if event.message.type == 'text':
    mtext = event.message.text
    if "嗨" in mtext:
        text_ = "哈罗你好"
    else:
        text_ = 'What?'

我们看一下 mtext 里面有甚麽:

mtext: 嗨
mtext: 呜呜呜
type of mtext: <class 'str'>

这里我们可以看到 mtextstr 型态
所以这里就可以透过逻辑运算来处理文字讯息。

当然,这里其实都算是透过官版就可以处理的问题,我们明天就来看看基本的按钮选项(Button Template)


补充

补充一个在 ngrok 连线时有可能发生的问题:

启动 ngrok 连线却出现以下错误:

Your account '' is limited to 1 similtaneous ngrok client session.
Active ngrok client sessions in region 'us':
    ......

ERR_NGROK_108

这段错误基本上是在说,帐户只允许一个 client session。
附上官网传送门

这边自己的解决方式就只是换区而以:

ngrok http -region ap 8000

供大家参考参考


<<:  Day-12 Multilevel Cache

>>:  【Day 24】JavaScript 事件处理

sed - 3 Delete command

前篇回顾 sed - 简介 读取编辑文字档的好工具 sed - 2 Pattern 今天来聊一下se...

证照为我们的职涯提供基本的防护

大家梦想中的职涯都是逐步而稳定的进阶, 最後抵达成功的殿堂. 然而成功的职涯更像是攀岩, 一不小心...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day17 文章留言功能

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

资料库正规化说明(Day11)

目的 1.降低资料重复性(Data Redundancy) 2.避免资料更新异常(Anomalies...

Day16-Kubernetes 那些事 - Resource Quotas

前言 昨天的文章讲完 Deployment 以及 ReplicaSet 後相信大家应该对於如何产生更...