Python에서 위치 정보에서 꽃가루 정보를 보내는 LINEBot을 만들었습니다.

(1) 배경



・언제나 이 시기부터 꽃가루에 시달린다.
・올해는 코로나도 있어 꽃가루 알레르기는 괴롭다.
・마스크 부족.
· python과 scraping, heroku를 사용하여 무언가를 만들고 싶습니다.
・아웃풋 이미지↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓


(2) 환경 구축



바탕 화면에 line_kafun 디렉토리를 만듭니다.
line-sdk를 다루는 main.py와 Yahoo 날씨 정보에서 꽃가루 정보를 수집하는 weather.py를 만듭니다.

디렉토리 구성은 다음과 같습니다.
line_kafun
├main.py
├weather.py
├Procfile
├runtime.txt
└requirements.txt

필요한 패키지를 설치.
pip install flask
pip install line-bot-sdk
pip install beautifulsopu4
pip install gunicorn
pip install lxml
pip install requests

(3) main.py



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,LocationMessage
)
import os
import weather as wt #weather.pyをインポート


app = Flask(__name__)

#Herokuの環境変数設定
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("/")
def hello_world():
    return "hello world!"


@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'



@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    if '花粉' in event.message.text:
        line_bot_api.reply_message(
            event.reply_token,
       [
            TextSendMessage(text='現在の位置情報は?'),
            TextSendMessage(text='https://line.me/R/nv/location/'),
            ]
        )


@handler.add(MessageEvent, message=LocationMessage)
def handle_location(event):
    text = event.message.address
    result = wt.get_weather(text)
    line_bot_api.reply_message(
    event.reply_token,
    TextSendMessage(text=result + '\uDBC0\uDC20')
    )


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

보충 설명



・text = event.message.address의 개소의 address는, linedevelopers의 api 참조 를 참고로 했다.
・ TextSendMessage의 개소는 LINEapi 레퍼런스의 URL 스킴을 참고로 했다.

・덧붙여 URL 스킴은 1대 1의 토크만으로 이용 가능하고, 그룹에서의 이용은 불가.
・'\uDBC0\uDC20'은 이모티콘으로 LINE BOT에서 'LINE 이모티콘' 사용 를 참고로 했다.

(4) weather.py



Yhaoo에서 꽃가루 정보를 스크래핑.

weather.py
import requests
from bs4 import BeautifulSoup
import re
import lxml


def get_weather(text):
    location = re.findall('\d{3}-\d{4}',text)
    location2 = location[0].replace('-','')
    url1 = "https://weather.yahoo.co.jp/weather/search/?p={}".format(location2)
    url2 = ""

    #1つ目のurlからhtmlの情報を取得し、そこから2つ目のurlを取得
    res = requests.get(url1)
    res.encoding = res.apparent_encoding
    html_doc = res.text
    soup = BeautifulSoup(html_doc,"lxml")
    content_1 = soup.find_all(id = 'rsltmuni')
    for i in content_1:
        content_2 = i.find('a')
        url2 = 'https:' + content_2.get('href')


    #2つ目のurlから今日と明日の日付を取得(today、nextday)
    res = requests.get(url2)
    res.encoding = res.apparent_encoding
    html_doc = res.text
    soup = BeautifulSoup(html_doc,"lxml")
    content_3 = soup.find_all('p',class_='date')
    today = content_3[0].get_text()
    nextday = content_3[1].get_text()

    #今日と明日の花粉状況を取得
    content_4 = soup.find_all('p',class_='flying')
    today_kafun = content_4[0].get_text()
    nextday_kafun = content_4[1].get_text()

    #エリアを取得
    content_5 = soup.find_all('h2',class_='yjM')
    area = content_5[0].get_text()


    result = today + 'の' + area + 'は' + '「{}」'.format(today_kafun) + 'だよ。' + '\n' +'\n'+ nextday + 'の' + area + 'は' + '「{}」'.format(nextday_kafun) + 'だよ。' + '\n' +'\n' + '気をつけてね。'

    return result

(5) Heroku에 배포와 LINE Developers의 Webhook 설정



마지막으로 필요한 파일 (requirements.txt, Procfile, runtime.txt)을 작성하고 Heroku에 배포합니다. 배포 방법은 많은 사이트에서 소개하고 있기 때문에 할애. 자세한 것은 Heroku, Flask, SQLAlchemy로 게시판 만들기 를 참고.
또, LINE Developers의 Webhook 설정도 이것도 많은 사이트에서 소개하고 있으므로 할애. 자세한 것은 LINE BOT(앵무새 반환) 만들기 를 참고.

완성된, LINEBot에, “꽃가루”라고 입력하면 위치 정보를 들어오므로, 탭하면, 꽃가루 정보를 취득할 수 있다(완성).

좋은 웹페이지 즐겨찾기