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

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

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

はじめに

f:id:nanashinodonbee:20170903181036p:plain

https://business.line.me/ja/services/bot より画像引用

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

nnsnodnb.hatenablog.jp

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

環境

実装

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

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

bitbucket.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

Documentation | LINE Developers より画像引用

ソースコード

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

Documentation | LINE Developers より画像引用

ソースコード

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 でのみの実装サンプルしかないのであれでした。