あいんずのBLOG

Cloudflare Workersの使い方メモ

2023-11-25

最初はどういったサービスなのか説明した上で書いていくのが望ましいでしょうが、自分が試していることを忘れないようにメモ書きをしていくのが目的なので雑に書いていきます。
※ 色々と参照した内容を組合せてやりたいことを実現しようとしていましたが、色々と参照しすぎて何を見たのか整理できていないので、時間がある時に参考にしたサイトを記載します。

WebhookでPOSTの処理を受けた時のコードの書き方メモ

javascriptで処理を作る場合

workers.js

// 処理を待つための関数
async function sleep(duration) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve(`I slept for ${duration} ms.`);
		}, duration);
	});
}

// Misskeyサーバーに投稿するためのPOST処理
async function post_to_misskey_server(msg, token, misskeyServer) {

  // 処理を実行した後に10秒間待つ
  // await new Promise(s => setTimeout(s, 10000));
  // const message = await sleep(5000);
    
  // 送信用のデータを構築する
  const data = {"i": token, "text": msg};

  // MisskeyサーバーのURL
  const URL = `https://${misskeyServer}/api/notes/create`;
  
  // 投稿処理
  const res = await fetch(URL, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify(data)
  }).then((res) => res.ok);

  console.log(res);

  return res;
}

export default {
  async fetch(request, env) {
    // 任意の認証されたWebhookからの処理だけを実行する
    if (request.headers.get('X-Misskey-Hook-Secret') !== env.SECRET) {
      console.log('wrong secret');
      return new Response('wrong secret');
    }

    const reqBody = await request.text();
    if (!reqBody) {
      console.log('no body');
      return new Response('no body');
    }

    const body = JSON.parse(reqBody);

    if (body.type !== 'note') {
      console.log('not note');
      return new Response('not note');
    }

    const note = body.body.note;
    const user = note.user;
    const username = user.host ? `${user.username}@${user.host}` : user.username;

    // 実行確認用
    let ok;
    let msg;
    let token;

    // おはよーの挨拶の処理
    if (note.text.indexOf('ohayo') !== -1) {
      
      // Misskey.io(あいんず)への投稿処理
      msg = '【動作確認用】おはよう';
      token = env.MISSKEY_TOKEN_PH1_AINS;
      ok = await post_to_misskey_server(msg, token, 'ph1.ains-no-misskey.com');
      console.log(ok);

    // おやすみなさいの挨拶の処理
    } else if (note.text.indexOf('oyasumi') !== -1) {
      
      // Misskey.ioへの投稿処理
      msg = '【動作確認用】おやすみ';
      token = env.MISSKEY_TOKEN_PH1_AINS;
      ok = await post_to_misskey_server(msg, token, 'ph1.ains-no-misskey.com');
      console.log(ok);

    } else {
      // 何もしない処理
      console.log(ok);
    }

    // デバック用の処理
    // const test = await fetch(env.DISCORD, {
    //   method: 'POST',
    //   headers: { 'Content-Type': 'application/json' },
    //   body: JSON.stringify({
    //     content: `User: ${username}\nMessage: ${note.text}\nNoteURL: https://ph1.ains-no-misskey.com/notes/${note.id}`,
    //   }),
    // }).then((res) => res.ok);

    // console.log(test);

    return new Response(ok ? 'ok' : 'error');
  },
};

typescriptで処理を作る場合

時間がある時に記載する

参考

何を参照したのか忘れたので時間がある時に更新する