注意 : 加筆修正したものを Zenn に投稿しています。
きっかけ
Twitterで 担当アイドル を検索してツイートを眺めるということをよくするのですが、
「いちいちTwitter開いて検索するのめんどくさい...」
「普段 Feedly (RSSリーダ) をよく開くのでここで見れたら最高なのでは??」
という気持ちになった結果
『Twitterの検索結果をRSSフィード化して、Feedlyで読めるようにしよう!』
と思ったのがきっかけです。
構成図的なもの
準備
1. TwitterAPIのBearer Tokenを取得
Twitterの投稿を検索するのに必要です。
取得方法については、公式ドキュメント をご参照ください。
2. ディレクトリを作成
mkdir gas-ego-search
cd gas-ego-search
3. claspをインストール
ブラウザからポチポチやっても良かったのですが、今回は clasp というGASのプロジェクトをローカルで管理できるCLIツールを利用しました。
npm もしくは yarn からインストールできます。
npm install -g @google/clasp
# or
yarn global add @google/clasp
インストールができたら、Google アカウントでログインしておきます。
clasp login
4. Google Apps Script API を有効化
claspを使用するには Google Apps Script API を有効化する必要があります。
GASの管理画面の左下にある「設定」を選択します。
Google Apps Script APIの項目を「オン」にします。
これで clasp が使えるようになりました!🎉
つくる!
1. プロジェクトを作成
早速 clasp を使ってプロジェクトを作成していきます。
clasp create gas-ego-search
? Create which script?
standalone
docs
❯ sheets # 今回はスプレッドシートを使いたいのでこれを選択
slides
forms
webapp
api
これで Enter を押すと、
? Create which script? sheets
Created new Google Sheet: https://drive.google.com/open?id=[ドキュメントID]
Created new Google Sheets Add-on script: https://script.google.com/d/[スクリプトID]/edit
Cloned 1 file.
└─ /path/to/gas-ego-search/appsscript.json
スプレッドシートとそれに紐づいたスクリプトが作成されます。
便利......
また、ここまでの操作でディレクトリ内は以下のようになります。
.
├── .clasp.json
└── appsscript.json
2. appsscript.json を編集
clasp create
した際についてくる、GAS の実行環境に関する設定ファイルです。
今回は以下のように編集しました。
詳しい構造については 公式のドキュメント をご覧ください。
{
// タイムゾーンを東京に変更
"timeZone": "Asia/Tokyo",
// Webアプリとしての公開設定
"webapp": {
"access": "ANYONE_ANONYMOUS",
"executeAs": "USER_DEPLOYING"
},
// 以降はそのまま
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
3. スプレッドシートを編集
Created new Google Sheet:
の後に続く URL にアクセスして、スプレッドシートを開きます。
以下にように、エゴサしたいアイドルを列挙して保存しておきます。
4. Bearer Token をプロパティに追加
Twitter の Bearer Token をハードコードしたくないので、プロパティに追加します。いわゆる環境変数です。
clasp open
でスクリプトエディタを開いて、上部メニューの「ファイル」から「プロジェクトのプロパティ」を選択します。1
「スクリプトのプロパティ」内にある「行を追加」から追加します。
ここでは twitterToken
という名前にしました。
5. コードを書く
このままコードを追加していっても良いのですが、rootDir
を変更して
{
"scriptId": "xxxxxxxxxxxxxxxxxxxx",
"rootDir": "./src", // ここを変更
"parentId": ["xxxxxxxxxxxxxxxxxxx"]
}
以下のようなディレクトリ構成にしました。
また、コードの見通しを良くするため、処理毎にファイルを分けました。
.
├── .clasp.json
└── /src
├── appsscript.json
├── createXML.js # 検索結果からRSS(XML)を作成するやつ
├── main.js # メインのやつ
├── sheets.js # スプレッドシートから検索ワードを読込むやつ
├── template.html # RSS(XML)のテンプレートファイル
└── twitter.js # Twitterで検索するやつ
(大した内容ではないのですが)簡単に全体の流れについて説明します。
// プロパティを読み込む
const config = PropertiesService.getScriptProperties().getProperties()
function doGet() {
// スプレッドシートから検索ワードを取得
const searchWords = getSearchWordsFromSS()
// ツイートを検索する
const results = fetchSearchResults(config.twitterToken, searchWords)
// 検索結果を整形する
const items = createOembedItems(results)
// テンプレートにデータを埋め込んで返す
return createXML(items)
}
doGet()
は公開したURLにアクセスがあった際に呼ばれる関数です。
ですので、アクセスがあったら
- スプレッドシートから検索ワード(エゴサするアイドル名)を読込む
- それぞれをTwitterで検索
- 検索結果から必要な情報を抽出して整形
- 検索結果をテンプレートファイルに埋め込む
- 生成したRSS(XML)を返す
という流れで処理が行われます。
また、短期間に大量にアクセスされるとAPIの上限に達してしまうという問題がありますが、今回使う Feedly は更新間隔が 1時間に1回程度 とのことなので考慮していません。(よくない)
詳しくは以下のリポジトリにコードがありますので、ご参照ください...!
push して反映します。
clasp push
? Manifest file has been updated. Do you want to push and overwrite? Yes
└─ src/appsscript.json
└─ src/createXML.js
└─ src/main.js
└─ src/sheets.js
└─ src/template.html
└─ src/twitter.js
Pushed 6 files.
6. Webアプリとして公開
clasp open
でスクリプトエディタを開きます。
「公開」から「ウェブアプリケーションとして導入」を選択します。
別ウィンドウが開くので画面に沿って使用するGoogleアカウントを選択します。
こんな感じの警告がでてきますが、自分が書いたスクリプトなので、左下の「詳細」から「(安全ではないページ)に移動」を選択して先に進みます。
Current web app URL:
以下に表示されているURLにアクセスすると...
ちゃんと動いてそうです!いえー
URL はこれから使用するのでコピーしておきます。
7. Feedlyに追加
Feedly を開いて、左のほうにある「+」を選択します。
先ほどコピーした URL を貼り付けて Enter を押すと...
FOLLOW ボタンを押してフィードを追加すれば完了です!
まとめ
見逃してしまっていた情報や、ファンアート、気になる考察などが見つかったりするので、とても重宝しています!
(担当のガシャが来ていて、自分が引けていないときは地獄の空間になりますが...)
また、最初はTypeScriptで開発していたのですが、うまくgsファイルに変換してくれず「ん〜〜〜」となっていたところ、なにやら制限があることを知りました。
こういうのは最初に目を通しておくべきですね......。気をつけます。
参考
-
メニューが見当たらない場合、以前のUIに戻す必要があります。画面右上にあたりにある「以前のエディタを使用」をクリックしてください。 ↩