つれづれなるままに日々の色々なことを綴ります

【Discode.py】Botに指定曜日の指定時間に発言してもらいたい!!

Discode Botを作ろう!(大声)

前回、苦しみながら(?)、特定のメッセージを送ると返信してくれるかわいいOimoBotを制作。

▼その時の記事はこちら

s-oimo.hatenablog.com

今回は「指定曜日の指定時間に指定チャンネルにメッセージを送る」ようにしたい。

すごくかっこつけて言ってるけど、要は「次の日のゴミ出しを非常に非常に忘れるので、前日にBotに通知させよう!」ってだけ……。頑張ろう!

この記事は個人の備忘録を目的としたものであり、解決策をわかりやすく明示する記事ではありません。

▼今回一番参考になった記事はこちらです▼

[Python]Discordで指定時間に発言させるBOT - Qiita

とりあえず下調べしてみる。作り方を想像する。

とりあえず、色々記事やらなんやら当たってみる。

di-acc2.com

これが使えそうってその時の自分はメモってた。

Scheduleを使って格闘する。挫折する。

無理だった。「やってほしいイベントを書く」→「それをいつやるかを書く(Schedule)」→「指定チャンネルにSendする」みたいなのをイメージしながら書いた・・・けど、、ターミナルにエラーが出るわ出るわ。頑張ってエラー内容を読み解こうとしたけど、挫折。違う道を探す。

'Client' オブジェクトは 'get_cahnnel' という属性を持ちません。って言われてた。どう対処すればいいか全然想像つかず。Python初心者敗北。ちなみに別のpyファイルを作って、Scedule関数を試してみたら、上手く動いたので、Discode.pyとうまく繋げられなかったのが敗因という予想。あと後述の公式ドキュメントにスリープがどうのこうのって書いてあって、そこらへんもわかってないといけないのかなあ~と思った。

やりたいことと似たようなことをやっている神記事を見つける。

qiita.com

つまるところやりたいことはこれやん!!!!ありがて~~~~!!!

Qiita記事を参考に自分のやりたいことに改造していく

(ぜんぜん何のことかわからないけど)Discode.exeのtasksというものを使っているらしい。

▼公式ドキュメント

https://discordpy.readthedocs.io/ja/latest/ext/tasks/index.html

そしてなんかそれっぽいのができた。

@tasks.loop(seconds=30)
async def time_check():
    sleepTime = 0
    # 現在の時刻
    now = datetime.now().strftime('%A %H:%M')
    # 指定時間のとき
    if now == "Sunday 21:51":
        channel = client.get_channel(CHANNEL_ID)
        await channel.send('月曜日は段ボールの日だよ!')  

これも合ってるか分からん!!!w でも21時51分前に実行して、51分にちゃんと通知が来たからとりあえずヨシ!!!!

strfttimeというのを使っているみたい。はじめまして。

techacademy.jp

strftime関数は、引数で指定された書式文字列に従い、日付を表現する文字列を返します。

へ~~~。要勉強ですね。

友人がもうちょっと綺麗な書き方あるよって言ってくる

さーせん。。。汚くて、、、、すみません、、、、。 頑張って書き直す。

2022/12/25追記:現在使用しているコードとその中身

@tasks.loop(seconds=30)
async def time_check():
    sleepTime = 0
    # 現在の時刻
    now = datetime.now()
    if now.weekday() == 6 and now.hour == 19 and now.minute == 0:
        channel = client.get_channel(CHANNEL_ID)
        await channel.send('月曜日は段ボールの日だよ!')  

time_check.start()

datetimeモジュールで日付や時刻を取得する

datetimeを使用することで、日付や時刻を簡単に取得することができます。

曜日を取得する

weekdayメソッドでは、月曜日を0、日曜日を6として曜日を返してくれます。 上記コードでは、もし6だったら日曜日ということなので、月曜日のゴミ出しをお知らせしています

時間を取得する

.hourと.minuteで時刻を取得しています

2023/01/13追記:discord.ext.tasksのエラー

現在「discord.ext.tasks」を使用すると、asyncio~~と出て、loopが正しく実行されない場合があります。 解決したので、別途記事にしました。こちらを参照ください。

s-oimo.hatenablog.com

動くだけで、幸せ。

次はOimobotに何してもらおうかな…。 [