エンジニアリングTips

【GAS×Twitter】ツイートの自動化(Twitter API v2)

概要

Twitter APIは2023年2月2日に料金プランの変更を行いました。それに伴いTwitter API v1.1からv2への移行を勧めています。(詳しくは以下記事参照)

Twitter有料化

それでもTwitterへの自動化を行いたい方はいるかと思いますが、ざっと調べてみるとGASからTwitter API v2を利用して、ツイートする記述記事がなかったのです。。そこで、誰かの助けになるかと思い、GASからTwitter API v2を利用して、ツイートを行う方法を公開します!

アカウント登録

まずはTwitter Developer Platformへ登録を行いましょう!
アカウント作成については以下記事が参考になるかと思います。

Developer Accountの登録

ツイート自動化コード

アカウント作成までできたら、実際にツイートを自動化するGASのコードをシェアします!
GASってどうやって始めるのって方は、以下記事が参考になるかと!

また、ツイートを行うための認証処理については以下Twitterドキュメント2つを参考に実装しました。

認証リクエスト

認証署名の作成

const CONSUMER_KEY = '<API Key(Consumer Keys)>'; // 自身のAPI Keyを入力
const CONSUMER_SECRET = '<API Secret(Consumer Keys)>'; // 自身のAPI Secretを入力
const ACCESS_TOKEN = '<Access Token(Authentication Tokens)>'; // 自身のAccess Keyを入力
const ACCESS_SECRET = '<Access Secret(Authentication Tokens)>'; // 自身のAccess Secretを入力
const END_POINT = 'https://api.twitter.com/2/tweets';

function tweet(text = 'Hello World!') {
  // アプリケーションが一意のリクエストごとに生成する必要がある一意のトークン生成
  const oauth_nonce = generateRandomStr(42);
  // タイムスタンプ生成
  const timestamp = getTimeStamp();

  // 署名生成
  let parameters = [];
  parameters.push('POST');
  parameters.push(encodeRFC3986(END_POINT));
  parameters.push(encodeRFC3986(`oauth_consumer_key=${CONSUMER_KEY}&oauth_nonce=${oauth_nonce}&oauth_signature_method=HMAC-SHA1&oauth_timestamp=${timestamp}&oauth_token=${ACCESS_TOKEN}&oauth_version=1.0`));

  // 署名ベース文字列生成
  const signatureBaseString = parameters.join('&');
  // 署名キー生成
  const signingKey = `${CONSUMER_SECRET}&${ACCESS_SECRET}`;
  // 署名生成
  let signeture = convertToHMmacSHA1(signatureBaseString, signingKey);
  signeture = encodeRFC3986(signeture);

  const options = {
    "method": "POST",
    "contentType": "application/json",
    "headers": {
      "Authorization": `OAuth oauth_consumer_key="${CONSUMER_KEY}", oauth_nonce="${oauth_nonce}", oauth_signature="${signeture}", oauth_signature_method="HMAC-SHA1", oauth_timestamp="${timestamp}", oauth_token="${ACCESS_TOKEN}", oauth_version="1.0"`
    },
    "payload": JSON.stringify({
      "text": text
    }),
    'muteHttpExceptions': true,
  };
  const response = JSON.parse(UrlFetchApp.fetch(END_POINT, options));
  console.log(response);
}

function getTimeStamp() {
  const now = new Date();
  const formatNow = Utilities.formatDate(now, 'GMT', 'dd MMM yyyy HH:mm:ss z');
  const unixTime = Date.parse(formatNow) / 1000;
  return unixTime.toFixed();
}

// HMAC SHA 1ハッシュ化&Base64エンコード
function convertToHMmacSHA1(text, signingKey) {
  const rowHash = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_1, text, signingKey);
  return Utilities.base64Encode(rowHash);
};

// パーセントエンコード化(RFC3986)
function encodeRFC3986(text) {
  let encodedText = encodeURIComponent(text);
  const encoders = {
    '!': '%21',
    "'": '%27',
    '(': '%28',
    ')': '%29',
    '*': '%2A'
  }
  for (let key in encoders) {
    encodedText = encodedText.replaceAll(key, encoders[key]);
  }
  return encodedText;
}

function generateRandomStr(l = 0) {
  // 生成する文字列に含める文字セット
  var c = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

  var cl = c.length;
  var r = "";
  for (var i = 0; i < l; i++) {
    r += c[Math.floor(Math.random() * cl)];
  }
  return r;
}

APIキー、アクセスキー生成

上記コードの中で必要な、API KeyとAccess Keyを取得する手順を以下に解説します!
まずは開発者ポータルから自身のアプリケーションを選択して、「User authentication settings」を確認し、Editボタンを押してください!(実際の画面と若干異なっているかもしれません!)

編集画面に飛んだら、以下の通り設定します!

1.「App permissions」をRead and writeに設定

2.「Type of App」を「Web App, Automated App or Bot」に設定
3.「App info」の「Callback URI」/「Website URL」を「https://sample.com」に設定(※本設定は使用しないのですが、必須項目である為何かしらURLを入力する必要があります。)

入力が完了したら、saveボタンで保存しましょう!

画面上のタブから「Keys and tokens」を選択し、以下「API Key and Secert」と「Access Token and Secret」を作成してください!
作成時にKey/TokenとSecret情報の画面が表示されるので、そちらをコピーして先ほどのコードの当該箇所に貼り付けてください!

以上でコードを実行する準備は整いました!

コード実行

では実際に実行してみましょう!
GASの画面から実行する関数を「tweet」に設定し、▶︎実行ボタンを押してください!

そうすると、実際に「Hello World!」が表示されたかと思います!
あとは自由に上記コードのtweet関数の引数:textの値を呟きたい内容に変えていただければと思います!

まとめ

今回、GASでTwitter API v2を利用して、実際に呟く方法をシェアしました!これで自動化につながりますね!
本記事が少しでもどなたかの役立に立てればと思います!

ツイートAPIについて、もっと詳しく知りたい方は以下参照です!

ツイートAPI詳細

-エンジニアリングTips
-, ,