プログラムのメモ

JSとかAPIとか諸々のメモ

Slack API 設定方法

概要

slack api からアプリを作成して、 使用する機能に応じて下記で設定を行う。

botの作成

表示名を登録する。

「Always Show My Bot as Online」をチェックすると、
追加したbotのステータスが常にログイン状態に表示される。

特定メッセージに対して、botを反応させる

  • トリガーの作成

Event Subscriptions

「Request URL」
トリガーが発火した際に叩くAPIのURLを設定する。
このAPIbotのメッセージを投稿したり、他処理を対応する。
※URL登録時に疎通確認用のreturnが必要(下記項目参照)

「Subscribe to Workspace Events」
ワークスペースが対象のイベントを設定する。
(例えばワークスペース内のチャンネルにコメントが投稿されたら)

「Subscribe to Bot Events」
botが対象のイベントを設定する。
(例えばbotにDMを送ったら)

  • イベントのリファレンス

api.slack.com

スラッシュコマンドの追加

slackで使用できるスラッシュコマンドを追加できる。

  • コマンドの追加

Slash Commands

「Command」
追加するコマンド

「Request URL」
コマンドが入力された際に叩きに行くAPIのURL

「Short Description」「Usage Hint」
コマンド入力時に表示される、説明とヒント
※オプションコマンドなどを追加するなら記載しておいた方がよい。

  • 注意 Commandに登録した単語はあくまでフックで、
    APIには入力されたコマンド全てが送信されるので、
    オプションなどを追加する場合は、API側でパースする必要がある。

スラッシュコマンドはコマンド送信から3秒以内にAPIから返答を返さないとタイムアウトのエラー表示がされる。

インタラクティブなメッセージの送信

メッセージをテキスト以外、例えば画像やボタンやプルダウンなどで装飾、もしくは返答しやすくできる。

WebApiの「chat.postMessage」で「attachments」を使えばできる。
※「blocks」を使ってもできたので、違いが分からない。

ユーザのメッセージ回答への反応

インタラクティブなメッセージでボタンや、プルダウン等を送った際の返答を受けとる。

  • 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);

セルの範囲の指定

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

SiteGuard WP Plugin

  • 日本語表示
  • 機能が少なく物足りない

不要な機能の制限

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');