LoginSignup
3
2

More than 1 year has passed since last update.

GAS + Feedlyで担当アイドルを継続的にエゴサする

Last updated at Posted at 2021-09-06

注意 : 加筆修正したものを Zenn に投稿しています。

きっかけ

Twitterで 担当アイドル を検索してツイートを眺めるということをよくするのですが、

「いちいちTwitter開いて検索するのめんどくさい...」
「普段 Feedly (RSSリーダ) をよく開くのでここで見れたら最高なのでは??」

という気持ちになった結果

『Twitterの検索結果をRSSフィード化して、Feedlyで読めるようにしよう!』
と思ったのがきっかけです。

構成図的なもの

構成.png

準備

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の管理画面の左下にある「設定」を選択します。

image.png

Google Apps Script APIの項目を「オン」にします。

image.png

これで 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

スプレッドシートとそれに紐づいたスクリプトが作成されます。
便利......:hatching_chick:

また、ここまでの操作でディレクトリ内は以下のようになります。

  .
  ├── .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 にアクセスして、スプレッドシートを開きます。

以下にように、エゴサしたいアイドルを列挙して保存しておきます。
image.png

4. Bearer Token をプロパティに追加

Twitter の Bearer Token をハードコードしたくないので、プロパティに追加します。いわゆる環境変数です。

clasp open でスクリプトエディタを開いて、上部メニューの「ファイル」から「プロジェクトのプロパティ」を選択します。1
image.png

「スクリプトのプロパティ」内にある「行を追加」から追加します。
image.png
ここでは twitterToken という名前にしました。

5. コードを書く

このままコードを追加していっても良いのですが、rootDir を変更して

.clasp.json
{
  "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で検索するやつ

(大した内容ではないのですが)簡単に全体の流れについて説明します。

main.js
// プロパティを読み込む
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にアクセスがあった際に呼ばれる関数です。

ですので、アクセスがあったら

  1. スプレッドシートから検索ワード(エゴサするアイドル名)を読込む
  2. それぞれをTwitterで検索
  3. 検索結果から必要な情報を抽出して整形
  4. 検索結果をテンプレートファイルに埋め込む
  5. 生成した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 でスクリプトエディタを開きます。

「公開」から「ウェブアプリケーションとして導入」を選択します。
image.png

モーダルが開くので「更新」を選択します。
image.png

許可がいるよ!って言われるので確認します。
image.png

別ウィンドウが開くので画面に沿って使用するGoogleアカウントを選択します。

こんな感じの警告がでてきますが、自分が書いたスクリプトなので、左下の「詳細」から「(安全ではないページ)に移動」を選択して先に進みます。
image.png

問題がなければ「許可」します。
image.png

以上で公開できました!
image.png

Current web app URL: 以下に表示されているURLにアクセスすると...
image.png

ちゃんと動いてそうです!いえー:v_tone1::v_tone1::v_tone1:

URL はこれから使用するのでコピーしておきます。

7. Feedlyに追加

Feedly を開いて、左のほうにある「+」を選択します。
image.png

先ほどコピーした URL を貼り付けて Enter を押すと...
image.png

でてきました!!(名前は気にしないでください)
image.png

FOLLOW ボタンを押してフィードを追加すれば完了です!

まとめ

image.png

見逃してしまっていた情報や、ファンアート、気になる考察などが見つかったりするので、とても重宝しています!

(担当のガシャが来ていて、自分が引けていないときは地獄の空間になりますが...)

また、最初はTypeScriptで開発していたのですが、うまくgsファイルに変換してくれず「ん〜〜〜」となっていたところ、なにやら制限があることを知りました。

こういうのは最初に目を通しておくべきですね......。気をつけます。

参考

  1. メニューが見当たらない場合、以前のUIに戻す必要があります。画面右上にあたりにある「以前のエディタを使用」をクリックしてください。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2