![見出し画像](https://assets.st-note.com/production/uploads/images/78532606/rectangle_large_type_2_b5facadb230adf81e9af8a0dc50fbc76.png?width=1200)
お天気お姉さん有栖川夏葉(本物)bot
こんにちは、江崎と申します。
https://www.nicovideo.jp/watch/sm40773136
第5回シャニマス投稿祭に上記動画を投稿しました。
見ていない方は見てから読んでいただきたいです。
端的に言うと、Discordのbotを作ったので配布しますという記事です。
少し下に行くとURLがありますが、最低限「機能説明」と「注意事項」は読んでいただきたいです。よろしくお願いいたします。
機能説明
ここだけ読めば最低限使用できます。
以下のようなフォーマットで使用できます。
@mention△日付△場所
@mentionと日付、日付と場所の間にはそれぞれスペースが必要です(△がスペース)。
順番等が違うと正常に動作しません。
スペースは全角半角問いません。
英数字もどちらでも構わないと思いますが、半角の方が安全だと思います。
以下に具体例を示します。
@有栖川夏葉(本物) 7/17 函館競馬場
これで函館記念開催地の天気予報がわかります。
基本これなので、これだけわかればなんとかなります。
以下個別説明
まずは、メンションについてです。
@有栖川夏葉(本物)
これがないと反応しません。なぜかコピペだと反応しないけど、これはDiscordの仕様だと思うので知りません。
「@有栖川」くらいまで打ってTab押せばいいでしょ。知らんけど。
ちなみに、()←これは半角です。
次に日付についてです。
上記例の「7/17」に当たる箇所ですが、今日から10日後までの天気しか取得できません。
日付のフォーマットは「YYYY/MM/DD」「YYYY-MM-DD」「YYYYMMDD」「MMDD」に対応しています(多分)。
あと、「明日」「明後日」「n日後」「来週(一週間後)」には反応しますが、「明々後日」「弥の明後日」には反応しません。
「日曜日」みたいな感じに曜日入力でも日付取得ができますが、次の曜日の日付を取得します。具体的には7/17(日)に日付の箇所に「日曜日」を入力すると、7/24(日)の出力されます。
例外として、12月下旬に1月の天気が知りたいときに日付で検索する場合は必ず西暦もしくは和暦を付けてください(n日後とか明日とかなら多分行けます)。作った僕がポンコツなので、日付が取得できません。
次に場所についてです。
上記例の「函館競馬場」に当たる箇所です。
対応しているのは、建築物(駅など)、住所、郵便番号のいずれかです。
日本国内にしか対応していません。
函館競馬場は建築物に当たります。
日本国内であればどこを検索しようと自由ですが、身バレには気を付けましょう。
稀に検索できない場所がありますが、諦めて別のもので検索してください。
出力についてですが、日付、曜日、場所、天気、最高気温、最低気温、降水確率、降水量が出力されます。
ついでに、警報や注意報があれば出力されます。
花粉情報や台風情報などはありません。
注意事項
botを配布しますが、注意事項とお願いがあります。
このbotが参加しているサーバーの数が75を超えるとあまりよろしくないらしいので(参考:元記事が英語なのでよくわからん)、個人での使用は控えていただきたいです。
杞憂だと思いますが、一応お願いします。
また、何らかの原因でbotからのレスポンスが遅れることがあるかもしれませんが、連投は控えてください。
何か不具合報告や機能追加の希望があればTwitter@ezakiprnまでお願いします。
なるはやで対応するように善処します()。
あとは、二次配布禁止くらいでしょうかね。する人なんていないと思うけど。
ここまでを読んで下さった方々、動画を見てくださった方々、ありがとうございました。
botの使用は下記URLからどうぞ
有栖川夏葉(本物)bot
スマホの天気予報アプリがあるからこんなもんいらない????????
うるせえ!!!!!!!!!!!!!!Discordに集まれ!!!!!!!!!!!!!!!!!!!!!!
おまけ
このbotはメンション+2単語(日付+住所)で天気予報を出力します。メンションのみや、+1単語、+3単語以上になると登録されている言葉の中からランダムで出力されます。
※画像はイメージです。
自分語り
隙があったので自分語りをします。
スマホの天気アプリなどを使った方が圧倒的に楽なので、こんなものを作る必要はないんですよね。
作った理由としては、上記のような動画が作りたかったからです。
思いついたので作っただけですけど。
書いている時点では投稿前なのでわかりませんが、労力に対して動画の伸びが大したことないと思います。まあでも、作ってて楽しかったのでいいんじゃないですかね?知らんけど。
ちなみにですが、なぜ夏葉にしたのかというと、イベント「many screens」で天気予報のコーナーに出てたからです。
「今日は晴れてるねぇ~w」のちょこ先輩でもいいかと思ったけど「今日は雨だねぇ~w」は煽られてるようにしか感じられなかった。あと、晴れの時は「晴れてる」だけど雨だと「雨だ」になるのが処理として面倒でした。「今日は晴だねぇ~w」だとそれは違うでしょってことで夏葉になりました。おめでとう(?)。
あと、bot名に「(本物)」とついているのは、「(本物)」とついているやつは偽物だという偏見を持っているからです。
あくまでbotなのでね。
ちょっと細かい仕様の話と愚痴
ここからは使うだけなら読まなくても問題ありません。
使用した言語はpythonで、作った時の備忘録はこちら(使い回しですが)。
discord.pyの更新がもうないらしいからjavascriptにした方がいいのかもしれないと思いつつ、javascriptが書けないので続投。趣味だしまあええやろ。
また、pythonのことをちゃんと勉強していないので見当外れなことを言っているかもしれませんが、適当にスルーしてください。
処理の順番で話をします。
と言っても、大した話はありませんが。
まずは、天気予報かそうではないかの判定です。
前述しましたが、天気予報の出力には「メンション△日付△場所(△がスペース)」が必要です。メンションがなければ当然反応しません。メンションがあり、その後にスペース区切りで単語が2つあれば天気予報の判定に移ります。それ以外は適当な返答をします。
適当な返答は、配列に文字列があり、乱数で出力するだけです。DBを使用すれば文章の追加・削除もできるようになりますが、技術力不足ですぐにはできません。要望があればやるかもしれません。その時は誰かやり方教えてください。
次の処理は目的の日付が今日から何日後なのかを判定します。
このパッケージで大体できましたが、日付のみの入力や曜日の入力に対応していなかったので、気合で破壊しました。ただ、「明日」とか「5日後」などを勝手に処理してくれるのはかなり助かりました。
「弥の明後日」はともかく、「明々後日」には反応してほしかったかな……まあ、使わせてもらってる以上、これ以上文句は言いませんが。
「あした」のように平仮名で入力されると反応しないようですが、これはさすがに漢字で入力してほしいです。
次の処理は場所の取得をします。
このライブラリでほとんど事足りました。すごいわ。ただ、住所や地名から都道府県や市区町村などが入っているクラスを返してくれるんですが、稀に困ったことが発生します。
以下に例を示します。
上は「東京競馬場」と検索した時、下は「中京競馬場」を検索した時のクラスです。クラスの中にある連想配列(辞書?)名が「address」で、この中に「leisure」「road」等のキー名があります。ですが、下には「province」がありますが、上にはありません。県名に当たるキー名なんでしょうが、上にはそもそも「東京都」が入っていません。ふざけやがって。ていうか「芝コース」ってなんだよ。
ここから「府中市」などの地名を取得してからその地名の天気予報のページに飛ぶようにしています。ほとんどの時には困りませんが、上記パッケージで「府中市」と検索した時に真っ先に出てくるのは「広島県府中市」です(なんで?)。「東京都府中市」を検索したい人は「東京都」まで入れなければ正しい情報を取得できません。
「広島県府中市」であれば上記画像の下パターンですので、「province」と「city」を取得して検索すればggです。ただ、「東京都府中市」であると、上パターンになります。この時「province」を取得しようとすると「そんなキー名ないんだけど?」と怒られてしまいます。そんなに怒らないで><
まあ、そのキー名があるかどうかを判定してから取得するという手順を踏むことで解決できましたが、判定方法を見つけるのに時間がかかって泣きそうでした。
この記事を書いている際に「郵便番号あるじゃん。これでよくね?」って思いましたが、上記の中京競馬場の郵便番号(458-0829)で検索すると「名古屋市緑区」が出てきます。「city」の「豊明市」は正しいのに郵便番号間違えてるのなんでなの……このパッケージ作ったの僕じゃないので知りませんけど……。
書き忘れていましたが、この天気予報botで調べられる住所の精度はそんなに高くありません。精々「〇〇市」までで、それ以降の細かい情報(〇〇区や〇〇町、番地等)は調べません(情報を取得しているサイトはもう少し細かく見れますが、上手いことアルゴリズムを考えられませんでした)。郵便番号を入力すれば細かく調べられますけど。
ちなみに、「札幌競馬場」の場所を取得しようとすると、香港にある「ハッピーバレー競馬場」がヒットします。このせいで「札幌競馬場」の検索ができません。なんでかはわかりませんが。
そんなこんなでようやくHTMLの取得です。
今回天気予報の情報取得に使用したサイトは日本気象協会で、こちらからスクレイピングをしました。
スクレイピングとは、ウェブサイトから情報を抽出することらしいです(自分もあやふやなので気になる人は各自で調べてください……)。
まあ大体そんな感じなんですが、このスクレイピングとかいうやつ、やりすぎると対象のサイトに負荷がかかってしまうらしいですね。こんなディスコのbotごときだったら大丈夫だと思いますが。大丈夫じゃなかったらこのbotを破壊します。
そのスクレイピングとやらと取得した住所を使ってHTMLを取得します。あとは取得したHTMLから欲しい日付の情報を抜き取って出力するだけです。簡単ですね。
HTMLあんまりちゃんと勉強していなかったので、そんなに簡単ではなかったですが。
とりあえずこんなもんでしょうか。
思ったよりも長くなってしまいました。
何かあればTwitter@ezakiprnまでお願いします。
この記事を読んで下さった方々、動画を見てくださった方々、ありがとうございました。
更新履歴
2022/7/16 公開
2022/9/11 タイムゾーンが原因で発生していた不具合を一部修正
この記事が気に入ったらサポートをしてみませんか?