こんにちは。今まではPythonメインでいろいろやってきましたが、バイト先の情報共有を便利にしたいという思いから、Slack→LINEにメッセージを飛ばしたいのです。できれば無料で。
#背景
バイト先の連携・情報共有は、かつてLINEのトークルームで行われていたのですが、(私がSlackにしたいと喚いた結果)今ではSlack上で行われております。
~~(導入直後はグダグダでしたが)~~1年ほど経ってみんながSlackに慣れた結果、Slackのチャンネル~スレッドにより、情報が構造化されて良いという言葉を遂にいただくようになりました。(感涙)
とはいえ、LINEは構造化されないが故に、「チーム全体に何が起こっているか分かる」という側面もあるということに気付きました。10人ほどのチームなので、コアメンバーは全体で何が起こっているのかを情報のストリームとして見られれば、より柔軟な対応ができるのでは?と。
ということで、
→Slackのパブリックチャンネルでの発言を全て拾い、1本のストリームとして見られるようにしたい!
が今回のお題です。
#やったこと
##① SlackStream
まず最初にググって出てきたのがこちら
Slackの全チャンネルのメッセージを1箇所に表示できるアプリSlackStream
お、早くも解決か?と思いましたが、
①Slackが現在非推奨としているレガシートークンを利用すること
②アプリケーションを常駐させておかないといけないこと
により断念。このアプリケーション上で返信などができるのはかなり便利そうなのですが、レガシートークンはもうすぐ発行できなくなるみたいですし、常駐させておかないといけないのはチームメンバーのニーズ的にも△とのことなので、別の手段を探しましょう。
##② Zapier(Slack→Zapier/Webhook→LINE)
お次はこちらの記事を参照しました。ありがとうございます。
【プログラミング知識ゼロでもできる】Slackの発言をLineにzapierを使って転送する方法
今回は(キーワードなどを指定せず)全ての投稿をLINEに飛ばしたいので、「Slackのパブリックチャンネル上で新しい投稿がされる」ことをトリガーにして(Zapierには直接LINEに飛ばすアクションがないので)webhookでLINE notifyのURLにPOSTします。webhookでLINE notifyに飛ばすやり方などは上記の参照先記事をご覧ください。
実際これでうまく行きました。(左がLINE、右がSlack)
これでzapをずっと稼働させておけばいいやと思っていたのですが、そうは問屋が卸さない。まあそりゃそうですよね~。しばらく(2週間)経った後、こんなメールが来ます。
1to1のzapは無料でも使えるんとちゃうかったっけ?と思いましたが、Zapierのwebhookはプレミアムapp認定を受けており、プレミアムオプションがないと使えないみたいです(Slackはそうではないので、例えばSlack→Twitterとかの無料app→無料appの1to1なら、100転送/月 まで無料で使える)。
↑プレミアムって書いてある。
さて、結局のところ**工夫すれば無料でSlack→LINEの転送をすることはできるのか?**という問いを考えていきたいと思います。
##③ IFTTT
Zapierの方を先に見つけていたので、まだ試していなかったIFTTTもこの機に試してみました。IFTTTは無料って聞いたんで……。
###普通にはできない(Slack→IFTTT→LINE)
しかしIFTTTはZapierと違って、トリガー(this)としてSlackのメッセージ受信を使えないみたいです。(アクション(that)としては使えるので、「何かをトリガーとしてSlackにメッセージを送信」とかはできる)
ということで、普通にはできないみたいですね。
###Slack APIも絡ませれば……?(Slack/Webhook→IFTTT→LINE)
しかしまだ諦めません。IFTTTはトリガーとしてwebhookの受信が(無料で)使えます。そしてSlackは……APIからwebhookを送信できます! 行けそう!
以前、別のことを試す中でSlackのAppを作成し、結局は運用せずほっといているものがあったのでそれを確認。Appの「Event Subscriptions」を使って、「投稿をトリガーにしてwebhookを送信する」ことができるのでは……?
しかしながらそう上手くも行きません。私の理解がまだ追いついていないのですが、webhookの送信先をApp作成者が所有していることを示すために、「challenge」を投げ返す必要があるみたいです。以下の記事より。
Event Subscriptions の受け取り先になるには、そのサーバーを所有していることを証明する必要があるため、既存のファイルに以下の処理をコピペ。
何をやっているかというと、URLを記入欄に入力してきた瞬間にchallengeっていう値が投げられてくるからchallengeっていう値を投げ返すだけ
私は使えるサーバを持っているわけではなく、IFTTTにwebhookを飛ばしたいだけなので、これは困った。
###褒められたもんではない:Outgoing Webhookを使うと……?
先ほど引用した記事にもある通り、Outgoing Webhookは現在非推奨の機能です。
運用には使いづらいものですので、「できるのか」あくまで実験的にやってみました。
キーワードは必ず指定しなければいけなかったので、「テスト」で。URLはIFTTTのWebhookのものです(URL内の「slack_posted」はIFTTTで設定したイベント名です)
そして、IFTTTでWebhook→LINEのAppletを作りました。(IFTTTではアクション(that)としてLINEに直接飛ばせます)
デフォルトの状態で、Slackで「テスト」と発言すると……
おお、来ることは来た!
SlackのOutgoing Webhookはちゃんと動いており、IFTTTの受信もできているようです。
ただ、Outgoing Webhookに含まれる(発言者、メッセージテキストなどの)内容をIFTTTで利用することができない?(私がわかっていないだけ?)ため、「Slackのメッセージの内容をIFTTT経由でLINEに飛ばす」という目標はどのみち達成できなさそうです。
今回やったことは以上になります。
#まとめ
(今のところ・私の技術では)できない。
ZapierがWebhookを使わないでLINEに飛ばせれば or IFTTTがSlackのWebhookに含まれるデータを使えれば行ける気がするのですが……。
今後試してみるかもしれないことは、
- Zapierの開発でできるかもしれない
- Google Cloud Platformでサーバスペースを借りればできるかもしれない(大変そう)
などです。
###補足:今回の内容に関わるZapierとIFTTTの比較
Zapier | IFTTT | |
---|---|---|
デフォでSlackをトリガーに | できる | できない |
デフォでLINEに | 飛ばせない | 飛ばせる |
Webhookは | 有料 | 無料 |
本記事中に何か間違いや、その他知見などあればコメントでお寄せください。
お読みいただきありがとうございました。