フォルダにファイルが入ったらChatworkタスクを完了する方法 | 独学プログラマーHiroのパーツボックスblog

[python自動化]特定フォルダにファイルが追加されたらChatworkのタスクを完了にする方法

Chatwork
スポンサーリンク

特定のフォルダにファイルが入ると、定期実行しているpythonプログラムがChatworkのタスクを完了にする仕組みを説明します。

この仕組みは実際に依頼を受けて作ったものを簡略化して公開しています。

前の記事では、特定のフォルダにファイルを入れるとタスクを追加する仕組みを説明してありますので、そちらも合わせて活用ください。

グループチャットでタスク追加と消込が自動的にできるようになりますので、チームでの協同作業のタスク管理に最適です。

それでは、今回も無料で構築していきましょう。

処理フロー

前回の記事を含めた全体のフローイメージです。

今回は中央のreadyフォルダを手動で右側のdoneフォルダにファイルを移動させると、chatworkにファイル名で登録されているタスクを完了にするpythonプログラムを説明します。

Windowsのタスクスケジューラーに実行ファイルを登録して定期実行する方法も説明しますので、完全に自動化できます。

chatwork-auto-tasksのフロー全体図

用意するもの

  • Chatwork API トークン
  • Chatwork ルームID
  • python実行&開発環境(今回はすでに環境が用意されていることを前提で説明します)

Chatwork ID類

Chatwork API トークン

デスクトップアプリでは右上のユーザー名をクリックメニュー内の「サービス連携」をクリックします。

Chatworkのサービス連携メニュー画像

WEBブラウザが開きますので、APIトークンを選択して表示させます。

トークンをコピーしてメモ帳などで保存しておきます。

chatwork APIトークンの表示画面

タスクを追加するルームID

ルームIDを調べる方法は2つあります。

1つ目は、WEBブラウザでChatworkにログインして、チャットルームを選択した状態でURLにあるridの文字列の後の数字がルームIDです。

2つ目は、デスクトップアプリでチャットルームを選択した状態で右上のチャットワークのマークを左クリックするとリンクが表示されます。そちらもridの後の数字がルームIDです。

Chatwork ルームID表示画像

処理するフォルダを用意

今回は前回記事の内容も含めて、便宜上C:\Chatwork-auto-tasksの中に「new」「ready」「done」という3つのフォルダを用意しています。タスク完了処理だけを目的にされている方は「done」フォルダだけ用意してもらえればOKです。

自分以外の人からも完了処理が必要な場合には、共有フォルダやNAS上のフォルダを用意してください。

pythonコード

下記コードをコピーして3か所変更してpythonファイル(.pyの拡張子)で保存して下さい。

  • api_token=’xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’ #ここにAPIトークンを入力してください
  • room_id=’xxxxxxxxx’ #ここにルームIDを入れてください
  • donefolder=’C:/chatwork-auto-tasks/done’ #ここにdoneフォルダのパスを入れてください
import glob
import os
import requests
import json

#各種パラメータを設定
api_token='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' #ここにAPIトークンを入力してください
room_id='xxxxxxxxx' #ここにルームIDを入れてください
allresult=""

def send_chatwork_msg(msg_body): #chatworkにメッセージを送る関数
    post_message_url = 'https://api.chatwork.com/v2/rooms/'+ room_id +'/messages'
    headers = {'X-ChatWorkToken': api_token ,'Content-Type': 'application/x-www-form-urlencoded'}
    params = { 'body': msg_body }
    # ポストリクエストを実行
    r = requests.post(post_message_url,headers=headers,params=params)
    return r

def done_tasks(task_id): #chatworkのタスクを完了にする関数
    done_tasks_url = 'https://api.chatwork.com/v2/rooms/'+ room_id +'/tasks/'+ str(task_id) +'/status?body=done'
    headers = {'X-ChatWorkToken': api_token ,'Accept':'application/json'}
    # プットリクエストを実行
    r = requests.put(done_tasks_url,headers=headers)
    return r

def get_tasks(): #chatworkのタスク一覧を取得する関数(100件まで)
    get_tasks_url = 'https://api.chatwork.com/v2/rooms/'+ room_id +'/tasks'
    headers = {'X-ChatWorkToken': api_token ,'Content-Type': 'application/x-www-form-urlencoded'}
    params = { 'status':'open'  }
    # ゲットリクエストを実行
    r = requests.get(get_tasks_url,headers=headers,params=params)
    return r

if __name__ == "__main__":
    donefolder='C:/chatwork-auto-tasks/done'  #ここにdoneフォルダのパスを入れてください
    if os.path.exists(donefolder)==True: #doneのフォルダ有無を確認
        r=get_tasks() #chatworkからtaskを取得
        task_data=json.loads(r.content) #取得したtaskのデータをpythonで扱えるように格納
        done_file_list=glob.glob(donefolder+'/*.*') #doneフォルダのファイル一覧を取得
        if len(done_file_list)>0: #doneファイル一覧が0より大きいとき(doneフォルダにファイルが入っていた時)に実行
            for done_file_path in done_file_list: #forでファイル一覧からファイルパスをを取り出して繰り返す
                donefilename=os.path.basename(done_file_path) #doneのファイル名を取得(拡張子あり)
                task_body=donefilename.split('.',1)[0] #doneファイル名から拡張子を除去してタスク名の変数に格納
                for i in range(len(task_data)): #chatworkのタスク一覧の数だけ繰り返す
                    if task_data[i]['body']==task_body:#タスク名がdoneから取得したファイル名と一致したときに実行
                        task_id=task_data[i]['task_id'] #タスクのidを変数に格納
                        ret=done_tasks(task_id) #chatworkにタスクを消し込む関数にタスクidを引数として渡して実行する
                        if ret.status_code == 200: #タスク消込が正常終了したら実行
                            if allresult == "": #結果を格納する変数に消込成功とタスク名を追加で格納する
                                allresult= "消込成功:" + task_body
                            else:
                                allresult=allresult+"\n消込成功:" + task_body
                        else: #タスクの消込が失敗したら
                            r = send_chatwork_msg('chatwork_add_tasks:消込失敗 code='+r.status_code) #chatworkに消込失敗とえらーコードをメッセージ書き込みする
                            break
            if allresult!="": #すべてのdoneファイル一覧のチェックが終わり、結果を格納する変数が空でなかったら実行
                r=send_chatwork_msg(allresult) #chatworkにすべての結果をメッセージ送信
    else: #doneフォルダがなかった場合
        r = send_chatwork_msg('chatwork_done_tasks:ディレクトリ有無エラー') #chatworkにディレクトリがなかったエラーメッセージを送信

各行に処理の内容をコメントで記述していますので、処理内容を改造したい人は参考にしてください。

動作確認の準備

doneフォルダに、Chatworkのタスク名のファイルを入れておいてください。

doneフォルダにタスク名のファイルを入れた画像

プログラムの仕様で、doneフォルダ内のファイル名一覧を取得してChatworkの未完了タスク一覧と突き合わせ、合致した場合にChatworkのタスクを完了にする処理を行います。

python実行(Chatwork-done-tasks.py)

pythonがインストールされていること前提で説明します。

Visual Studio Code上でデバッグ実行するとエラーが発生した場合に原因追求しやすいですが今回はコマンドプロンプト上での実行方法を説明します。

コマンドプロンプトの起動はWindowsタスクバーにある検索窓にcmdと入力すると候補として表示されますので「開く」を選択してコマンドプロンプトを起動してください。

c:\>コマンドを入力するところにカーソルを移動してコピーして作ったpythonファイルを実行してください。(赤ラインマークしているフォルダはあなたが用意したフォルダパスを入力ください)

python.exe C:\Chatwork-autot-tasks\Catwork-done-tasks.py

コマンドプロンプトで実行した画像

ライブラリのインポートエラーが発生した場合には、ライブラリのpip installをお願いします。

実行が完了したら「doneフォルダに入っているファイル名」の「Chatworkのタスク」が完了になります。

Chatworkのグループチャットのタスクが完了になっている画像

自動的に定期実行できるようにする

前の記事ですでに作成済み&設定済みの方は「Chatwork-auto-tasks.bat」の3行目に下記コードを追加するだけで定期自動実行設定は完了です。

python.exe C:\Chatwork-autot-tasks\Catwork-done-tasks.py

add-tasksとdone-tasksの両方を実装したときのフォルダ構成とbatファイル内容の画像

前の記事の設定をされておらず、この記事の内容だけの実行でよい方はこれより下の設定をしてもらうことで自動実行できるようになります。

実行するためのbatファイルをpytonファイルと同じフォルダ内に作成します。

batファイルはファイル名を「Chatwork-auto-tasks.bat」とします。

batファイルの内容は2行なので、下記画像を参考にpythonファイルを実行する内容を記述してください。

Windowsのタスクスケジューラーに定期実行するスケジュールを登録します。

常にプログラムを実行したい場合には稼働時間の長いサーバーなどに組み込んでください。その時に注が必要なのは、そのサーバーでpythonが動作するように環境構築が必要ということです。

今回はwindows11のPCで起動後に5分毎に実行する設定で登録します。

Windowsツールの中のタスクスケジューラーを起動します。

タスクスケジューラー起動画面

ウィンドウの右側の「タスクの作成」を選択してタスクの登録画面を表示します。

タスクの作成画面

「トリガー」は起動するタイミングと間隔などを設定します。自分の運用に合わせて変更ください。

タスクのトリガー設定画面

「操作」はプログラムの実行ファイルを指定します。

タスクの操作設定画面

すべての項目を自分の運用に適した値に設定出来たら登録するためにOKボタンを押します。

タスクを登録するためにユーザー名とパスワードを入力する必要があります。

うまく登録ができたらタスクスケジューラーライブラリに表示されます。

タスク登録とライブラリ表示画面

次回タスクスケジューラーの条件を満たしたタイミングで実行されます。

動作していることを確認できれば自動的にタスクを追加するフローの完成です。

注意事項

chatworkからタスク一覧を取得するAPIの仕様が、直近のタスク100件までしか取得できない仕様となっています。

100件以上未完了のタスクが存在してしまうと消込漏れが発生する可能性があります。

doneフォルダの中に膨大な数のファイルが存在すると処理に時間がかかってします。

1か月以上前に完了したファイルはフォルダに入れたり、自動的に別のフォルダに移すように改造をしても良いかもしれません。

最後に

意外と簡単にChatworkにメッセージを送ったり、タスクを完了できると思いませんか?

Chatworkだけでなく、webのサービスでAPIの機能を有していれば、APIの仕様に合わせてリクエストやポスト処理するだけで外部から操作ができます。

まだ前の記事を読んでいない方はぜひ確認してみてください。

この記事がよかったら共有をお願いします。

ほかのカテゴリーの記事もご確認くださいね。

コメント

タイトルとURLをコピーしました