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

【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に何してもらおうかな…。 [

プログラミング全然分からんけどDiscord Botが作りたい。

自分を褒めてくれるDiscode Botが欲しい。

 

作ろう!(大きな声)

 

0  前提準備

discode bot を実際に制作するまでの事前準備&状況です。初心者度合いを推し量ってもろて…。

  • プログラミングで何かを作ったことがなかったので、とりあえず家にあったC#の入門書を読みながら四苦八苦していたら、フレンドの「Pythonがいいよ」という一声により、言語をPythonに変更。
  • Python書ける環境が整っていなかったので、フレンドのお力添え100%で環境を整える。ありがとう。
  • Pythonの参考資料を読みながら、VScodeに実際に打ち込んでみながら勉強。とりあえずFor文までやったら、Bot作れるんちゃう?と言われたので、For文までやったところで挑戦。

1 忘れずに、Discode Developer PortalBotを作成しておく。

記事を見ながらポチポチBotを作成。Discordアカウントさえ持ってれば多分作れるはず。

qiita.com

 

Discode.pyを入れろって言われた

Discode.pyってなんぞや。とりあえず参考記事に書いてあったインストール用のコマンドをポチッと入れてみるも、弾かれる。なんでや。

「pip」というのを使えばインストールできると書いてたので、付けてみる。インストールできない。なんでや。そもそもpip無いよって言われてるぽかった。

 

3 pipを入れる旅に出る。

困り果てながら、ネットの海をさまよっていたら、こんな記事を見つける。

Ubuntuでpip/pip3がインストールできないときの対処法 | Python

https://www.bioerrorlog.work/entry/install-pip-pip3-ubuntu

これは反省だが、環境構築周りを完全に友人だよりにしてしまったのもあり、だいぶここで躓いてしまった。

この記事にある

$ sudo apt update

を実行してから、

$ sudo apt install python3-pip

をすると無事行けた。これによりなんとかpipが使えるようになる。

 

4 気を取り直してdiscode.pyを入れる。コードを書いていく。

discode.pyを入れる。無事インストールされる。きちんと入っているかの確認には「pip3 list」を使ってみる。ちゃんと一覧に表示されていて安心。

 

早速記事を参考にコードをポチポチしていく。しかし、

import discode

と書いたところで、discodeなんて無いが??みたいな感じ(推察)で怒られる。焦る。Pythonの勉強をしていたファイルに書こうとしていたのが、良くなかったのか(?)新しくDiscordbot用のフォルダ作って、ファイル作ったらエラー消えた。

5 じゃんじゃん(コピペで)コードを書いていく。実行してみる。

qiita.com

techmel.net

記事を横に並べてせっせとコードを書いていく。ちょいちょい分からない単語もあるが、これは後で要勉強。

「python3 hogehoge.py」で実行したら、ちゃんと「ログインしたよ!」って表示されて嬉しくなっちゃう。ちなみにこのログインした状態から、ターミナルにコマンド打てる状態に戻れるようになるのに、「Ctrl + C」というのを知らなかった。あと、コード書き直したら、ログインし直さないと反映されないっぽい。学び。

6 動いた!!!!!!!!

Botが動いたーーーーー^!!!!!!!

こんなにうれしいことはない。

がんばって改造していきたい。