『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

今更だけどDjangoでLINEボットを実装したからな( `•ω•´ )

はじめに

f:id:nanashinodonbee:20170903181036p:plain

Messaging APIのご紹介 | LINE Business Center より画像引用

最近DjangoでLINEボット作っているのでメモ的なあれ

nnsnodnb.hatenablog.jp

上の記事はTrial APIのものなのでそろそろ古いなぁって思ってたので

環境

実装

Djangoプロジェクトの作成やLINEボットのWeb上での取得やURLなどは色んなサイトに載ってるはずなので省略します。

今回オウム返しプロジェクトを作成したのでよければ…

https://bitbucket.org/nnsnodnb/django_linebot_samplebitbucket.org

とりあえず簡単なオウム返しは以下。

bot.views.py

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
from linebot import LineBotApi, WebhookParser
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextMessage, TextSendMessage


line_bot_api = LineBotApi('YOURLINE_CHANNEL_ACCESS_TOKEN')
parser = WebhookParser('YOUR_LINE_CHANNEL_SECRET')


@csrf_exempt
def webhook(request):
    if request.method != 'POST':
        return HttpResponse('ん?なんやようか?', status=405)

    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 not isinstance(event, MessageEvent):
            continue
        if not isinstance(event.message, TextMessage):
            continue

        text_send_message = TextSendMessage(text=event.message.text)
        line_bot_api.reply_message(
            event.reply_token,
            text_send_message
        )

    return HttpResponse(status=200)

わざわざ説明するようなことはありませんが、こんな感じですね。

以下、一部サンプルを紹介です。

Botton

https://devdocs.line.me/images/buttons.png

LINE API Reference より画像引用

ソースコード

from linebot.models import (
    TemplateSendMessage, ButtonsTemplate, \
    PostbackTemplateAction, MessageTemplateAction, URITemplateAction
)
・・・
        line_bot_api.reply_message(
            event.reply_token,
            TemplateSendMessage(
                alt_text='Buttons template',
                template=ButtonsTemplate(
                    thumbnail_image_url='https://example.com/image.jpg',
                    title='Menu',
                    text='Please select',
                    actions=[
                        PostbackTemplateAction(
                            label='postback',
                            text='postback text',
                            data='action=buy&itemid=1'
                        ),
                        MessageTemplateAction(
                            label='message',
                            text='message text'
                        ),
                        URITemplateAction(
                            label='uri',
                            uri='http://example.com/'
                        )
                    ]
                )
            )
        )

Confirm

https://devdocs.line.me/images/confirm.png

LINE API Reference より画像引用

ソースコード

from linebot.models import (
    TemplateSendMessage, ConfirmTemplate, PostbackTemplateAction
)
・・・
        line_bot_api.reply_message(
            event.reply_token,
            TemplateSendMessage(
                alt_text='Confirm template',
                template=ConfirmTemplate(
                    text='Are you sure?',
                    actions=[
                        PostbackTemplateAction(
                            label='postback',
                            text='postback text',
                            data='action=buy&itemid=1'
                        ),
                        MessageTemplateAction(
                            label='message',
                            text='message text'
                        )
                    ]
                )
            )
        )

github.com

README.md みたら基本的に書いてあるので見てね!(面倒になった

おまけ

上記ツイートのように、最近新しいAPIが追加されたのでSDKにPR出したのでそれがマージされたときの使い方を紹介 ← マージされました!!

↓クソPRだよ!
github.com

from linebot.models import (
    TemplateSendMessage, ImageCarouselTemplate, ImageCarouselColumn, \
    PostbackTemplateAction, MessageTemplateAction, URITemplateAction
)
・・・
        line_bot_api.reply_message(
            event.reply_token,
            TemplateSendMessage(
                alt_text='Image carousel template',
                template=ImageCarouselTemplate(
                    columns=[
                        ImageCarouselColumn(
                            image_url='https://example.com/item1.jpg',
                            action=PostbackTemplateAction(
                                label='postback1',
                                data='action=buy&itemid=1'
                            )
                        ),
                        ImageCarouselColumn(
                            image_url='https://example.com/item2.jpg',
                            action=MessageTemplateAction(
                                label='message2',
                                text='message text2'
                            )
                        ),
                        ImageCarouselColumn(
                            image_url='https://example.com/item3.jpg',
                            action=URITemplateAction(
                                label='uri1',
                                uri='https://example.com/1'
                            )
                        )
                    ]
                )
            )
        )

最後に

SDKを公式さんが出してくださっているのでやっぱり開発は楽ですね〜。
ただ上記リポジトリexamples には Flask でのみの実装サンプルしかないのであれでした。

入る学科間違えたと気付いた時にはもう遅かった

地獄を生きていくこのサバイバル高専生活果たしてどう生きていく