Notion-MW
Notion-MW
98行目: 98行目:
[https://zenn.dev/azechi/scraps/a98add131e8410 DiscordのSlash Commandをwebhookで受信する方式で作ってみる]にある[https://github.com/discord/discord-interactions-js https://github.com/discord/discord-interactions-js]を使うとよさそう。これをNetlify(AWS Lambda)向けに書き換えて、以下のようになる(前述サイトの内容に加えて、使用された対象のメッセージリンクを送るようにしている)。これが動作するかどうか、まずはテストしてみよう。
[https://zenn.dev/azechi/scraps/a98add131e8410 DiscordのSlash Commandをwebhookで受信する方式で作ってみる]にある[https://github.com/discord/discord-interactions-js https://github.com/discord/discord-interactions-js]を使うとよさそう。これをNetlify(AWS Lambda)向けに書き換えて、以下のようになる(前述サイトの内容に加えて、使用された対象のメッセージリンクを送るようにしている)。これが動作するかどうか、まずはテストしてみよう。


<pre class="visual">const { InteractionResponseType, InteractionType, verifyKey } = require('discord-interactions')
<syntaxhighlight lang="python">
 
vb.net
const { InteractionResponseType, InteractionType, verifyKey } = require('discord-interactions')


const CLIENT_PUBLIC_KEY = process.env.CLIENT_PUBLIC_KEY;
const CLIENT_PUBLIC_KEY = process.env.CLIENT_PUBLIC_KEY;


exports.handler = async (event, context) =&gt; {
exports.handler = async (event, context) => {
     console.log(event)
     console.log(event)
     const signature = event.headers['x-signature-ed25519'];
     const signature = event.headers['x-signature-ed25519'];
     const timestamp = event.headers['x-signature-timestamp'];
     const timestamp = event.headers['x-signature-timestamp'];
     console.log(signature, timestamp)
     console.log(signature, timestamp)
     console.log(event[&quot;body&quot;])
     console.log(event["body"])
     const isValidRequest = verifyKey(event[&quot;body&quot;], signature, timestamp, CLIENT_PUBLIC_KEY);
     const isValidRequest = verifyKey(event["body"], signature, timestamp, CLIENT_PUBLIC_KEY);
     if (!isValidRequest) {
     if (!isValidRequest) {
         console.log(&quot;! returning 401&quot;)
         console.log("! returning 401")
       return {
       return {
         statusCode: 401,
         statusCode: 401,
         body: 'Bad request signature'}
         body: 'Bad request signature'}
     }
     }
     const interaction = JSON.parse(event[&quot;body&quot;]);
     const interaction = JSON.parse(event["body"]);


     if(interaction &amp;&amp; interaction.type === InteractionType.APPLICATION_COMMAND) {
     if(interaction && interaction.type === InteractionType.APPLICATION_COMMAND) {
         const guild_id = interaction.guild_id
         const guild_id = interaction.guild_id
         const mess = interaction.data.resolved.messages
         const mess = interaction.data.resolved.messages
129行目: 132行目:
         return {statusCode: 200,'headers': {'Content-Type': 'application/json'},body: ret}
         return {statusCode: 200,'headers': {'Content-Type': 'application/json'},body: ret}
     } else {
     } else {
     console.log(&quot;! returning pong&quot;)
     console.log("! returning pong")
     return {statusCode: 200, body: JSON.stringify({type: InteractionResponseType.PONG} )};
     return {statusCode: 200, body: JSON.stringify({type: InteractionResponseType.PONG} )};
     }
     }
}</pre>
}</syntaxhighlight>
CLIENT_PUBLIC_KEYはnetlifyの画面の環境変数から設定する(よくあるやつ)。
CLIENT_PUBLIC_KEYはnetlifyの画面の環境変数から設定する(よくあるやつ)。


<ul>
<ul>
<li><p>最初試していたとき、Netlify上では応答を返すところまで上手くいっているのに「インタラクションに失敗しました」interaction failed(一旦画面移動してから見ると「アプリケーションが応答しませんでした」application did not respondに変わっている)と出続けていたが、応答に</p>
<li><p>最初試していたとき、Netlify上では応答を返すところまで上手くいっているのに「インタラクションに失敗しました」interaction failed(一旦画面移動してから見ると「アプリケーションが応答しませんでした」application did not respondに変わっている)と出続けていたが、応答に</p>
<pre class="visual">'headers': {
<syntaxhighlight lang="python">
vb.net
'headers': {
             'Content-Type': 'application/json',
             'Content-Type': 'application/json',
         },</pre>
         },</syntaxhighlight>
<p>を付けたら通った…</p></li>
<p>を付けたら通った…</p></li>
<li><p>関連リンク</p>
<li><p>関連リンク</p>
186行目: 191行目:
==== pininit.js ====
==== pininit.js ====


<syntaxhighlight lang="javascript">const { InteractionResponseType, InteractionType, verifyKey } = require('discord-interactions')
<syntaxhighlight lang="python">
 
javascript
const { InteractionResponseType, InteractionType, verifyKey } = require('discord-interactions')


const fetch = require("node-fetch-commonjs");
const fetch = require("node-fetch-commonjs");
238行目: 246行目:
==== pin.js ====
==== pin.js ====


<syntaxhighlight lang="javascript">const { InteractionResponseType, InteractionType, verifyKey } = require('discord-interactions')
<syntaxhighlight lang="python">
 
javascript
const { InteractionResponseType, InteractionType, verifyKey } = require('discord-interactions')
const fetch = require("node-fetch-commonjs");
const fetch = require("node-fetch-commonjs");