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

# その名はTwitter.gs
[GitHubリポジトリはこちら](https://github.com/arashi-yama/Twittergs)です。
本記事ではTwitter.gsのセットアップと少し動かす程度しかやりません。
詳しい説明はリポジトリの[README](https://github.com/arashi-yama/Twittergs/blob/main/README.md)や[descriptions](https://github.com/arashi-yama/Twittergs/tree/main/descriptions)を参照してください。

# サンプル
Twitter.gsがどのようなライブラリか知って頂くために最初にサンプルを提示します。
```js
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](https://github.com/arashi-yama/Twittergs/blob/main/sample/sample.js)にはより実用的なサンプルが乗っています。(ツリー投稿など)
# セットアップ
使用する前にそれなりにやることがあります。

## GAS側
最初に[Google Apps Script](https://script.google.com/home)から新しいプロジェクトを作成します。

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

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

その後、[GitHubリポジトリ](https://github.com/arashi-yama/Twittergs)の[dist/twittergs.js](https://github.com/arashi-yama/Twittergs/blob/main/dist/twittergs.js)の内容を`twitter.gs`に、[dist/starter.js](https://github.com/arashi-yama/Twittergs/blob/main/dist/starter.js)の内容を`setup.gs`に貼り付けてください。

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

## Appの作成、設定
Twitter.gsはOAuth1、OAuth2両方に対応しているので両方有効にします。

1.[Twitter Developer Potal](https://developer.twitter.com/en/portal/projects-and-apps)にアクセスします
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.gs`の`setEnv`関数に適切にキーを入力してから実行してください。
```js
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を使用してください。
```js
const client=new Client({
  name:"@auto",
  oauthVersion:"1.0a"
})
Logger.log(client.authorize())
```
認証されたアカウントのユーザーネーム(@で始まる方)で後ほどその認証情報にアクセスできます。

例えば、[@arash1yama](https://twitter.com/arash1yama)を認証したらその後は以下のようにしてTwitterAPIを使用できます。

```js
const client=new Client({
  name:"arash1yama",
  oauthVersion:"1.0a"
})
```
また、`name`を指定して認証することもできます。
```js
const client=new Client({
  name:"master",
  oauthVersion:"1.0a"
})
Logger.log(client.authorize())
```
この様にして取得された認証情報は以後`name`に`master`と入力すれば取得できます。

# Twittergsを使う
詳しい説明は[Twittergs/descriptions](https://github.com/arashi-yama/Twittergs/tree/main/descriptions)フォルダを参照してください。
ここでは簡単に説明します。

TwittergsはTwitterAPIを叩く前に自動的にUtilities.sleepをします。
その時間は[Client](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/Client.md)インスタンス作成時の`restTime`で設定できます。
デフォルトは1000になっています。
```js
const client=new Client({
  name:"sample",
  oauthVersion:"1.0a",
  restTime:1500
})
//関数も指定できる
const client=new Client({
  name:"sample",
  oauthVersion:"1.0a",
  restTime:()=>Math.random()*10000
})
```
## ツイートする
```js
const tweet=client.postTweet({
  text:"A tweet by Twittergs"
})
Logger.log(tweet)
```
これだけ
### 結果
```
{id=1546104008703479808, text=A tweet by Twittergs}
```
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">A tweet by Twittergs</p>&mdash; arashiyama (@arash1yama) <a href="https://twitter.com/arash1yama/status/1546104008703479808?ref_src=twsrc%5Etfw">July 10, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

postTweetの返り値は[ClientTweet](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/ClientTweet.md)なので[ClientTweet](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/ClientTweet.md),[Tweet](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/Tweet.md)のインスタンスメゾットが使用できます。
```js
const tweet=client.postTweet({
  text:"A tweet by Twittergs"
})
tweet.like()
tweet.retweet()
tweet.reply({
  text:""
})
tweet.delete()
```

## 検索
ツイートを検索するsearchTweetsとユーザーを検索するsearchUsersの二つがあります。
### searchTweets
```js
const tweets=client.searchTweets({q:"Qiita"})
Logger.log(tweets)
Logger.log(tweets.subData)
```
#### 結果
```js
[<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](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/Tweet.md)インスタンスの一次配列です。
なので先ほどと同様に[Tweet](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/Tweet.md)クラスのインスタンスメゾットが使用できます。

例
```js
tweets.forEach(twt=>twt.retweet())
```

### searchUsers
```js
const users=client.searchUsers({q:"Qiita"})
Logger.log(users)
```
#### 結果
```js
[<User>,<User>...]
```
返り値は[User](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/User.md)クラスのインスタンスの一次配列なのでUserクラスのインスタンスメゾットが使用できます。
```js
users[0].follow()
users[0].getAllFollowings()
users.map(user=>user.getAllFollowers())
```


# 終わりに
この記事で紹介したのはTwittergsのほんの一部です。
よりこのライブラリを活用するために[Twittergs](https://github.com/arashi-yama/Twittergs)の[README](https://github.com/arashi-yama/Twittergs/blob/main/README.md)と[descriptions](https://github.com/arashi-yama/Twittergs/tree/main/descriptions)フォルダ下の
- [Client.md](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/Client.md)
- [AppOnlyClinet.md](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/AppOnlyClient.md)
- [Tweet.md](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/Tweet.md)
- [ClinetTweet.md](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/ClientTweet.md)
- [User.md](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/User.md)
- [ClinetUser.md](https://github.com/arashi-yama/Twittergs/blob/main/descriptions/ClientUser.md)
を参照したいただけたらと思います。