Python을 사용하여 위치 정보에서 일기 예보를 보내는 LINE Bot을 만들었습니다!
17799 단어 경 6Flask파이썬LINEmessagingAPI스크래핑
목적
주의!
LINEmessagingAPI도 스크래핑도 처음 했으므로 프로그램에 이상한 사촌이 있을 가능성이 높습니다. (특히 스크래핑과 관련하여)
개선점 등 있으면 꼭 코멘트 해주세요!
참고
아래의 사이트, 기사를 참고로 했습니다. 감사합니다.
Python과 LINE API와 Heroku로 BOT 만들기 [Python편]
--LINE 봇과 스크래핑을 결합하는 데 도움이되었습니다.
Messaging API 참조
--공식 참조입니다.
LINE 초보자!-LINE Bot에서 앵무새 반환편-
파이썬으로 LINE Bot을 만들어 보았습니다.
Python, LINE API를 사용하여 bot 만들기
--1번째로 무엇부터 하면 좋을지 모르는 때 매우 도움이 되었습니다.
이미지 맵을 사용하여 종전에 뒤지지 않는 봇을 만들었습니다.
--위치 정보를 사용한 Bot을 만드는데 도움이 되었습니다.
Beautiful soup에서의 스크래핑 기초 정리 [초학자용]
Python과 Beautiful Soup으로 스크래핑
--Python으로 스크래핑을하는 데 도움이되었습니다.
개발 환경
아래의 사이트, 기사를 참고로 했습니다. 감사합니다.
Python과 LINE API와 Heroku로 BOT 만들기 [Python편]
--LINE 봇과 스크래핑을 결합하는 데 도움이되었습니다.
Messaging API 참조
--공식 참조입니다.
LINE 초보자!-LINE Bot에서 앵무새 반환편-
파이썬으로 LINE Bot을 만들어 보았습니다.
Python, LINE API를 사용하여 bot 만들기
--1번째로 무엇부터 하면 좋을지 모르는 때 매우 도움이 되었습니다.
이미지 맵을 사용하여 종전에 뒤지지 않는 봇을 만들었습니다.
--위치 정보를 사용한 Bot을 만드는데 도움이 되었습니다.
Beautiful soup에서의 스크래핑 기초 정리 [초학자용]
Python과 Beautiful Soup으로 스크래핑
--Python으로 스크래핑을하는 데 도움이되었습니다.
개발 환경
전제
파일 구성
Line_bot
├ main.py
├ scrape.py
├ runtime.txt
├ requirements.txt
└ Procfile
소스 코드와 그 설명
main.pyfrom flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage, LocationMessage
)
from linebot.exceptions import LineBotApiError
import scrape as sc
import urllib3.request
import os
app = Flask(__name__)
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():
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):
text = event.message.text
if '位置情報' in text:
line_bot_api.reply_message(
event.reply_token,
[
TextSendMessage(text='位置情報を教えてください。'),
TextSendMessage(text='line://nv/location')
]
)
@handler.add(MessageEvent, message=LocationMessage)
def handle_location(event):
text = event.message.address
result = sc.get_weather_from_location(text)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=result)
)
if __name__ == "__main__":
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port)
'위치정보'라는 문자열이 들어 있는 텍스트를 bot이 수신하면 '위치정보를 알려주세요'라는 답장과 함께 위치정보 선택 화면에 URL을 보내도록 했습니다.
자세한 내용은 LINE Developer 설명서LINE URL 체계 사용를 참조하십시오.
scrape.pyimport requests
from bs4 import BeautifulSoup
import re
# 位置情報からその日の天気を返す
def get_weather_from_location(original_location):
# 住所の中から郵便番号を抽出する
location = re.findall('\d{3}-\d{4}', original_location)
# 1回目のスクレイピングでは住所を検索し、候補から取ってくる
url = "https://weather.yahoo.co.jp/weather/search/?p=" + location[0]
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
content = soup.find(class_="serch-table")
# 2回目のスクレイピングで用いるURLを得る
location_url = "http:" + content.find('a').get('href')
r = requests.get(location_url)
soup = BeautifulSoup(r.text, 'html.parser')
content = soup.find(id='yjw_pinpoint_today').find_all('td')
info = []
for each in content[1:]:
info.append(each.get_text().strip('\n'))
# 時間
time = info[:8]
# 天気
weather = info[9:17]
# 気温
temperature = info[18:26]
# 上の3つの情報を合わせる
weather_info = [(time[i], weather[i], temperature[i]) for i in range(8)]
result = [('{0[0]}: {0[1]}, {0[2]}°C'.format(weather_info[i])) for i in range(8)]
result = ('{}\nの今日の天気は\n'.format(original_location) + '\n'.join(result) + '\nです。')
return result
scrape.py의 get_weather_from_location에서는 받은 위치 정보 중 우편 번호를 꺼내서 yahoo 날씨에서 그날의 일기 예보를 가져오도록 하고 있습니다.
runtime.txtpython-3.6.6
requirements.txtFlask==1.1.1
line-bot-sdk==1.14.0
beautifulsoup4==4.7.
urllib3==1.24.1
soupsieve==1.6.1
어쩌면 불필요한 것도 쓰고 있을지도 모릅니다.
지적해주세요.
소스 코드는 여기에 있습니다.
htps : // 기주 b. 코 m / RY 908 / 우에 아테 r_ 보트
빠진 포인트
Line bot과는 별로 관계가 없습니다만, 스크래핑하는 것이 처음이었기 때문에 스크래핑에 꽤 시간이 걸렸습니다
결과
무사히 하루의 날씨를 보낼 수 있었습니다!
앞으로는 푸시 알림 등을 사용하여 개량하고 싶습니다!
Reference
이 문제에 관하여(Python을 사용하여 위치 정보에서 일기 예보를 보내는 LINE Bot을 만들었습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ryuu98/items/905b200aa0b5f7262465
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
)
from linebot.exceptions import LineBotApiError
import scrape as sc
import urllib3.request
import os
app = Flask(__name__)
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():
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):
text = event.message.text
if '位置情報' in text:
line_bot_api.reply_message(
event.reply_token,
[
TextSendMessage(text='位置情報を教えてください。'),
TextSendMessage(text='line://nv/location')
]
)
@handler.add(MessageEvent, message=LocationMessage)
def handle_location(event):
text = event.message.address
result = sc.get_weather_from_location(text)
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=result)
)
if __name__ == "__main__":
port = int(os.getenv("PORT", 5000))
app.run(host="0.0.0.0", port=port)
'위치정보'라는 문자열이 들어 있는 텍스트를 bot이 수신하면 '위치정보를 알려주세요'라는 답장과 함께 위치정보 선택 화면에 URL을 보내도록 했습니다.
자세한 내용은 LINE Developer 설명서LINE URL 체계 사용를 참조하십시오.
scrape.py
import requests
from bs4 import BeautifulSoup
import re
# 位置情報からその日の天気を返す
def get_weather_from_location(original_location):
# 住所の中から郵便番号を抽出する
location = re.findall('\d{3}-\d{4}', original_location)
# 1回目のスクレイピングでは住所を検索し、候補から取ってくる
url = "https://weather.yahoo.co.jp/weather/search/?p=" + location[0]
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
content = soup.find(class_="serch-table")
# 2回目のスクレイピングで用いるURLを得る
location_url = "http:" + content.find('a').get('href')
r = requests.get(location_url)
soup = BeautifulSoup(r.text, 'html.parser')
content = soup.find(id='yjw_pinpoint_today').find_all('td')
info = []
for each in content[1:]:
info.append(each.get_text().strip('\n'))
# 時間
time = info[:8]
# 天気
weather = info[9:17]
# 気温
temperature = info[18:26]
# 上の3つの情報を合わせる
weather_info = [(time[i], weather[i], temperature[i]) for i in range(8)]
result = [('{0[0]}: {0[1]}, {0[2]}°C'.format(weather_info[i])) for i in range(8)]
result = ('{}\nの今日の天気は\n'.format(original_location) + '\n'.join(result) + '\nです。')
return result
scrape.py의 get_weather_from_location에서는 받은 위치 정보 중 우편 번호를 꺼내서 yahoo 날씨에서 그날의 일기 예보를 가져오도록 하고 있습니다.
runtime.txt
python-3.6.6
requirements.txt
Flask==1.1.1
line-bot-sdk==1.14.0
beautifulsoup4==4.7.
urllib3==1.24.1
soupsieve==1.6.1
어쩌면 불필요한 것도 쓰고 있을지도 모릅니다.
지적해주세요.
소스 코드는 여기에 있습니다.
htps : // 기주 b. 코 m / RY 908 / 우에 아테 r_ 보트
빠진 포인트
Line bot과는 별로 관계가 없습니다만, 스크래핑하는 것이 처음이었기 때문에 스크래핑에 꽤 시간이 걸렸습니다
결과
무사히 하루의 날씨를 보낼 수 있었습니다!
앞으로는 푸시 알림 등을 사용하여 개량하고 싶습니다!
Reference
이 문제에 관하여(Python을 사용하여 위치 정보에서 일기 예보를 보내는 LINE Bot을 만들었습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Ryuu98/items/905b200aa0b5f7262465
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
무사히 하루의 날씨를 보낼 수 있었습니다!
앞으로는 푸시 알림 등을 사용하여 개량하고 싶습니다!
Reference
이 문제에 관하여(Python을 사용하여 위치 정보에서 일기 예보를 보내는 LINE Bot을 만들었습니다!), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Ryuu98/items/905b200aa0b5f7262465텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)