slack-features
コミュニケーション・チャットツールのSlackは、APIを利用すると外部から利用できます。
今回、各チャンネルの投稿数をチェックして投稿するアプリをPythonで作ってみました。


きっかけ

Slackにはいろいろな文化があって、固定的なチャンネルでやっているところや、会話が続きそうなら新しくチャンネルを作って続けるようなところもあったりします(あんまりないけど)。

チャンネル数は数十程度のところが多いですが、数百というところもあったり。

チャンネルが多いところは、普段は非活性なチャンネルも多いのですが、突如、会話が盛り上がったりするわけです。

全てのチャンネルに参加するのは気が引けるが、面白そうな会話があったら気付けるといいなと思い、このアプリを作りました。 

機能

基本的には、全チャンネルの投稿数をチェックして結果を投稿する機能のみです。

  1. 全チャンネルの指定期間の投稿数をチェックして指定のチャンネルに投稿します。
  2. チェック対象期間を「日、時間、分」の組み合わせで指定できます。
  3. 対象外にするチャンネル、ユーザー、サブタイプ(参加、退出、ボットメッセージなど)を指定できます。
  4. 引数により、チャンネル参加のみ、チャンネル退出のみ、ドライラン(チェックを行い、結果を画面表示するが、実際に投稿は行わない)を実行できます。

参考サイト

Slackのアプリを作ったのは初めてで、Pythonも初めて使いました。
いろいろなサイトを見ましたが、このサイトがシンプルにまとまっていて分かりやすかったです。


APIを叩いてslackから発言を取ってくる | python | DoRuby
https://doruby.jp/users/baguette/entries/APIを叩いてslackから発言を取ってくる


このアプリを定期的に実行したいのですが、現在、インターネット上で自由にできるサーバー環境が無く、XREAの無料サーバーを使用することにしました。
しかしXREAの無料サーバーではcronが使えないようなので、XREAにCGIとしてスクリプトを設置し、G SuiteのGoogle Apps Scriptから定期実行でアクセスして実行することにしました。

レンタルサーバ 無料プランで crontabを実行する方法 : crontab
http://crontab.blog.jp/archives/3602283.html

このスクリプトは、チャンネル数が多い場合、まぁまぁ時間がかかります。
そのためCGIはスクリプトの完了を待たず実行を開始するだけにして、スクリプトをバックグラウンドで実行させる必要があります。

いろいろ試しましたが、以下のサイトを参考に、perlのsystem関数やバッククォート演算子(``)を使用してコマンド末尾に「&」を付けたシェルコマンドを実行することで、バックグラウンド実行を行うことができました。forkも試しましたが、コマンドを実行してもCGIが終了しせんでした。

CGIからバックグラウンドプロセスを起動 - tail -f /var/log/こうちかずお.log
https://kohchi.hatenablog.com/entry/20060607/1149670058

perlによるCGIのサンプルはこちらに置いてあります。

tools/exec_bg_job.cgi at master ・ miyam1974/tools
https://github.com/miyam1974/tools/tree/master/cgi_background

アプリ

作成したアプリは、以下に置いています。
緑色の[Code↓]ボタンからZIPファイルをダウンロードできます。

miyam1974/slack-channel-checker-bot: This bot posts the number of posts on all channels during the target days.
https://github.com/miyam1974/slack-channel-checker-bot