気ままなUnityエンジニアブログ

新米Unityエンジニアが送る解説アウトプットブログです。Twitter : @UjinUnity

MENU

python初心者がslackbotを使って通知Botを作成!

スポンサーリンク

f:id:Wojtek:20191102004424j:plain



ある日同僚から「ストアのアプリバージョンが更新されたら知らせてくれるBotとか作れる?」との要望をいただきました。
ちょうどAPIトークンやBotの勉強をしたいと思っていたので2つ返事で挑戦することにしました。


まずは python slackbot を導入する!


slackbot で調べたらちょうど良さそうなのが出てきたので導入。


参考にした記事様
PythonのslackbotライブラリでSlackボットを作る - Qiita


上記の記事通りに導入を行い、slackでbotの動作が確認できたら完了です。

ただし、上記のレスポンスbotは一度起動するとそれ以外の処理を受け付けなくなります。

今回は「一定間隔ごとに設定した処理を実行する」bot を作りたいので、今後はbot.run()は使いません。


pythonでバッチ(bat .cmd ) ファイルの動かし方を調べる

slackbotがちゃんと動いたので、次はbotに処理させる機能を作成します。

今回の要望は「ストアから特定のアプリバージョンを取得する」だったので、
私はシェルコマンドでストアからバージョンを取得する処理を作成しました。
ターミナルで動作を確認済み。


ここまでは良かったのですが、どうやってpythonにshellコマンドを呼ばせるかに悪戦苦闘しました。


初めは system.os を使ってみたのですが、最新のverですと非推奨扱いになっていて断煙。
その後行き着いたのが 「subprocess.check_output()」です。

これを使うとシェルコマンドでの結果もpythonで取得できるので、まさに最高の機能と出会えたと思えました。

そしてこのsubprocess.check_output()、なんとバッジファイルも起動できる優れもの。

そこでバッチファイルを作ることにしました。


bat(cmd)ファイルを作成してpythonで起動させる!

私はmacで作業しているので、cmdファイルを作成しました。

注意: bat(cmd)ファイルのアクセス権限を与えていたいと動作しません!


Macでバッチファイルを作成する方法
https://www.dafuku.com/2014/11/mac-bat-file.html


こちらのサイト様を参考にして、バッチファイルにアクセス権限を付与してください。

アクセス宣言を付与したらこのバッチファイルへのパスをpythonに設定し、subprocess.check_output()で読んでみましょう。

まとめ

長々と話しましたがまとめとして実際に作成したソースコードを記載します
python入門1日目の私が作成したので、かなり荒削りですがそこはご了承ください。

#!/usr/bin/env python
# -*- coding: utf-8 -*-


from slackbot.bot import Bot
import subprocess
import os
import time
from slacker import Slacker


def main():
    # bot = Bot()
    # bot.run()
    
# アプリバーション記載テキストの更新
def writeVersion( newAppVersion): # newAppVersion 最新バージョン
    
    # アプリバージョン記載テキストを読み込む
    path = "記載テキストのパス"
    
    # ファイルのアプリバージョンを書き換える
    with open(path , mode= 'w') as f:
        f.write(newAppVersion)
    
    slack = Slacker("slackのapitoken"")
    slack.chat.post_message('チャンネル名', " 色々書いてね! ", as_user=True)


    
# ストアのiosアプリバージョンが変更されたか確認する
def checkAppVersion():
    
    print('checkAppVersion')
    # アプリバージョンを記載するテキストファイル
    path = "パス"
    
    f = open(path)
    prev_version = f.readline()
    
    f.close()
    
    # ストアからアプリバージョンをひっぱて来るcommand
    cmd_file = "バッチファイルへのパス" 
    # コマンドを起動する
    a = subprocess.check_output(cmd_file,shell=True)
    
    # 不要な文字を削除
    version = str(a)
    
    print(version)
    
    # 保管してあるバージョンと最新のストアアプリバージョンを比較
    if prev_version != version: # バージョンが違う場合、Slackへの告知とAppVersion.txtの更新を行う
        writeAppVersion(version) 
        

# バージョンチェック
def schedule_version_check():
    
    while True:
        checkAppVersion()
        time.sleep(5)# 5秒間待機
        
if __name__ == "__main__":
    print('start slackbot')
    schedule_version_check()
    # main()


time.sleep(5) で5秒間ごとにストアのアプリバージョンチェックが走るようにしています。
bot.run()の部分は使わないのでコメントアウトしてますね。

pythonは上から書かないと行けなかったりして慣れが必要だと思いましたが、他にもやりたいことが増えたので
どんどんやって行きたいと思います!