【Python】R指定のかっこいいパンチラインをスクレイピングし、結果をランダムで返してくれるLINE BOTを作った話

# 結論（何を作ったか）
LINE BOTに"R指定"と入力してメッセージを送ると、R指定のかっこいいパンチラインをランダムで3つ返してくれる

## 背景
フリースタイルダンジョンというテレビ番組が好きでよく見ている。その中で一番好きなモンスターがR指定だ。（今はモンスターとして出ていない。）R指定のラップは即興性があって、心地のいい韻を踏んでいる。素人の私が聞いていても、気持ちがいい。そこで、R指定が今までに繰り出してきたかっこいいパンチラインを見れたらいいなと思い、Pythonの学習を兼ねて今回のLINE BOTを作ることにした。以前にもLINE BOTを作っているが、***今回はスクレイピングする部分を関数にしているところがポイント。***

以前作ったLINE BOT↓
[【Python】平成最後だから流行語で振り返る LINE BOTを作った話](https://qiita.com/1-row/items/67b5a85b6c0f00690c72)

## 全体の流れ
① LINE BOTにR指定と入力してメッセージを送る
② R指定のかっこいいパンチラインをスクレイピングする
③ スクレイピングした中からランダムで3つ抽出する
④ 結果がLINE BOTから返ってくる
⑤ 返ってきたパンチラインを眺めて感心する

こんな感じ↓
<img width="375" alt="rap_ss1.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400635/3b9e75c8-8b48-ef9b-ad75-08fc8f178875.jpeg">

## 実際のコード
スクレイピング処理のファイル。関数にしている。R指定というメッセージを受けると処理が始まる。

```python:scrape.py
# モジュールの読み込み
import requests
from bs4 import BeautifulSoup
import urllib.request
import random

# スクレイピング処理
def getIn():
    r = requests.get("https://in-note.com/rappers/1")
    soup = BeautifulSoup(r.content, "html.parser")

# 韻一覧取得
    word = soup.find_all("div", class_ = "word")
    wordlist = [x.text.replace("\n"," ") for x in word] # タグを取り除き、余分な改行を削除
    wordlist = random.sample(wordlist, 3) # ランダムで3つ抽出
    wordlist = "【R指定】" + "\n" + "> " + wordlist[0] + "\n\n" + "> " + wordlist[1] + "\n\n" + "> " + wordlist[2]
    return wordlist

```

LINE BOT側の処理。スクレイピングの処理が一緒になっていないのでコードがスッキリ。

```python: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 requests
import scrape as sc # scrape.py読み込み

app=Flask(__name__)
# トークン等の情報を格納
YOUR_CHANNEL_ACCESS_TOKEN="**************************"
YOUR_CHANNEL_SECRET="**************************"
line_bot_api=LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler=WebhookHandler(YOUR_CHANNEL_SECRET)

# herokuへの指示
@app.route("/callback",methods=["POST"])
def callback():
    signature=request.headers["X-Line-Signature"]

    body=request.get_data(as_text=True)
    app.logger.info("Request body"+body)

    try:
        handler.handle(body,signature)
    except InvalidSignatureError:
        abort(400)
    return "OK"

# LINE BOTの処理
@handler.add(MessageEvent,message=TextMessage)
def handle_message(event):
    # 入力された文字列を格納
    push_text = event.message.text

    # 返信する文字列の条件
    if push_text == "R指定":
        reply_text = sc.getIn() # scrape.pyからの結果
    else:
    # R指定以外の文字が入力された場合の返答
        reply_text = "R指定と入力してください！"

    # 返答する内容を格納
    line_bot_api.reply_message(event.reply_token,TextSendMessage(text=reply_text))

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


```

## まとめ
***自分の興味のあるものをPython学習に使うと、楽しいし、学習もはかどる。***今回は関数を使ったり、スクレイピング処理について学習することができた。LINE BOTは工夫すればもっと面白いことができそう。他にもアイデアはあるのでどんどんさわって作っていこうと思う。

## 参考にした情報
[韻ノート](https://in-note.com)
[PythonとLINE APIとHerokuで自動返信BOTを作る【Python編】](https://qiita.com/bambi_engineer/items/0e8593d3a3047ece3f77)
[LINE+Python+天気API を活用してチャットボットを作成してみた](https://qiita.com/neonsk/items/807e7398e71e18da1b01)
[BeautifulSoupで抽出したタグリストからテキストのみをリスト形式で抽出したい](https://ja.stackoverflow.com/questions/54767/beautifulsoupで抽出したタグリストからテキストのみをリスト形式で抽出したい/54769#54769)