【技術】slack投稿をgooglemapに無料で投稿

slackで投稿された情報をgoogle mapに投稿してみんなのマップを作りたい。
というオーダーをもらった。slackは無料で利用し続けると制約上過去の投稿はパージされてしまう。せっかくのみんなの投稿が見れなくなってしまうのは悲しいということでこうしたオーダーをもらった。

フロントの開発なんてしたことないし、ウェブ的な知識も疎いインフラエンジニアをずっとやってきたので正直わからないことだらけなので、ここで赤裸々にわからないことと、オーダーをできるようにするまでの軌跡を描いてみようと思う。

そもそもslackって何?

ビジネス用のメッセージングアプリ

その特徴は話題ごとにスレッドを立てられ、その中でコミュニケーションをできること。

ただし、フリープランだと「10000件制限」で過去の投稿が表示できなくなる仕様らしい。この制限があり過去投稿が消えてしまうという悲しい出来事が起きている。

slackからgooglemapどんな構成で実装するの?

・始める前の構成イメージ

始める前のイメージはざっくりとこんな感じである。
誰かがSlackに投稿したかを定期的に確認しに行くスクリプトを用意。
新規投稿があればそれを無料のDBに新規レコードとしてインサート
インサートされた情報をGoogleMapに投稿

こんな流れをイメージしている。実際にはもっと細かいことを考えたり、より開発工数の少ないやり方があったりすると思うのでそちらもここから考えてみたい。

著者作成


・実装イメージ(①)

実際に下記のQiitaなどを読んでいると行えそうな気はしてくる。SlackAPIを利用し、投稿を取得。そのうえでCSVに出力することは可能に見える。これを使えば①は行えそうだ。

実際に下記のコードでAPIを組み合わせれば内容は取れそうだ。
だけど私は知っている。そんなに簡単なはずがないと。
トークンが有効期限切れたり、APIでとれる情報の加工が必要だったり何かとCSVを出力するまでにハードルはありそう、かつユーザの投稿をこれに合うようにフォーマットを決める必要も出てくる。誰も使わないものを作ってもしょうがないのである。

import requests
import pandas as pd
from datetime import datetime
import urllib3
urllib3.disable_warnings()

def main():
    SLACK_CHANNEL_NAME = "出力ファイルの名前"
    SLACK_CHANNEL_ID = "チャンネルID"
    TOKEN = "取得したTOKEN"

    SLACK_URL_his = "https://slack.com/api/conversations.history"
    SLACK_URL_user = "https://slack.com/api/users.info" 
    SLACK_URL_rep = "https://slack.com/api/conversations.replies"
    SLACK_URL_mem = "https://slack.com/api/conversations.members"
    
    members_dict = get_members(SLACK_CHANNEL_ID, TOKEN, SLACK_URL_mem, SLACK_URL_user)
    msgs_all = get_message(SLACK_CHANNEL_ID, TOKEN, SLACK_URL_his, msgs_all = [], latest_ts = None)
    msgs_ls = get_msgslist(SLACK_CHANNEL_ID, TOKEN, SLACK_URL_rep, msgs_all)
    out_all = []
    out_all = get_outlist(out_all, msgs_ls, members_dict)
    
    output = pd.DataFrame(out_all, 
                      columns=['type','name', 'time', 'text'])
    output.to_csv(SLACK_CHANNEL_NAME + '.csv', encoding = 'utf_8_sig')

if __name__ == "__main__":
    main()

また、Googleのスプレッドシートに書き出す場合は下記の投稿が参考になりそうである。ここでもSlackAPI(https://slack.com/api/channels.history)を用いて会話履歴を引っ張ってきている。必要なのはトークンとチャネル名。こちらではGASを用いて内容をスプレッドシートに落としてきている。こちらもGoogle側の容量がどこまで許容されるのか?課金は発生しないかが気になるところ。上記のユーザの投稿内容を制御する話も解消していない。

■GASを用いたSlackのメッセージ一覧エキスポート

■Google Apps Scripts(GAS)について

またGASを見てみるとトリガーは時間起動となる模様であり結局前回との突き合わせみたいなロジックは必要そうである。(=イベントドリブンで新規投稿があった際に動くようになったらいいなと妄想した。)

・実装イメージ(②)

・・・ここはちょっとめんどくさい。差分を検知する仕組みを作るのか、新規レコードが入った瞬間にGoogleMapに入れるのか等いろいろ考えられると思うが、ちょっと頭も技術も足りていないので今日のところはいったん寝かしておく。

差分検知であれば、DBのタイムスタンプとの差分で入っていないものをレコード追加。新規追加レコードにはGoogleMapへの投入フラグを付けて置き、反映完了したらフラグを更新するなどが考えられるが今時なのかしら?

もう少しネットサーフィンしてみよう

・実装イメージ(③)


まずGoogleMyMapにピンを表示し、GoogleMap上でそのピンを見るだけであればとても簡単だ。

確かにレイヤーの作りこみなどを考えていけば使い勝手も良いと思うが、それをSlackでのメッセージで指定することは至難の業だと思った。結局ダサいデフォルトのピン止めとできたとしてもレイヤー設計を自由に更新できるような仕組みにはならない。

それをするくらいならMyMAPで一から作って言った方がみんなも触れて楽しいと思う。


もっとイベントドリブンにできないの?

ここまで書いてきて感じたいのは結局、実装②の部分が大変であるということ。③への連携もSlackを経由する必要性があまり沸かないこと。


これらの言い訳はある。が実際問題自分の勉強のためにこの仕組みを用意しようとしたらどんなことができるかまた明日も考えてみたい。

この記事が参加している募集

noteのつづけ方

この記事が気に入ったらサポートをしてみませんか?