Slack API 設定方法
概要
slack api からアプリを作成して、 使用する機能に応じて下記で設定を行う。
botの作成
- Bot User
表示名を登録する。
「Always Show My Bot as Online」をチェックすると、
追加したbotのステータスが常にログイン状態に表示される。
特定メッセージに対して、botを反応させる
- トリガーの作成
Event Subscriptions
「Request URL」
トリガーが発火した際に叩くAPIのURLを設定する。
このAPIでbotのメッセージを投稿したり、他処理を対応する。
※URL登録時に疎通確認用のreturnが必要(下記項目参照)
「Subscribe to Workspace Events」
ワークスペースが対象のイベントを設定する。
(例えばワークスペース内のチャンネルにコメントが投稿されたら)
「Subscribe to Bot Events」
botが対象のイベントを設定する。
(例えばbotにDMを送ったら)
- イベントのリファレンス
スラッシュコマンドの追加
slackで使用できるスラッシュコマンドを追加できる。
- コマンドの追加
Slash Commands
「Command」
追加するコマンド
「Request URL」
コマンドが入力された際に叩きに行くAPIのURL
「Short Description」「Usage Hint」
コマンド入力時に表示される、説明とヒント
※オプションコマンドなどを追加するなら記載しておいた方がよい。
スラッシュコマンドはコマンド送信から3秒以内にAPIから返答を返さないとタイムアウトのエラー表示がされる。
インタラクティブなメッセージの送信
メッセージをテキスト以外、例えば画像やボタンやプルダウンなどで装飾、もしくは返答しやすくできる。
WebApiの「chat.postMessage」で「attachments」を使えばできる。
※「blocks」を使ってもできたので、違いが分からない。
- リファレンス api.slack.com
ユーザのメッセージ回答への反応
インタラクティブなメッセージでボタンや、プルダウン等を送った際の返答を受けとる。
- Interactive Components
「Request URL」
返答があった際に叩くAPIのURLを設定する。
Request URLの疎通確認用return
Request URLに設定するURLは最初に疎通確認用の通信が行われ、
それにパスしないと設定ができない。
設定されたURLに対して、「challenge」というパラメータが送られるので、
それを送り返してあげればOK。
- サンプル(GAS)
function doPost(e){ var postData = JSON.parse(e.postData.getDataAsString()); var res = {}; if(postData.type == 'url_verification') { res = {'challenge':postData.challenge} } return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON); }
heroku コマンド一覧
ログイン
heroku login
app 新規作成
heroku create [app name]
heroku に内容を反映する
git push heroku master
- git から push する
- 事前に commit しておくこと
remote の設定
heroku git:remote --app [app name]
- 基本的にはcreateしたタイミングで自動追加されるがされなかった場合は上記コマンドでremote追加する
app 一覧閲覧
heroku list
app 削除
heroku apps:destroy --app [app name]
slash commandの3秒ルールをどうにかする。
SlackApiで作成できるslash commandではレスポンスを3秒以内に返さないとタイムアウトしてしまうが、GASをサーバとして使用する場合、この問題は相性が最悪だと思う。
そもそもGASは非同期処理を推奨していないようでsetTimeout系が全く使えない。
Lambdaの場合は、callbackでレスポンスだけ先に返すこともできるようだが、当然GASではそんなことできない。
そのため、リアルタイム処理で時間がかかりそうなものはcookieやcacheにキューとして保存して、別途定期実行で処理を行うやり方がググると出てくる。
ただ、GASの定期実行は最短が1分毎なので、リアルタイムで実行したい場合は厳しい。
その場合、コード内でイベントトリガーを作成して実行すると、限りなくリアルタイムに近い非同期処理が可能になる。
var d = new Date(); d.setMinutes(d.getMinutes() + 1);// 1 分後 ScriptApp.newTrigger("function_name").timeBased().at(d).create();
上記newTriggerを使用して時間指定でイベントを設定し、別途処理を行えば何とかなる。
追記 19/06/07
全然リアルタイムじゃなかったです。
newTrigger自体が発火までに最大15分ずれることがあるとのことなので、リアルタイムは難しい。
それと追加したトリガーは都度消さないとトリガーが貯まって怒られます。
var triggers = ScriptApp.getProjectTriggers(); for(var i=0; i < triggers.length; i++) { ScriptApp.deleteTrigger(triggers[i]); }
- 全てのトリガーを削除
スプレッドシートの扱い
GASでスプレッドシートを操作する際のメソッドをまとめた。
スプレッドシートの作成
SpreadsheetApp.create("シート名");
スプレッドシートの指定
var ss = SpreadsheetApp.openById("シートID"); //シートのIDで指定 var ss = SpreadsheetApp.openByUrl(”スプレッドシートのURL”); //URLで指定 var ss = SpreadsheetApp.open(file) //driveAPPで取得したfileで指定
- 色々あるけど、シートIDで指定するのが一番使うかな。
スプレッドシートのシートの追加
var sheet = ss.insertSheet("シート名", index番号);
- 引数はどちらも省略可。
スプレッドシートのシートの指定
var sheet = ss.getSheetByName("シート名"); // シート名を指定 var sheet = ss.getActiveSheet(); // 最後にアクティブになっていたシートを指定
- シートを複数使用する場合は、シート名の指定は必須。
スプレッドシートの削除
ss.deleteSheet(sheet);
- スプレッドシートの削除メソッドに削除するシートを渡す。戻り値がvoid。
セルの範囲の指定
sheet.getRange(1, 1);
- 行、列の順に指定するとセルを指定できる。
sheet.getDataRange()
- 値が入っている範囲を全て取得する。行、列共に最大範囲を取得するため、表によっては空の値が多くなる。
データ取得
sheet.getRange(1, 1).getValues(); sheet.getDataRange().getValues();
- 範囲が複数の場合、値は配列で取得される。
データ書き込み
sheet.getRange(1, 1).setValue("値");
- 指定したセルに値を書き込む
データ削除
sheet.getRange(1, 1).clearContent(); sheet.getDataRange().clearContent();
- 指定した範囲の値を空にする。getDataRangeと組み合わせるとシート内の全ての値を削除できる。
prototype内でのsetTimeoutの呼び出し
prototype内でsetTimeoutなどの非同期処理を使ってthisを呼び出す場合、
通常のthisが重複する処理同様、いったん別変数に移し替えてから行う。
function aaa(){ this.cnt = 1; } aaa.prototype.bbb = function(){ this.cnt++; var self = this; setTimeout(function(){ self.bbb(); },this.speed); }
WPインスト時のセキュリティ対策
セキュリティプラグインの導入
All In One WP Security & Firewall
- 英語表示
- 基本的にはこれ入れればOK
- 日本語表示
- 機能が少なく物足りない
不要な機能の制限
XML-RPCを無効にする
<Files xmlrpc.php> Order Deny,Allow Deny from all </Files>
REST APIを無効にする
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{QUERY_STRING} rest_route= RewriteRule ^$ /? [R=404,L] </IfModule>
wp-comments-post.phpへのアクセスを制限する
<Files wp-comments-post.php> order allow,deny deny from all </Files>
作成者アーカイブの非表示
add_filter('author_rewrite_rules', '__return_empty_array');