LoginSignup
1
0

More than 3 years have passed since last update.

discordbotを作ってみた

Last updated at Posted at 2020-01-08

きっかけ

普段ローカルでseleniumとかpyautoguiでRPAを作ってつまらない仕事手順が多くてヒューマンエラーが出る仕事を自動化しているのですが、オンライン上で動き続けていないとこの先諸々不便。
でもそこに至る道までが分からん。

Django,Flaskは触ってみたけれどまだよくわからないしdeployってなんぞやということで知人のTRPG用にdiscordbotで作って遊びつつ学習してみた。

Pythonで実用Discord Bot(discordpy解説)
神がいらっしゃるので参考にしました。

基本的な処理

discord.py

if message.content == '/yagi':
    result = "めぇー"
    await message.channel.send(result)

これで基本的にはコマンドに対して返信を返すことができたと。
となれば/yagi というコマンドに対して めぇーと返信が返せるね。

で、あればダイスロールも
・コマンドを指定して
・処理書いて
・返す
で完了できますね。(素人考え)

ダイスを振ってみる

discord.py

    s = message.content
    dicecheck  = re.match('^/[1-9]{1}[D]', s)
    if dicecheck:
        dice = 1
    else:
        dice = 0

として/nDNと書かれたらダイスロールであることを判定して

discord.py

    if dice > 0:
        await message.channel.send('いちたりなくなーれ!')
        i = 0
        count = int(message.content[1:2]) + 1
        dim = int(message.content[3:])
        lst = []
        for i in range(1, count):
             rand_num =  random.randint(1, dim)
             lst.append(rand_num)
        await message.channel.send(lst)

※nDNでnは1-9,Nは好きな数字というお約束。
と、かなり力技ですがn回、N面ダイスをぶん投げる処理を入れてみます。
randomって本当にランダムな数字が返ってくるの?というカルドセプト的視点はこの際置いておきます。

あ、ついでにいちたりなくなるおまじないもかけましょうね。

デプロイしてみた。

キャプチャ.PNG

うん、ふれてる。
というわけでここまでは問題なくできたので、herokuにdeployしたbotでseleniumが動くかなーと試してみる。

seleniumを動かしてみる

discord.py

    options = Options()
    options.binary_location = '/app/.apt/usr/bin/google-chrome'
    options.add_argument('--headless')
    options.add_argument('--disable-gpu')
    browser = webdriver.Chrome(options=options)
    browser.implicitly_wait(10)

結果的に言えばこれで行けました。(herokuにseleniumとchrome追加するのは別途必要)
後はfind_elementを頑張る感じで。

となれば、beautifulsoupも行けるよね?と

beautifulsoupも試してみる

discord.py

elif message.content == '/ゆれた':
    res = requests.get('http://www.jma.go.jp/jp/quake/00000000093.html')
    soup = BeautifulSoup(res.text, 'html.parser')
    result = soup.select_one('table.textframe').get_text(strip=True)
    await message.channel.send(result)

※サンプルに気象庁の地震情報を引っ張ってくる想定です。
これでセッション中に地震が来ても大丈夫! 慌てずに/ゆれた と入れればわかるよ!
ゆれてないって返したいね。わかる。

後はブラウザとか開けると便利かなーと思ったのだけどwebbrowser.open_newではダメ(当然か…)
ということでここはdiscordさんのURL形式っぽいのがかかれたらURLにする、でごまかしましょう。
動けばいいねん!

ブラウザを開きたい

discord.py

elif message.content == '/検索':
    await message.channel.send("https://www.google.co.jp")

解決。筋肉は全てを解決する。

というわけで、全くherokuとかdeployとか分からなかった素人でもできたよ。Qiita最高か…

後はコマンド部分をファジーにするとか、それに対してする処理を入れていけば拡張はできますね。
私はTRPGやらないので何の機能がいるかとんと分かりませんが…。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0