見出し画像

blueskyとGASとスプレッドシートで定期自動投稿botを設定する方法

表題の通り、blueskyで定期自動投稿を設定する方法の紹介です。
スプレッドシートからランダムにセルを選び、その文字列を取得してblueskyに投稿するようにしています。
定期繰り返し設定はGASで行ってください。

以下がblueskyで定期自動投稿を設定する方法です。
(このサイトを参考にさせていただきました。)

function main() {
  const session = createSession(); // セッションを作成して保存
  if (session) {
    const msg = getRandomValueFromSpreadsheet(); // スプレッドシートからランダムな値を取得
    createRecord(msg, session); // ランダムな値を投稿する
  } else {
    console.error('Failed to create session');
  }
}

function getRandomValueFromSpreadsheet() {
  // ここにスプレッドシートからランダムに値を取得するコードを追加する
  // 以下は例として A 列からランダムに値を取得するコード
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet01');
  const lastRow = sheet.getLastRow();
  const randomRowIndex = Math.floor(Math.random() * lastRow) + 1;
  const randomValue = sheet.getRange("A" + randomRowIndex).getValue();
  console.log(randomValue);
  return randomValue;

}

// 以下は既存のコード
// https://www.docs.bsky.app/docs/api/com-atproto-server-create-session
function createSession() {
  const url = 'https://bsky.social/xrpc/com.atproto.server.createSession'

  const payload = {
    identifier: 'ここにアカウントIDを記入',
    password: 'ここにパスワードを記入',
  }

  const options = {
    method: 'post',
    headers: {
      'Content-Type': 'application/json; charset=UTF-8',
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true // HTTP エラーをミュート
  }

  try {
    const response = UrlFetchApp.fetch(url, options);
    return JSON.parse(response.getContentText());
  } catch (error) {
    console.error('Error creating session:', error);
    return null;
  }
}

// https://www.docs.bsky.app/docs/api/com-atproto-repo-create-record
function createRecord(msg, session) {
  if (!session || !session.handle || !session.accessJwt) {
    console.error('Invalid session');
    return;
  }

  const url = 'https://bsky.social/xrpc/com.atproto.repo.createRecord'

  const payload = {
    repo: session.handle, // セッションからハンドルを取得
    collection: 'app.bsky.feed.post',
    record: {
      text: msg,
      createdAt: new Date().toISOString(),
    },
  }

  const options = {
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
      Authorization: 'Bearer ' + session.accessJwt, // セッションからアクセストークンを取得
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true // HTTP エラーをミュート
  }

  try {
    const response = UrlFetchApp.fetch(url, options);
    console.log('Record created:', response.getContentText());
  } catch (error) {
    console.error('Error creating record:', error.message); // エラーメッセージをログに出力
  }
}

普段はXやblueskyで短歌を投稿しています。
ぜひ見てみてください。

この記事が気に入ったらサポートをしてみませんか?