質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

1回答

1881閲覧

Slack apiのchat.unfurlでリンクを展開したいが、missing_unfurl_idのエラーになってしまう

omocheese_2

総合スコア0

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

0クリップ

投稿2021/11/15 05:23

編集2021/11/17 03:24

前提・実現したいこと

Slack apiのchat.unfurlを使って、AWS lambdaからurlに関する情報を返したい。

発生している問題・エラーメッセージ

returnの値の中にunfurling_idを書いているが、
missing_unfurl_idになってしまう。

ERROR Error: An API error occurred: missing_unfurl_id at Object.platformErrorFromResult (/opt/nodejs/node_modules/@slack/web-api/dist/errors.js:51:33) at WebClient.apiCall (/opt/nodejs/node_modules/@slack/web-api/dist/WebClient.js:158:28) at processTicksAndRejections (internal/process/task_queues.js:95:5) at async postMessage (/var/task/index.js:106:20) at async Runtime.exports.handler (/var/task/index.js:123:21) { code: 'slack_webapi_platform_error', data: { ok: false, error: 'missing_unfurl_id', response_metadata: { scopes: [Array], acceptedScopes: [Array] } } }

該当のソースコード

受け取った値

javascript

1{ 2 token: 'QxsXXXXXX', 3 team_id: 'YYYYYY', 4 api_app_id: 'ZZZZZZZ', 5 event: { 6 type: 'link_shared', 7 user: 'U0XXXXXX', 8 channel: 'C0XXXXXX', 9 message_ts: '163XXXX.XXXX', 10 links: [ [Object] ], 11 source: 'conversations_history', 12 unfurl_id: 'C0XXXXX.163XXXXX.YYYYYY.4041d4facXXXXXXXXX', 13 is_bot_user_member: true, 14 thread_ts: '163XXXXX.000200', 15 event_ts: '163XXXXXX.274916' 16 }, 17 type: 'event_callback', 18 ........ 19}

送信した値

javascript

1const AWS = require("aws-sdk"); 2const docClient = new AWS.DynamoDB.DocumentClient(); 3const { App } = require('@slack/bolt'); 4 5exports.handler = async (event, context, callback) => { 6 const obj = JSON.parse(JSON.stringify(event)); 7 const posted_url = obj.event.links[0].url; 8 9 const postMessage = async (data) => { 10 const app = new App({ 11 token: process.env.USER_OAUTH_TOKEN, 12 signingSecret: process.env.SIGNING_SECRET 13 }); 14 try { 15 const result = app.client.chat.unfurl(data); 16 return await result; 17 } 18 catch (error) { 19 console.error(error); 20 } 21 }; 22 23 const setResnponse = async(userName) => { 24 const text = userName + "AAAA"; 25 const unfurling = { 26 "token": process.env.USER_OAUTH_TOKEN, 27 "channel": obj.event.channel, 28 "ts": obj.event.message_ts, 29 "source": "composer", 30 "unfurl_id": obj.event.unfurl_id, 31 "unfurls": { 32 posted_url: { 33 "blocks": [ 34 { 35 "type": "section", 36 "text": { 37 "type": "mrkdwn", 38 "text": text 39 } 40 ] 41 } 42 }, 43 }; 44 45 const data = setResnponse("BBB") 46 const res = await postMessage(data); 47 return res; 48}; 49

試したこと

SlackからPOSTで受け取った値にあったunfurling_idを含め、
(@slack/boltを使って)postMessageを返したのですが、うまくいきませんでした。。

アドバイス、ヒントなどあれば教えていただきたいです。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Slack
AWS API Gateway /Lambda

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

"unfurls" 配下の posted_url というのは実際の URL になっていますか? link_shared イベントのペイロードに links という配列があり、その要素に url という属性があると思います。これを指定しないとダメですね。

投稿2021/11/15 05:53

seratch

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omocheese_2

2021/11/15 08:30 編集

ご回答ありがとうございます! posted_urlをconsole.logしたところ、 記載いただいたlinks配下のurlと同じようでした。 urlの値がSlackに投稿したurlと同じであったため、 投稿するurlの値を直接書いてテストしてみましたが、エラーは変わらずでした。。
seratch

2021/11/15 23:35

>"ts": 上記event_ts, これは event_ts ではなく message の ts にしてください。値が常に一致するとは限りません。 というか、unfurl_id 指定しなくても channel と ts の組み合わせだけでも普通に動作しませんか?あと、完全なコードを共有してもらった方が回答しやすいかなと思います。
omocheese_2

2021/11/17 03:37

ご指摘ありがとうございます。 tsの部分、思いっきり間違えておりました。。message_tsに変更しました! > というか、unfurl_id 指定しなくても channel と ts の組み合わせだけでも普通に動作しませんか? こちらを受けまして、sourceとunfurl_idを削除してトライしてみたのですが、動作せずでした、、 「送信した値」に省略していた部分を訂正いたしましたので、ご確認いただけますと幸いです。 (意図していた形と異なるようでしたらすみません;)
seratch

2021/11/17 03:55

更新されたコードもそのままで動かないですよね、これ。ちょっとなんとも言えないです。
omocheese_2

2021/11/20 02:35

そうですね、、動くための値をここに載せるのは難しいと判断いたしました。 ts修正の上、改めて自分で考えてみたいと思います。お力添えをいただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問