文系のIT遊記

「そもそもITって何?」と思っていた28歳♀のIT関係勉強記。

Pythonを使ってSlack bot作りに挑戦!〜時間と天気を教えてもらおう編〜【プログラミング超初心者】

時間と天気を教えてくれるSlack bot作りに挑戦!

前回までで、話しかけたら答えてくれるSlack botが完成しました!

今は話しかけたことに反応するだけなので、今度は情報をどこかからもってきて教えてくれるようなbotを作りたい…

そんなわけで、時間と天気を教えてくれるSlack botも作ってみました。

時間を教えてくれるSlack bot

「今何時?」と聞いたら「◯時◯分だよ!」と答えてくれるbotを作ります。

Pythonにはたくさんのライブラリがあって、それをインポートすると自分でコードを書かなくてもいろいろできるというスーパー優秀な機能があるわけです。(他の言語のことはわからないので、Pythonだけのものじゃないかもしれないですが…)

今回はそれを活用していきます!

と偉そうに言っているものの、これも参考にしていた記事にサンプルが載ってたのでほぼコピペです。笑

記事はこちら。

PythonでSlackのBotを作成する方法を現役エンジニアが解説【初心者向け】

datetimeライブラリをインポートする

日時を知るにはdatetimeが必要です。

import datetime

上記のようにdatetimeをインポートします。

メンションに反応して時間を教えてくれるようにコードを書く

次に、メンションあり(@botの名前)で反応するように、コードを書きます。

respond_to('今何時?')
def time(message):
    dt_now = datetime.datetime.now()
    message.reply(dt_now.strftime('%H時%M分') + 'だよ!')

「datetime.datetime.now()」というのが、現在時刻を知るために使うコードです。

語尾は自分が好きものに設定します。

これで時間を知るためのSlack botは完成です!!

botの写真

天気を教えてくれるSlack bot

次は天気です。

天気を教えてくれるライブラリなどはないので(時間も場所も多すぎる!)自分で取りに行かねばなりません。

今回は、東京の天気を教えてくれるbotを作ります。

情報を取得するためのライブラリをインポート

ライブラリはどの場面でも活用されるものなんですね。

こちらは、Yahoo天気をスクレイピングしていた方の記事を参考に作りました!

ただ、スクレイピングはあまり高頻度で行うと「攻撃」とみなされる可能性があるので気をつけなければならないみたいです。

import urllib3
from bs4 import BeautifulSoup

#アクセスするURL
url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'
#URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます
http = urllib3.PoolManager()
instance = http.request('GET', url)
#instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします
soup = BeautifulSoup(instance.data, 'html.parser')

こちらは、上記の記事からまるっと使わせていただきました。

「urllib3」や「BeautifleSoup」なるライブラリを活用して、指定したURLから情報を取得するようです。

戻り値を色々いじって扱えるデータにしています。

メンションに反応して天気を教えてくれるようにコードを書く

こちらは、元のコードそのままでは使えないのでちょっと書き換えます。

@respond_to('今日の天気は?')
def weather_today(message):
    # CSSセレクターで天気のテキストを取得します。
    # 今日の天気
    tenki_today = soup.select_one('#main > div.forecastCity > table > tr > td > div > p.pict')
    message.reply("今日の天気は" + tenki_today.text + 'だよ〜')
    input()

@respond_to('明日の天気は?')
def weather_today(message):
    # 明日の天気
    tenki_tomorrow = soup.select_one('#main > div.forecastCity > table > tr > td + td > div > p.pict')
    message.reply("明日の天気は" + tenki_tomorrow.text + 'だよ〜')
    # 一瞬で画面が消えないよう入力されるまで待機
    input()

さっきアクセスしたURLから必要なデータを取り出してきているのかな?

いい感じに形を整えることができました。

写真or twittter

お疲れさまでした!
 そんなわけで、なんとか自分のたどり着きたいレベルのSlackbotを作ることができました。
 ほぼコピペだし、まだ全てのコードを理解できているわけではないので、継続して学習していきたいです!
 そして前回も書いたけど、やっぱり実際に動くと嬉しい…!!
 モチベーションが上がります✨
 今日からまたがんばろ!!