こんにちわ、ゆはです。
今回は前回の記事の続きです。
TwitterAPIがversion2が出ていて、使い方が変わっていたことがあり結構苦戦しました。。
一応完成したので、BOTが完成するまでの過程を書きますね。
前回のおさらい
作成したいBOTはこんな感じです。
- 1時間に1回「#splatoon3」のツイートを検索
- もっとも「いいね」が多いツイートをリツイート
前回の記事は準備編で、TwitterDeveloperの設定とTwitterAPIを使ってテストツイートするところまでをやりました。まだ準備できていない方は是非以下記事を参考にしてください。
今回はGoogleAppScriptで実際にプログラムを書いてBOTが完成するところまでやります。
GoogleAppScriptにコードを記載
早速ですが、完成したコードを載せますので、基本コピーすれば同じようなものが作れます。
前回作成したGoogleAppScriptの内容を以下に書き換えてください。
コード汚いのはご容赦ください。。。
const min_faves='50'; //最低いいねの数
const user_id='XXXXXXX'; //自分のユーザID
const bearer_token='XXXXXXX'; //自分のbearer_token
// APIコール時のオプション(POST)
const post_option = {
method: 'post',
contentType: 'application/json',
muteHttpExceptions: true,
headers: { Authorization: 'Bearer ' + bearer_token },
}
//認証用インスタンスの生成
let twitter = TwitterWebService.getInstance(
'XXXXXXX',//API Key
'XXXXXXX'//API secret key
);
//アプリを連携認証する
function authorize() {
twitter.authorize();
}
//認証を解除する
function reset() {
twitter.reset();
}
//認証後のコールバック
function authCallback(request) {
return twitter.authCallback(request);
}
// ツイートを投稿
function postTweet() {
let service = twitter.getService();
let endPointUrl = 'https://api.twitter.com/2/tweets';
let message = {
text : "test",
}
let options = {
"method": 'post',
"muteHttpExceptions" : true,
'contentType': 'application/json',
//messageをJSONの形式に変換。投稿に必須
'payload': JSON.stringify(message),
}
let response = JSON.parse(service.fetch(endPointUrl, options));
}
// メイン処理
function main() {
let searchResult = fetchPopularTweetList();
let statuses = searchResult.statuses;
if(statuses.length!=0){
let tweet_id = filterMostTweet(statuses);
putRetweet(tweet_id);
}
}
// ツイートを検索
function fetchPopularTweetList() {
let date = new Date();
let until = Utilities.formatDate(date, "Asia/Tokyo", "yyyy-MM-dd_HH:00:00")+"_JST";
date.setHours(date.getHours()-1);
let since = Utilities.formatDate(date, "Asia/Tokyo", "yyyy-MM-dd_HH:00:00")+"_JST";
let keyword = "#Splatoon3 min_faves:" +min_faves+ " exclude:retweets filter:videos since:"+since+" until:"+until
console.log(keyword);
let service = twitter.getService();
let url = 'https://api.twitter.com/1.1/search/tweets.json?q=' + encodeURIComponent(keyword) + '&count=100';
let response = service.fetch(url);
let result = JSON.parse(response.getContentText());
console.log(result);
return result;
}
//もっとも「いいね」が多いツイートをフィルタしてIDを返却
function filterMostTweet(statuses) {
let max_favorite_count=0;
let id_str;
statuses.forEach(function(status){
if(max_favorite_count<status.favorite_count){
max_favorite_count = status.favorite_count;
id_str = status.id_str;
}
});
return id_str;
}
//指定したIDのツイートをリツイートする
function putRetweet(tweet_id)
{
let service = twitter.getService();
targetTweet = { 'tweet_id': tweet_id }
post_option.payload = JSON.stringify(targetTweet)
service.fetch('https://api.twitter.com/2/users/' + user_id + '/retweets', post_option);
}
変更する箇所
赤い文字は自分のBOTの値に変更してください。
user_id
自分のTwitterアカウントのユーザIDです。Twitter上のどこから入手できるのかわかりませんでした。。。
twitteridといったサービスがあり、こちらでアカウント名をいれることでIDがわかります。
bearer_token
前回記事で設定した値を入力してください。
API Key
前回記事で設定した値を入力してください。
API secret key
前回記事で設定した値を入力してください。
ざっくり解説
main()
今回動かすメイン処理です。
fetchPopularTweetList()でいいねが多いツイートを検索して、
filterMostTweet(statuses)で一番いいねが多いツイートをフィルタして、
putRetweet(tweet_id)でリツイートします。
fetchPopularTweetList()
いいねが多いツイートを検索します。
期間を1時間にして、最低いいねの閾値を50にしています。閾値の値は今後要調整かなと思います。
そして、ここだけversion1.1のAPIを利用しています。。。version2のsearchAPIをリファレンスを確認しても最低いいねの閾値を指定することができなさそう。。。
version1.1だとクエリパラメータの中に指定することで検索クエリが使えるそうです。以下記事を参考にさせていただきました。
filterMostTweet(statuses)
取得したツイートのリストから一番いいねが多いツイートIDを特定しています。
putRetweet(tweet_id)
指定したツイートをリツイートします。
毎時実行する
GoogleAppScriptで毎時でMainの処理を実行するよいうに設定します。
毎時何分といった指定ができないので、0分から59分までのどこかで実行されるみたいですね。
0分に実行されると1分前にツイートされたツイートがリツイートされる前に集計対象に入ってしまうのがイマイチ。。時間指定までできればいいんだけど。。
GoogleAppScriptで実行タイミングの指定をする方法です。
左のメニューの目覚ましアイコンを押して、新しいトリガーを作成します。
設定項目は以下の画像を参考にしてください。
これで設定完了です。
あとは一時間おきに実行されるのを待ちましょう。
うまく実行されると最後の実行日時が表示されます。
BOTもうまくリツイートされていますね。
こんな感じで簡単にBOTを作成することができます。
以上、最後までお読みいただきありがとうございました。少しでも参考になれば幸いです。
2つ以上のBOTを作るときは少し手を加える必要があります。