はじめに
Slackで匿名チャンネルを作りました。
直接聞きにくい相談やちょっとした雑談で使えるので便利です。
「画像も投稿できたらコミュニケーションの幅が広がるのでは?」と思ったのがきっかけで、
画像も匿名で投稿できるようにしました。
処理の流れとしては、
1. BotにDMで画像を送信する
2. Botが画像を受け取ったら、ローカルに保存する
3. 指定したチャンネルに保存した画像をBotが代わりに投稿する
4. ローカルに保存した画像を削除する
5. 終わり
となってます。
JavaScript初心者なので至らない点もあると思いますが、ご了承ください。
準備
この記事を参考に、
- ワークスペース内で使うSlack Botの作成
- API Tokenの取得
- Botkitのインストール
を行ってください。
説明のために、今回作成したBotの名前は"anonymous_bot"とします。
BotとChannelのIDを取得
先ほど取得したAPI Tokenを使って、Botと匿名で投稿したいチャンネルのIDを取得してください。
- BotのIDを取得
https://slack.com/api/users.list?token=さっき取得したAPI_Token
- ChannelのIDを取得
https://slack.com/api/channels.list?token=さっき取得したAPI_Token
取得できるIDは、大文字のアルファベットと数字の組み合わせになっているはずです。
例:ABC0ED123
プログラムの作成
以下のプログラムをコピペしてください。
slack_bot.js
constBotkit=require('/path/to/Botkit.js');constos=require('os');constfs=require('fs');constdownload=require('download');consthttps=require('https');constdel=require('delete');constslackBot_id='BotのID';constchannel_id='投稿したいChannelのID';consttoken='取得したAPI Token';varcontroller=Botkit.slackbot({debug:false,});varbot=controller.spawn({token:token}).startRTM();controller.on('file_shared',function(bot,message){if(message.user_id!=slackBot_id){//Bot自身の投稿には反応しないconstmessageObj={token:token,file:message.file_id};bot.api.files.info(messageObj,function(err,res){if(err){console.log(err)}else{console.log('[file_shared] on');varnow=newDate();varfile_name=now.getFullYear()+':'+(now.getMonth()+1)+':'+now.getDate()+':'+now.getHours()+':'+now.getMinutes()+':'+now.getSeconds()+'.jpg';varfile_dir='/path/to/image_dir/';varfile_path=file_dir+file_name;//ローカルに保存する際のディレクトリとファイル名varfile_url=res.file.url_private_download;//送信された画像のURLvaroptions={'method':'GET','hostname':'files.slack.com','path':file_url,'rejectUnauthorized':'false','headers':{'Authorization':'Bearer '+token}};varfile=fs.createWriteStream(file_path);varresponseSent=false;//URL先の画像をローカルに保存https.get(options,response=>{response.pipe(file);file.on('finish',()=>{file.close(()=>{if(responseSent)return;responseSent=false;});//file.close});//file.on});//https.getconsole.log('file download');//時間差で画像の送信→画像の削除を行うsetTimeout(()=>{constmessageObj={file:fs.createReadStream(file_path),filename:file_name,title:file_name,channels:channel_id};bot.api.files.upload(messageObj,function(err,res){if(err){console.log(err);}else{console.log('file upload');}});//bot.api.filessetTimeout(()=>{del([file_path],function(err,res){if(err){console.log(err);}else{console.log('file delete');}});//del},1000);//setTimeout},1000);//setTimeout}//else});//bot.api.files}//ifconsole.log("finish");});//controller.on
実行方法
# Botの起動
$ forever start slack_bot.js
# Botの停止
$ forever stop slack_bot.js