GAS 와 Slack API の conversations.history でチャンネル ID から内部の멧세이지리스트を取得する
前提
前回の記事でチャンネルlistを取得できた
今度は체넬の中身の멧세이지타치を取得したい.
Slack API Doc を読んでチャンネルの中のメッセージの取得方法を確認
https://api.slack.com/messaging/retrieving#conversations
公式によると
GET https://slack.com/api/conversations.history
Authorization: Bearer xoxb-your-token
{
channel: "CONVERSATION_ID_HERE"
}
conversations.history에서 GET 로
{ 채널: "conversation_id"}
(을)를 페이로드로 渡せば取れるっぽい
API richestの共通ラッパーを作る
前回の記事の
https://qiita.com/seratch/items/2158cb0abed5b8e12809
seratech さんの api 랍파를 参考にして
function callWebApi(token, apiMethod, payload) {
const response = UrlFetchApp.fetch(
`https://www.slack.com/api/${apiMethod}`,
{
method: "post",
contentType: "application/x-www-form-urlencoded",
headers: { "Authorization": `Bearer ${token}` },
payload: payload,
}
);
console.log(`Web API (${apiMethod}) response: ${response}`)
return response;
}
API richestのrappa-を conversations.hisotry 와 채널 ID で呼び出す
これに
const apiResponse = callWebApi(
token,
"conversations.history",
{ channel: "C0385KDLRD5"},
);
conversations.history を渡して
paylaod として 前回の記事で conversations.list から所得した
making-bot チャンネルの id C0385KDLRD5 を入れて実行すると
Web API (conversations.history) response: {"ok":true,"messages":[{"type":"message","subtype":"channel_join","ts":"1648155092.889729","user":"U038DHKP87Q","text":"<@U038DHKP87Q> has joined the channel"}],"has_more":false,"pin_count":0,"channel_actions_ts":null,"channel_actions_count":0}
ここの チャンネルメッセージたちが取得できた.
https://qiita.com/seratch/items/2158cb0abed5b8e12809#web-api-%E3%81%AF%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%97%E3%82%87%E3%81%86
この記事では "#random"とチャンネル名を渡すように書いてあるが、
これでは動かなかった.
Web API (conversations.history) response: {"ok":false,"error":"channel_not_found"}
일반 指定での実行結果の詳細を見てみる
前回 conversations.list を実行するして
{"id":"C038NHHFN3E","name":"general",...},
일반 の id が取得できた.
이 일반 の id: C038NHHFN3E で実行してみる
Web API (conversations.history) response: {"ok":true,"messages":[
すると、conversations.list のような出だしになるが
{
"type":"message",
"subtype":"channel_purpose",
"ts":"1648513399.644649",
"user":"U038DHKP87Q",
"text":"set the channel description: "Edited 03-29\","
"purpose":"Edited 03-29"
},
{
"client_msg_id":"489452e3-72bb-4276-86da-b41a36ab3bb7",
"type":"message",
"text":"09:47 text",
"user":"U038DHKP87Q",
"ts":"1648169260.574219",
"team":"T038NHHEJJY",
"blocks":[{"type":"rich_text","block_id":"PA+","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"09:47 text"}]}]}]
},
{
"client_msg_id":"98fd1e24-2b1a-4028-a6d8-4d79980c702c",
"type":"message",
"text":"3rd message",
"user":"U038DHKP87Q",
"ts":"1648168642.874689",
"team":"T038NHHEJJY",
"blocks":[{"type":"rich_text","block_id":"2cN","elements":[{"type":"rich_text_section","elements":[{"type":"text","text":"3rd message"}]}]}]},
{
"type":"message",
"subtype":"channel_join",
"ts":"1648154999.666459",
"user":"U038DHKP87Q",
"text":"<@U038DHKP87Q> has joined the channel"}],
"has_more":false,
"pin_count":0,
"channel_actions_ts":null,
"channel_actions_count":0
}
channel_purpose 와 言うチャンネルの説明の変更,
channel_join と言うチャンネルの参加者の通知、
등의 하위 유형이 있는 시스템멧세이지나
client_msg_id があり text の他に
同じ内容の rich_text のブロックがある
通常のユーザーが投稿したメッセージが
これらが新しい順に並べられる.
結果를 JSON으로 변환
https://zenn.dev/nariakiiwatani/articles/8ed4a7bb0d5d0b
この nariakiiwatani さんの記事を参考にして
const JSONParsedResponse = JSON.parse(response)
console.log(`apiMethod: (${apiMethod})`)
console.log(`JSONParsedResponse`)
console.log(JSONParsedResponse)
JSON.parse(response) を使ってみると
{ ok: true,
messages:
[ { type: 'message',
subtype: 'channel_purpose',
ts: '1648513399.644649',
user: 'U038DHKP87Q',
text: 'set the channel description: "Edited 03-29',"
purpose: 'Edited 03-29' },
{ client_msg_id: '489452e3-72bb-4276-86da-b41a36ab3bb7',
type: 'message',
text: '09:47 text',
user: 'U038DHKP87Q',
ts: '1648169260.574219',
team: 'T038NHHEJJY',
blocks: [Object] },
{ client_msg_id: '98fd1e24-2b1a-4028-a6d8-4d79980c702c',
type: 'message',
text: '3rd message',
user: 'U038DHKP87Q',
ts: '1648168642.874689',
team: 'T038NHHEJJY',
blocks: [Object] },
恐ろしく美しく出力された.
しかし、blocks는 は省略されてしまった.
配列になっているので、これに
console.log(JSONParsedResponse.messages[2])
中身のメッセージ配列の 2 つめを指定すると
{ client_msg_id: '98fd1e24-2b1a-4028-a6d8-4d79980c702c',
type: 'message',
text: '3rd message',
user: 'U038DHKP87Q',
ts: '1648168642.874689',
team: 'T038NHHEJJY',
blocks: [ { type: 'rich_text', block_id: '2cN', elements: [Object] } ] }
最新から 2 つめのメッセージのみが表示された
멧세이지配列の指定のだけを取った配列を作る
const messages = JSONParsedResponse.messages
newMessages = messages.map(function (v) {
return [
v.client_msg_id,
v.type,
v.text,
v.user,
v.ts,
v.reply_count || 0,
v.reply_users_count || 0,
];
});
console.log(newMessages)
[ [ undefined,
'message',
'set the channel description: Edited 03-29',
'U038DHKP87Q',
'1648513399.644649',
0,
0 ],
[ '489452e3-72bb-4276-86da-b41a36ab3bb7',
'message',
'09:47 text',
'U038DHKP87Q',
'1648169260.574219',
0,
0 ],
여기에서 JSON 오브제크트로부터 CSV 니치카이配列になったので
시트 に書き出しやすくなった
다음
https://zenn.dev/nariakiiwatani/articles/8ed4a7bb0d5d0b
この記事に
JSON perse し라고 map し라고 reverse し라고
id, ts(timestamp?), text, user,
のみを配列にして
SpreadSheetApp の getRange 와 setValues で埋め込む方法が書いてあった
これを試してみる
Reference
이 문제에 관하여(GAS 와 Slack API の conversations.history でチャンネル ID から内部の멧세이지리스트を取得する), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kaede_io/gas-to-slack-api-no-conversationshistory-detiyanneru-id-karazhong-shen-woqu-de-suru-1cda텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)