LoginSignup
1
4

More than 1 year has passed since last update.

停止しないbotの作り方

Last updated at Posted at 2021-08-21

概要

botと言っても色々ありますが、今回は株式・仮想通貨の自動売買やギャンブルの自動投票などのbotを作っている人向けの話です。

やったことある人は分かると思いますが、こういったプログラムは、通信状況の悪化だったりページの遷移の遅延など、色々な理由でよく止まっちゃいます。
(公開APIを用いたものではなく、seleniumなどのスクレイピングツールを使用する場合は特に)

これが理由で損失が出ると悲しいので、なるだけ停止しないように対策をする必要があります。
ということで今回はpythonを用いて、停止しないbotを実装したいと思います。

方針と実装

方針としてはシンプルに、一定時間ごとにbotが正常に動いているかどうかを監視するというものです。
実装方法も簡単で、botの起動プログラムを実行しているprocessのステータスを定期的に取得し、停止していれば再起動をかけるようにする、という流れです。

ということで、早速スクリプトを書いてみます。subprocessというモジュールを使います。
前提として、botを起動するスクリプトはあるものとします(下のスクリプト中のhoge_bot.py)。

import argparse
import pandas as pd
import time
import subprocess


def main(check_interval=150):
    """
    * 一定時間ごとにプロセスが動いているかどうかを確認するよ
    * 引数の`check_interval`で確認の間隔(秒)を指定できるよ(デフォルトは150秒)
    * `subprocess.Popen.poll()` で特定のプロセスのステータスコードを見れるよ.
      - None >> 実行中
      - 0 >> 正常に終了
      - 1 >> 一般的なエラーで終了
    """
    cmd = f'python hoge_bot.py' # botを起動するプログラムを実行するコマンド
    proc = subprocess.Popen(cmd, shell=True) # ここでbot実行のプロセスを立ち上げる
    iter_num = int(12 * 3600 / check_interval) # 12時間監視し続けるように繰返しの回数を設定
    for _ in range(iter_num):
        if proc.poll() is None:
            print('still working') # ちゃんと動作していれば何もしない
        else:
            proc.kill()
            proc = subprocess.Popen(cmd, shell=True) # 止まっていれば再起動する
            print('rebooted')
        time.sleep(check_interval)
    print('ended')


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-ci', '--check_interval', type=int, default=150)
    args = parser.parse_args()
    main(args.check_interval)

subprocess.Popenでプロセス自体をオブジェクトとして受け取れるのは面白いですよね。

というわけで、今回は停止しないbot (正確にいうと停止しても大丈夫なbot)の作り方を自分なりに考えてみました。
今後bot作成に挑戦する際には、ぜひ参考にしてもらえると嬉しいです。

1
4
0

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
4