Zenn
Open4

エゴサした内容をSlack Workflowで通知させるbotを作る

tsumichantsumichan

ChatGPTにこんな感じのコードを生成してもらった
動きそうに見えるけど、検索の部分はうまくいってないみたい

const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/triggers/xxxxxxx/1111111111/xxxxxxxxxxxx';

function checkTweets() {
  const endpoint = 'https://api.twitter.com/2/tweets/search/recent';
  const query = {
    query: 'テスト',
    max_results: 10,
  };
  
  const options = {
    method: 'GET',
    headers: {
      Authorization: `Bearer ${TWITTER_ACCESS_TOKEN}`,
    },
    muteHttpExceptions: true,
  };
  
  const response = UrlFetchApp.fetch(`${endpoint}?${new URLSearchParams(query)}`, options);
  const tweets = JSON.parse(response.getContentText()).data || [];
  
  tweets.forEach(tweet => {
    sendToSlack(tweet.text, tweet.author_id);
  });
}

function sendToSlack(text){
  var payload = {
    'text' : text,
  };

  var params = {
    'method' : 'post',
    'payload' : JSON.stringify(payload)
  };
  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, params);
}
tsumichantsumichan

最終的にこれで動かした。
これだと過去7日分を検索する感じになるので、
1日分を毎日検索できるように改善する予定

const BEARER_TOKEN = 'xxxxxxxxxxxxxxx'
const SLACK_WEBHOOK_URL = 'https://hooks.slack.com/triggers/xxxxxxxxxxxxxx';

function searchAndNotify() {
  var searchQuery = "テスト";
  var twitterApiUrl = "https://api.twitter.com/2/tweets/search/recent?query=" + encodeURIComponent(searchQuery) + "&max_results=10";

  var options = {
    'method': 'get',
    'headers': {
      'Authorization': 'Bearer ' + BEARER_TOKEN,
    },
    "muteHttpExceptions" : true
  };

  try {
    var response = UrlFetchApp.fetch(twitterApiUrl, options);
    var json = JSON.parse(response.getContentText());

    if (json.data && json.data.length > 0) {
      json.data.forEach(function(tweet) {
        var tweetId = tweet.id;
        var tweetUser = tweet.author_id;
        var tweetUrl = "https://x.com/" + tweetUser + "/status/" + tweetId;

        // 個別のツイートURLをSlackに送信する
        sendToSlack("検索ワード : " + searchQuery + "\n" + tweetUrl);
      });
    } else {
      sendToSlack("検索ワード : " + searchQuery + "\n検索結果はありませんでした。");
    }
  } catch (error) {
    sendToSlack("APIリクエストでエラーが発生しました: " + error.toString());

  }
}

function sendToSlack(message) {
  var payload = {
    'text': message,
  };
  
  var params = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };

  UrlFetchApp.fetch(SLACK_WEBHOOK_URL, params);
}
ログインするとコメントできます