BEST CLOUD さんの Slack + GAS 로그保存の코드를 解読する
30886 단어 googlecloudslack
BEST CLOUD さんの Slack の全 チャンネルの멧세이지를
GAS でスプレッドシートに全て保存する記事を読んで試した
しかし、肝心のcodeでは
以下のテキストを最初から最後まで全てコピーしてください。
とあり, わずかな 멘트だけだったので解釈してみる
setProperty 에서 slack_api_toke や folder_id をsettosu
最初に
SerPropoerties()
をしているこの関数は
function SetProperties() {
PropertiesService.getScriptProperties().setProperty(
'slack_api_token',
'xoxp-111-222-333-444'
);
PropertiesService.getScriptProperties().setProperty(
'folder_id', '123ef'
);
PropertiesService.getScriptProperties().setProperty(
'last_channel_no', -1
);
}
GAS の内部プロパティ?
slack_api_token 에 xoxp-1234 등의 토크쿤
folder_id に Google 드라이브 の フォルダ ID
last_chanlle_no に -1
これを初手で入れている
これはわかりやすい.
getProperty 에서 slack_api_token や folder_id 에서 データを取得して定数に入れる
const FOLDER_ID = PropertiesService.getScriptProperties().getProperty(
'folder_id'
);
if (!FOLDER_ID) {
throw 'You should set "folder_id" property from [File] > [Project properties] > [Script properties]';
}
const API_TOKEN = PropertiesService.getScriptProperties().getProperty(
'slack_api_token'
);
if (!API_TOKEN) {
throw 'You should set "slack_api_token" property from [File] > [Project properties] > [Script properties]';
}
先ほど slack_api_token や folder_id にいれたトークンとフォルダID を
FOLDER_ID 와 API_TOKEN 과 言う定数に入れ直す.
そしてなかった場合のエラー処理を書く.
先ほど GAS のプロパティに入れたものものを出して定数に入れるだけなので
ここもわかりやすい.
Google Drive の フォルダ, シート, シートへの コントローラを作成する
let token = API_TOKEN
API_TOKEN を今度は小文字の変数に入れるなぜここでコピーしているかは不明.
let folder = FindOrCreateFolder(
DriveApp.getFolderById(FOLDER_ID), FOLDER_NAME
);
先ほどの FOLDER_ID と 省略した FOLDER_NAME の文字列で
作者の自作メソッドの FindOrCreateFolder で, フォルダがない場合は作成する
let ss = FindOrCreateSpreadsheet(folder, SpreadSheetName);
中でも同じように, 포르다토스프렛드시트名から스프렛드시트を探して
스프렛드시트가 아닌 場合は作成する
let ssCtrl = new SpreadsheetController(ss, folder);
そしてそのスプレッドシートのコントロラーを作成する
슬랙 へのアクセサを作成して
// Slack へのアクセサ
var SlackAccessor = (function () {
function SlackAccessor(apiToken) {
this.APIToken = apiToken;
}
これは 156 行目にあった作者の自作クラス
let slack = new SlackAccessor(API_TOKEN);
同じように slack のアクセサを作る
// メンバーリスト取得
const memberList = slack.requestMemberList();
// チャンネル情報取得
const channelInfo = slack.requestChannelInfo();
そこからmenbar-listtochangnellistを取得する
이 requestMemberList 와 requestChannelInfo も
後述の著者의 자작 메소드나のでかなり難しい.
let first_exec_in_this_channel = true;
for (let ch of channelInfo) {
console.log(ch.name)
let timestamp = ssCtrl.getLastTimestamp(ch, 0);
let messages = slack.requestMessages(ch, timestamp);
ssCtrl.saveChannelHistory(ch, messages, memberList, token);
if (timestamp == '1') {
first_exec_in_this_channel = true;
}
}
そして channleInfo を map し 콘솔 にだす
스플렛시트의 最後の타임스탠프?を取得し
slack からチャンネルのメッセージをチャンネルID?とそのtimestanpで取得し
스프렛시트의 콘트로라에스
타임스탄프가 1 であればチャンネルの最初で終わる?
// スレッドは重い処理なので各回に1回のみ行う
const ch_num = (
parseInt(PropertiesService.getScriptProperties().getProperty(
'last_channel_no')
) + 1
) % channelInfo.length;
console.log('ch_num');
console.log(ch_num);
const ch = channelInfo[ch_num]
console.log(ch);
最後のチャンネル名、-1 を入れたものに +1 をして체넬数で割る
チャンネルの中のそのプロパティを出力??? ここは意味がわからない
var p = SlackAccessor.prototype;
前述で作った Slack のアクセサカラ プロトタイプを取得して p に入れる
// API リクエスト
p.requestAPI = function (path, params) {
if (params === void 0) { params = {}; }
var url = "https://slack.com/api/" + path + "?";
var qparams = [];
for (var k in params) {
qparams.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k]));
}
url += qparams.join('&');
var headers = {
'Authorization': 'Bearer ' + this.APIToken
};
console.log("==> GET " + url);
var options = {
'headers': headers, // 上で作成されたアクセストークンを含むヘッダ情報が入ります
};
var response = UrlFetchApp.fetch(url, options);
var data = JSON.parse(response.getContentText());
if (data.error) {
console.log(data);
console.log(params);
throw "GET " + path + ": " + data.error;
}
return data;
};
var qparams = [];
for (var k in params) {
qparams.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k]));
}
クエリパラーメータの配列をEncodedして &= でくっつける このロジックはかなり便利そう.
そしてここで p.reqeustAPI と言う API 리크에스트の
https://slack.com/api/
の 끝점 URL でのラッパーを作成する.
p.requestAPI = function (path, params) {
var url = "https://slack.com/api/" + path + "?";
var qparams = [];
for (var k in params) {
qparams.push(encodeURIComponent(k) + "=" + encodeURIComponent(params[k]));
}requestAPI
url += qparams.join('&');
引数からクエリとパスを受け取り、それらをEndpointの基礎 URL に加算する
var headers = {
'Authorization': 'Bearer ' + this.APIToken
};
var options = {
'headers': headers,
};
var response = UrlFetchApp.fetch(url, options);
var data = JSON.parse(response.getContentText());
if (data.error) {
console.log(data);
console.log(params);
throw "GET " + path + ": " + data.error;
}
return data;
}
そして HTTP 헥다ーの認証情報で "Bearer"+API_TOKEN をつけて
先ほどの url 과 今のhedd-をoptionとして渡し、레스폰스を受け取る
そのレスポンスを JSON にpassして エラー処理する
// チャンネル情報取得
p.requestChannelInfo = function () {
var response = this.requestAPI('conversations.list');
response.channels.forEach(function (channel) {
console.log("channel(id:" + channel.id + ") = " + channel.name);
});
return response.channels;
};
// 特定チャンネルのメッセージ取得
p.requestMessages = function (channel, oldest) {
var _this = this;
if (oldest === void 0) { oldest = '1'; }
var messages = [];
var options = {};
options['oldest'] = oldest;
options['count'] = HISTORY_COUNT_PER_PAGE;
options['channel'] = channel.id;
var loadChannelHistory = function (oldest) {
if (oldest) {
options['oldest'] = oldest;
}
var response = _this.requestAPI('conversations.history', options);
messages = response.messages.concat(messages);
return response;
};
이 API のラッパーをチャンネル情報の取得와 멧세이지の取得で使用する
// チャンネル情報取得
p.requestChannelInfo = function () {
var response = this.requestAPI('conversations.list');
response.channels.forEach(function (channel) {
console.log("channel(id:" + channel.id + ") = " + channel.name);
});
return response.channels;
};
// 特定チャンネルのメッセージ取得
p.requestMessages = function (channel, oldest) {
var _this = this;
if (oldest === void 0) { oldest = '1'; }
var messages = [];
var options = {};
options['oldest'] = oldest;
options['count'] = HISTORY_COUNT_PER_PAGE;
options['channel'] = channel.id;
var loadChannelHistory = function (oldest) {
if (oldest) {
options['oldest'] = oldest;
}
var response = _this.requestAPI('conversations.history', options);
messages = response.messages.concat(messages);
return response;
};
まとめ
GAS の Slack API の利用ではしっかりと API richestのrapper-を書いてその呼び出しにも一つ一つロジックを書いていかないと使えないことがわかった
Reference
이 문제에 관하여(BEST CLOUD さんの Slack + GAS 로그保存の코드를 解読する), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaede_io/slack-api-kara-gas-de-menbatotiyanneruwoqu-de-suru-3a5h텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)