【Day 08】基本程序介绍

我们回到第三天建立专案那天写的echo程序码。
结果如下:

主程序

Text Message

我们再把这个程序码打出来

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:
            if isinstance(event, MessageEvent):  # 如果有讯息事件
                line_bot_api.reply_message(  # 回复传入的讯息文字
                    event.reply_token,
                    TextSendMessage(text=event.message.text)
                )
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

我们专注在 Line 13 开始

for event in events:
    if isinstance(event, MessageEvent):  # 如果有讯息事件
        line_bot_api.reply_message(  # 回复传入的讯息文字
            event.reply_token,
            TextSendMessage(text=event.message.text)
        )

昨天有提到,event即是有事件传入。
有多少种事件?昨天都有讲过了~。

if isinstance(event, MessageEvent):

在这里先来讲讲 isinstance 的作用~

isinstance

这个 python funtion 类似 type()

两者区别再於:

  • type() 不会考虑继承关系(class 里的Inheritance),他不会认为子类别(Sub Class)是父类别(Base Class)的一种。
  • isinstance() 会考虑继承关系,所以 Sub Class 会被认为跟 Base Class 同类别。
if isinstance(event, MessageEvent):
    line_bot_api.reply_message(  # 回复传入的讯息文字
        event.reply_token,
        TextSendMessage(text=event.message.text)
    )

如果我 print 出 event 的内容:

for event in events:
    print("event text", event.message.text)
    if isinstance(event, MessageEvent):  # 如果有讯息事件
event 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_))

                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()

我们这边除了文字讯息以外,其他都回传讯息 id 给使用者,我们来看看发生甚麽事。

我们先从这部分开始,之後会一个一个解释。

Message Type

Message Type 有以下几种(昨天也讲过了)

  • text
  • sticker
  • image
  • video
  • audio
  • location

每一个 typeevent 里的内容都不同。我们会在之後的天数慢慢把细节补齐(坑一定会补完的!)

这里我们先讲 Text 的部分
这些就是我们在 Text 这个 event 里面有的所有内容。

{
  "events": [
    {
      "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
      "type": "message",
      "mode": "active",
      "timestamp": 1462629479859,
      "source": {
        "type": "user",
        "userId": "U4af4980629..."
      },
      "message": {
        "id": "325708",
        "type": "text",
        "text": "@example Hello, world! (love)",
        "emojis": [
          {
            "index": 23,
            "length": 6,
            "productId": "5ac1bfd5040ab15980c9b435",
            "emojiId": "001"
          }
        ],
        "mention": {
          "mentionees": [
            {
              "index": 0,
              "length": 8,
              "userId": "U850014438e..."
            }
          ]
        }
      }
    }
  ]
}

我们所传入的讯息被储存在 event.message.text 里面,如果我们要使用的话,也可以随时拿取里面所需的内容。

一开始的 echo,就是指 TextSendMessage(text=event.message.text)
我们回传的是自己传进来的文字!


之後会填上所有的坑,包含 Line Bot 的应用。
今天就先稍微讲到这里!


<<:  为何与如何创业?

>>:  第十八天:用 Plugin 扩充 TeamCity

Day22. 谁说画面只能写在Erb - 一起在helper写画面

今天要开始介绍,如何做自定义helper,并使用。 helpers依照惯例会写在app/helper...

goroutine

Golang goroutine 我自己理解goroutine 就很类似其他语言的thread[备注...

[Day 23] Android Studio 七日陨石开发:安装与创建第一个专案 (上)

前言 模型已经训练好了,剩下来的就是如何将模型布署到手机上, 在这之前,我要先带大家安装所需要的软件...

【Day 26】情境模拟:再好看也没用 !? 设计稿被工程师说太难做不出来 QQ

接下来,会就六角学院 UI 设计入门 课程中,针对团队合作时会碰到的情境稍作讨论。 设计稿再好看也没...

GitHub 上讨论议题 - 建立第一个 Issue 与自订 Labels

GitHub Issue 有点像是专案管理系统内管理工作事项的功能,但它能达到功能更多:无论是个人或...