見出し画像

GASでWordPressやnoteの記事をランダムで自動ツイートする

【重要】
TwitterはXに変更され、API仕様も変わりました。
自動ツイートの内容は、Twitter時代のもので、最新版には対応していません。
↓↓↓

GASを利用して、WordPressやnoteの記事をランダムで抽出して、Twitterで自動ツイートする方法を紹介します。

下記のようなツイートをGASから行います。


GASからTwitterのAPIを使ってツイートできるようにする

まず準備として、GASからTwitterのAPIを使って、ツイートできるようにします。
以下にまとめていますので、ご覧ください。

TwitterのAPIを使用してツイートする処理をライブラリ化する

上記に記載した、TwitterのAPIを使用してツイートする処理は、そのまま使用しても良いのですが、他でも使えるようにするためにライブラリ化してみたいと思います。

以下のようなクラスを作成しました。

class TwitterClient {
 constructor(consumerKey, consumerSecret, clientName) {
   this.consumerKey = consumerKey;
   this.consumerSecret = consumerSecret;
   this.scriptId = ScriptApp.getScriptId();
   this.clientId = this.scriptId + clientName;
   this.oauth = this._getOAuthService();
 }
 
 authorize() {
   if (this.oauth.hasAccess()) {
     Logger.log('既に認証されています');
   } else {      
     let authorizationUrl = this.oauth.authorize();
     Logger.log('以下のURLからログインを行ってください');
     Logger.log(authorizationUrl);
   }
 }
 
 authCallback(request) {
   let isAuthorized = this.oauth.handleCallback(request);
   let mimeType     = ContentService.MimeType.JSON;
   let result = {
     message: isAuthorized ? '認証に成功しました。このタブは閉じてください。' : '認証に失敗しました。',
   }
   return ContentService.createTextOutput(JSON.stringify(result)).setMimeType(mimeType);
 }
 
 getCallbackUrl() {
   return OAuth1.getCallbackUrl(this.scriptId);
 }
 
 reset() {
   this.oauth.reset();
   Logger.log('認証を解除しました');
 }
 
 postTweet(message) {
   let params = { 
     status: message
   }
   let result = this.postRequest('https://api.twitter.com/1.1/statuses/update.json', params)
   return result
 }
 
 _getOAuthService() {
   return OAuth1.createService(this.clientId)
     .setAccessTokenUrl('https://api.twitter.com/oauth/access_token')
     .setRequestTokenUrl('https://api.twitter.com/oauth/request_token')
     .setAuthorizationUrl('https://api.twitter.com/oauth/authorize')
     .setConsumerKey(this.consumerKey)
     .setConsumerSecret(this.consumerSecret)
     .setCallbackFunction('authCallback')
     .setPropertyStore(PropertiesService.getUserProperties());
 }
}

const clientList = {}

function getInstance(consumerKey, consumerSecret, clientName = '') {
 const client = new TwitterClient(consumerKey, consumerSecret, clientName);
 clientList[client.oauth.serviceName_] = client
 return client
}

function getClientList() {
 return clientList
}

ライブラリを使用するコード

続いて、上記のライブラリを使用するコードです。

'use strict';

const consumerKey = '[ここにAPIキーを入れる]'
const consumerSecret = '[ここにAPI secret キーを入れる]'
const accountName = '[ここにアカウント名を入れる]'

const client = TwitterClient.getInstance(consumerKey, consumerSecret, accountName)

function authorize() {
 client.authorize()
}

function reset() {
 client.reset()
}

function authCallback(request) {
 return client.authCallback(request)
}

Twitterアプリを作成して、キーを設定します。

ランダムでツイートするコード

最後にランダムでツイートするコードです。

function recommendedTweet() {
 let sheetArticleList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('記事一覧');

 let row = random();

 let data = sheetArticleList.getRange(row, 1, 1, sheetArticleList.getLastColumn()).getValues()[0];
 if (data[0] == "") {
   Logger.log("データが取得できない。行数:" + row);
   return;
 }

 let url = data[0];
 let title = data[1];

 let word = "【" + Utilities.formatDate(new Date(), 'JST', 'yyyy/M/d') + "のおすすめ記事】";
 word += "\n";
 word += "\n" + title;
 word += "\n" + url;
 
 Logger.log(word);
 client.postTweet(word);
}

function random() {
 let sheetArticleList = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('記事一覧');

 let lastRow = sheetArticleList.getRange('A:A').getValues().filter(String).length;
 let row = Math.ceil(Math.random() * (lastRow-1)) + 1;
 return row;
}

対象の記事は以下のように「記事一覧」というシート名で作っています。

画像1

このシートはWordPressやnoteの記事をGASで取得して作っています。
詳しくは以下をご覧ください。

記事の一覧から対象をランダムで抽出しています。
抽出したタイトルとURLからツイートする文字列を作成して、ライブラリを呼び出してツイートする、という感じです。

TwitterのAPIは、同じ文字列をツイートするとエラーになってしまうため、日付を入れて文字列が同じにならないようにしています。

あとは、この関数をGASで定期実行するようにすれば、毎日ランダムで記事をツイートすることができます。

いいなと思ったら応援しよう!