🐕

【GAS】TwitterAPIを超簡単に使えるライブラリ

2022/08/20に公開

その名はTwitter.gs

GitHubリポジトリはこちらです。
本記事ではTwitter.gsのセットアップと少し動かす程度しかやりません。
詳しい説明はリポジトリのREADMEdescriptionsを参照してください。

サンプル

Twitter.gsがどのようなライブラリか知って頂くために最初にサンプルを提示します。

const client=new Client({
  name:"sample",
  oauthVersion:"1.0a"
})
//ツイートする
client.postTweet({text:"demo"})

//自身のタイムラインを取得する
client.user.getTimeLine()
client.user.getTimeLine({
  max_results:100,
  expansions:["referenced_tweets.id"],
  "tweet.fields":["created_at"]
})

//ツイートの検索
const tweets=client.searchTweets({q:"demo"})

//ツイートをリツイート
tweets[0].retweet()

//ツイートの著者をフォロー
tweets[1].author.follow()

//ユーザーを取得してそのフォロワーのフォローしているユーザーをフォローする
client.getUserByUsername("sample").getFollowers()[0].getFollowingUsers()[0].follow()

Twittergs/sampleにはより実用的なサンプルが乗っています。(ツリー投稿など)

セットアップ

使用する前にそれなりにやることがあります。

GAS側

最初にGoogle Apps Scriptから新しいプロジェクトを作成します。

単純にライブラリとして使用した場合のエディタの入力補完が弱すぎるのでTwittergsはライブラリのコードを貼り付けて使用します。

なのでtwitter.gssetup.gsファイルを先に追加しておいてください。

その後、GitHubリポジトリdist/twittergs.jsの内容をtwitter.gsに、dist/starter.jsの内容をsetup.gsに貼り付けてください。

その後setup.gsgetCallBackURLを実行してください。
ログに出力されたURLを後ほど使うのでコピーしておいてください。

Appの作成、設定

Twitter.gsはOAuth1、OAuth2両方に対応しているので両方有効にします。

1.Twitter Developer Potalにアクセスします
2.+Add Appを選択します。
3.Create Newをクリック
4.App Envioromentはどれでもいいです。
5.App Nameに適当に入力
6.API Key,API Key Secret ,Bearer Tokenをメモ帳等で保存
7.App Settingをクリック
8.下にスクロールしてSet Upをクリック
9.OAuth2.0のトグルをクリック
10.OAuth1.0aのトグルをクリック
11.Type of AppはWeb App
12.App PermissionsをRead and write and Direct messageにする
14.CallbackURI/Redirect URLに先程出力したURLを貼り付ける
15.Website URLを適当に入力
16.Saveボタンをクリック

以上です。

認証

認証をする前に環境変数にキーを登録してください。
setup.gssetEnv関数に適切にキーを入力してから実行してください。

function setEnv(){
  PropertiesService.getUserProperties().setProperties({
    CLIENT_ID:"ab...",
    CLIENT_SECRET:"c3...",
    API_KEY:"8f...",
    API_SECRET:"op...",
    BEARER_TOKEN:"gf..."
  })
}

環境変数の登録が終了したら、setup.gsのauthorize関数を実行します。
認証URLがログに出力されます。
デフォルトではOAuth1.0aで認証されます。
2.0で認証するメリットはあまりないので基本的に1.0aを使用してください。

const client=new Client({
  name:"@auto",
  oauthVersion:"1.0a"
})
Logger.log(client.authorize())

認証されたアカウントのユーザーネーム(@で始まる方)で後ほどその認証情報にアクセスできます。

例えば、@arash1yamaを認証したらその後は以下のようにしてTwitterAPIを使用できます。

const client=new Client({
  name:"arash1yama",
  oauthVersion:"1.0a"
})

また、nameを指定して認証することもできます。

const client=new Client({
  name:"master",
  oauthVersion:"1.0a"
})
Logger.log(client.authorize())

この様にして取得された認証情報は以後namemasterと入力すれば取得できます。

Twittergsを使う

詳しい説明はTwittergs/descriptionsフォルダを参照してください。
ここでは簡単に説明します。

TwittergsはTwitterAPIを叩く前に自動的にUtilities.sleepをします。
その時間はClientインスタンス作成時のrestTimeで設定できます。
デフォルトは1000になっています。

const client=new Client({
  name:"sample",
  oauthVersion:"1.0a",
  restTime:1500
})
//関数も指定できる
const client=new Client({
  name:"sample",
  oauthVersion:"1.0a",
  restTime:()=>Math.random()*10000
})

ツイートする

const tweet=client.postTweet({
  text:"A tweet by Twittergs"
})
Logger.log(tweet)

これだけ

結果

{id=1546104008703479808, text=A tweet by Twittergs}

postTweetの返り値はClientTweetなのでClientTweet,Tweetのインスタンスメゾットが使用できます。

const tweet=client.postTweet({
  text:"A tweet by Twittergs"
})
tweet.like()
tweet.retweet()
tweet.reply({
  text:""
})
tweet.delete()

検索

ツイートを検索するsearchTweetsとユーザーを検索するsearchUsersの二つがあります。

searchTweets

const tweets=client.searchTweets({q:"Qiita"})
Logger.log(tweets)
Logger.log(tweets.subData)

結果

[<Tweet>,<Tweet>,...]
{search_metadata={count=15.0, completed_in=0.083, max_id_str=1544271699612680193, query=Qiita, since_id=0.0, max_id=1.54427169961268019E18, since_id_str=0, next_results=?max_id=1544269479307137024&q=Qiita&include_entities=1, refresh_url=?since_id=1544271699612680193&q=Qiita&include_entities=1}}

長すぎるので省略しましたが、返り値はTweetインスタンスの一次配列です。
なので先ほどと同様にTweetクラスのインスタンスメゾットが使用できます。

tweets.forEach(twt=>twt.retweet())

searchUsers

const users=client.searchUsers({q:"Qiita"})
Logger.log(users)

結果

[<User>,<User>...]

返り値はUserクラスのインスタンスの一次配列なのでUserクラスのインスタンスメゾットが使用できます。

users[0].follow()
users[0].getAllFollowings()
users.map(user=>user.getAllFollowers())

終わりに

この記事で紹介したのはTwittergsのほんの一部です。
よりこのライブラリを活用するためにTwittergsREADMEdescriptionsフォルダ下の

Discussion