こんな感じの通知を送りたいなと思った時にWebhookで送信するとうまくいかなかったという話です。
- 理想
- 現実
こんな感じでURLがうまく表示されません。
表示されないだけでなくクリックしても無効なリンクになってしまっています。
NotionのページURLに-_-
という箇所がある
実際には_
が悪さをしてそうでした。
以下はコードの試した時の一部抜粋です。
- パターン1
const sendMsg = `[最終更新: ${editTimeJP}] ${studentName}さんのページ( ${update.url})を${update.block.last_edited_user?.name}さんが更新。 ${update.block.text} \n\n`;
- パターン2
const sendMsg = `[最終更新: ${editTimeJP}] ${studentName}さんの[メンタリング情報](${update.url})を${update.block.last_edited_user?.name}さんが更新。 ${update.block.text} \n\n`;
という感じで( https://~~~~~ )
やマークダウンにして[テキスト](https://~~~~~)
といった指定でもうまくいかず、最初に貼った画像のように_
が消え去ってURLは開けない状態になってました。
ユーザー名にも_が含まれていた
PO0000-○○さん_詳細
といったDBのレコードタイトル付けになっていて、PO0000-○○さん_詳細さんの情報を更新しました。 https://hogehoge.com/hoge-_-hogehoge
といったURLになっていました。
これによって_と_で囲まれる部分が発生してマークダウンとして機能してしまってうまく表示できない といった状態になってました。
const sendMsg = `${studentName}さんの_[対象ページ](${update.url}) \n`;
といった形で_
をつけた上でURLを展開するとURLの展開前に一旦_
のブロックが閉じられるので次のURL部分はちゃんとURLとして認識されるといった流れのようでした。
SQLインジェクションっぽいですね。
ユーザー名側の_
を先に消しておく
結果どうなったかというと、ユーザー名側の"_詳細"の部分をsplitして削除する処理を挟み、、
const studentName = (update.studentName) ? update.studentName.split('_')[0] : '';
マークダウンの[テキスト](URL)
の形式にしてあげることで回避できました。
const sendMsg = `[最終更新: ${editTimeJP}] ${studentName}さんの[メンタリング情報](${update.url})を${update.block.last_edited_user?.name}さんが更新。 ${update.block.text} \n\n`
まとめ - _
が入るURL注意
1回のDiscord Webhookに送る文章を複数の変数を展開して作る時には_
などが含まれてしまってないかを確認しましょう。自戒。
~
はURLになることはほぼない気もするけど、*
や-
や_
は注意したいなと思いました。