【GAS】初心者のためのtwitterAPIと連携し自動投稿する(2023年7月)
- twitter API との連携の仕方がわからない
- コードだけじゃなくて、手順をわかりやすく教えてもらいたい!
- 最新版に対応した手順を聞きたい
twitter への自動投稿は、作業の自動化をする時にあったらとても便利になりますよね。
ただ、実際 twitter API との連携は、そこまで難しい作業ではありません。
私自身、1日あれば、twitterに自動投稿するコードを実装することができました。
なので、ぜひこれから自動投稿を実装したいと考えているならば、こちらの記事で、実装してほしいと思います!!
twitterに自動投稿ができるようになる!
目次(クリックで読みたい部分にジャンプできます)
【準備編】実装するために、準備すること
実装のために、まずは以下の4つの準備が必要です。
- twitter API 側の準備
- クライアントID、クライアントシークレットの取得
- コードのコピペ
- OAuth ライブラリ のインストール
それぞれ順番に解説していきます!
twitter API 側の準備
twitter API を準備します。
- twitterで自動投稿を行いたいアカウントでログインする。
- まず、あなたが、自動投稿を行いたいアカウントをtwitter上でログインしましょう。
API の設定ページとtwitterは同じアカウントになるよう紐付けられているためです。
- twitter API 「開発者プラットフォーム」にアクセス!
- https://developer.twitter.com/ja/docs/twitter-api
- 開発者ポータルにアクセス
- Developer Portal 左側のメニューバーの、写真赤枠部分をクリック。
- 赤枠部分は、「Projects & Apps」をクリックすると出てきます。
- タブの「Setting」を選び、User authentication settings の中の、Editを選択
- App premissions 「Read and write」に設定。
Type of App 「Web App, Automated App or Bot 」に設定
App info のcallback URI / Redirect URL を記載(※下記参照)
webSite URL はなんでも良いです。(あなたのtwitterアカウントのURLなど)
callback URI / Redirect URLの作成方法
①まず、適当なGASを作成しましょう。
(このGASにコードなども書いていきます。)
②GASのURLをコピーします。
以下のような形式になっているはずです。
https://script.google.com/u/0/home/projects/<スクリプトID>/edit
③スクリプトIDの部分を、次のURLに当てはめてください。
https://script.google.com/macros/d/<スクリプトID>/usercallback
④作成完了。
- 「save」ボタンを押下します。
saveボタンを押した後、もしCLIENT ID と CLIENT SECRET が出てきたら、保存しておいてください!
クライアントID、クライアントシークレットの取得
先ほど、クライアントID、クライアントシークレットが出てきていたら、保存をしておいてください。
確認できなかった方は、「Keys and tokens」タブで取得することができます。
コードのコピペ
少し長いですが、以下のコードをまるっとGASにコピペしてください。
const CLIENT_ID = '<クライアントIDを記載>'
const CLIENT_SECRET = '<クライアントシークレットを記載>'
function main() {
const service = getService();
if (service.hasAccess()) {
Logger.log("Already authorized");
} else {
const authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s', authorizationUrl);
}
}
function getService() {
pkceChallengeVerifier();
const userProps = PropertiesService.getUserProperties();
const scriptProps = PropertiesService.getScriptProperties();
return OAuth2.createService('twitter')
.setAuthorizationBaseUrl('https://twitter.com/i/oauth2/authorize')
.setTokenUrl('https://api.twitter.com/2/oauth2/token?code_verifier=' + userProps.getProperty("code_verifier"))
.setClientId(CLIENT_ID)
.setClientSecret(CLIENT_SECRET)
.setCallbackFunction('authCallback')
.setPropertyStore(userProps)
.setScope('users.read tweet.read tweet.write offline.access')
.setParam('response_type', 'code')
.setParam('code_challenge_method', 'S256')
.setParam('code_challenge', userProps.getProperty("code_challenge"))
.setTokenHeaders({
'Authorization': 'Basic ' + Utilities.base64Encode(CLIENT_ID + ':' + CLIENT_SECRET),
'Content-Type': 'application/x-www-form-urlencoded'
})
}
function authCallback(request) {
const service = getService();
const authorized = service.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied.');
}
}
function pkceChallengeVerifier() {
var userProps = PropertiesService.getUserProperties();
if (!userProps.getProperty("code_verifier")) {
var verifier = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
for (var i = 0; i < 128; i++) {
verifier += possible.charAt(Math.floor(Math.random() * possible.length));
}
var sha256Hash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, verifier)
var challenge = Utilities.base64Encode(sha256Hash)
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '')
userProps.setProperty("code_verifier", verifier)
userProps.setProperty("code_challenge", challenge)
}
}
function logRedirectUri() {
var service = getService();
Logger.log(service.getRedirectUri());
}
function sendTweet() {
var payload = {
"text": "テストツイーーーーーーート",
}
var service = getService();
if (service.hasAccess()) {
var url = `https://api.twitter.com/2/tweets`;
var response = UrlFetchApp.fetch(url, {
method: 'POST',
'contentType': 'application/json',
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
},
muteHttpExceptions: true,
payload: JSON.stringify(payload)
});
var result = JSON.parse(response.getContentText());
Logger.log(JSON.stringify(result, null, 2));
} else {
var authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s',authorizationUrl);
}
}
忘れずに!!
コピペしたら、先ほど、メモした「クライアントID」「クライアントシークレット」を先頭行の部分に記載しましょう!
OAuthライブラリをインストールします
GASのライブラリの追加部分「+」をクリックし、以下IDを記載し検索します。
ID
1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF
最新バージョンをインストールしておきましょう。
これで、準備は完了です!お疲れ様です。
早速実行していきましょう!!!
アクセス承認を得る
まだツイートすることはできません。
ツイートの前に、あなたのアカウントにAPIからツイートを行っていいか許可を与える必要があります。
そのために、以下手順を行います。
- GASで「main」関数を実行
- すると、実行ログの部分で、「Open the following URL and re-run the script:」の後に長いURLが出ていると思います。
- URLを新しいタブに貼り付けてアクセス。
- すると、「許可を与えますか?」のような確認画面が出るので、許可を押してあげてください。
- 「Success」と表示されれば、OK!
これで、権限の付与も完了です!GASから実際にツイートできるようになりました!!
実際にツイートしてみよう!
では、実際にGASの関数を動かして、ツイートを行ってみます。
「sendtweet」関数を実行してみましょう。
レスポンスにエラーが返ってきてなければ、完成です。
実際にTwitterでツイートができているか確認してみてください!
まとめ
今回は、ツイッターの自動投稿をGASで実装する方法を解説しました。
これらを使って、ツイッターをより活用していってください!
ではまた!
参考にさせていただきました。
Google Apps ScriptでTwitterに投稿するスクリプト(GAS×TwitterBot④)