【初心者向け】基礎&実践プログラミング

初心者がつまづきやすいところ、最短で実力が身につく方法をお伝えします。

【LINE bot】おいら、だじゃレンジャー!

はじめに

前回のLINE botの記事でオウムがえしのLINE botを作成したぞ!

ちびっこのみんなに好かれたくお題を与えるとそのお題にまつわる だじゃれを返すLINE botを作成することにしたんだ😁

LINE botの登録、作成、Herokuへのデプロイ等は 前回のLINE botの記事を参考にしてくれ👍

完成品

できあがりはこんな感じなんやで! ぜひとも友達登録してくれよな😁

f:id:AIProgrammer:20200419011400p:plain

準備

  • Procfile (Herokuで実行するコマンド)
  • requirements.txt (main.pyを動かす上で必要なパッケージ)
  • runtime.txt (使用する言語とバージョン)
  • main.py (LINE botのmainの部分)
  • dajaregen.py (だじゃれを生成する部分)

Procfile

web: python3 main.py

requirements.txt

Flask==1.1.1                
line-bot-sdk==1.15.0
requests==2.22.0
beautifulsoup4==4.8.2 
urllib3==1.25.8

runtime.txt

python-3.6.8

main.py

from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os
import dajaregen as dj

app = Flask(__name__)

#環境変数取得
# not should be chnged chracters.
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]


line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    word = event.message.text
    dajare_text = dj.dajare_search(word)
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=dajare_text))


if __name__ == "__main__":
#    app.run()
    port = int(os.getenv("PORT", 5000))
    app.run(host="0.0.0.0", port=port)

dajaregen.py

import requests
from bs4 import BeautifulSoup
import urllib
import random

def dajare_search(query):
    q_quote = urllib.parse.quote(query)
    r = requests.get(f'https://dajare.jp/keyword/{q_quote}/')
    bs = BeautifulSoup(r.text, features="html.parser")
    dajare = []
    for x in bs.find_all('tr'):
        da = x.find("td", class_='ListWorkBody')
        if not da:
            continue
        score = x.find("td", class_="ListWorkScore")
        dajare.append({'text': da.text, 'score': float(score.text.split(' (')[0])})
    dajare_text = []
    for x in sorted(dajare, key=lambda x: x['score'], reverse=True):
        dajare_text.append(x['text'])
    #result = '\n'.join(dajare_text)
    result = random.choice(dajare_text)
    return result

main.pyについて

これが、LINE botのメインとなるぞ。 ほとんど、line-bot-sdk-pythonのお手本と変わらないけれど、注目してほしいのは、この部分👀

利用者がbotへ向けて送ったメッセージ(だじゃれのお題)を取得して、dajaregen.pyのdajare_searchの引数として入力することで、だじゃれを返す。

word = event.message.text
dajare_text = dj.dajare_search(word)

だじゃれは、この部分から利用者へ返すぞ!

line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=dajare_text))

dajaregen.pyについて

ここで、選りすぐりのだじゃれを考えているぞ。

だじゃれのネタはDajareStationを参考にしているんだ。 (僕もまだまだ未熟なのさ...)

そこから、htmlからお題にまつわるだじゃれを取り出し、 ランダムにひとつだけ返す作りになっているだ〜。 コードはこちらを参考にさせてもらったよ! 僕の生みの親同然です!!ありがとう!

実行

実行するとこんな感じだよ! 同じお題でも違うだじゃれを返してみせるよ😆 f:id:AIProgrammer:20200419011413p:plain

まとめ

お題を与えることでだじゃれを返すLINE botを作った。

他にも楽しめそうなことがあったらコメントで教えてくれ!



頑張れ!喝!!の代わりにB!ブックマークを押していただけるとただただうれしいです(^^)! ↓