FirebaseとAppEngineだけでRSSを使った動画アプリやニュースアプリを作る方法

YouTubeにある動画をYouTubeAPIで取得、ブログ記事を1日1回RSSで取得し、Firebase Realtime Databaseを更新、iOSアプリからはRealtime Databaseを参照して動画フィードを作るという一連の実装をやった経験があります。

その実装をほぼ再現実装したCloud Functionsのサンプルコードを公開しているのですが、日本語記事を書いていなかったので、今更ですが紹介します。

https://github.com/kboy-silvergym/FirebaseCloudFunctions-for-NewsApp

# 流れ

- firebase cloud functionsにYouTube APIやRSSを叩いてRDBに入れるコードを書く
- App EngineでCronジョブを作る
- アプリからRDBを参照する

こんな感じです。

## YouTube APIでYoutube動画を取得

![youtube](https://camo.githubusercontent.com/eefdcf4f5263296aca043d8b113cc30a44a18cee/687474703a2f2f69636f6e732e69636f6e617263686976652e636f6d2f69636f6e732f64616b697262793330392f73696d706c792d7374796c65642f3235362f596f75547562652d69636f6e2e706e67)

[YouTube Data API](https://developers.google.com/youtube/v3/getting-started?hl=ja)に登録してAPI KEYを取得します。(取得手順は[ドキュメント](https://developers.google.com/youtube/v3/getting-started?hl=ja)をみてみてください)

そしたらそのapiKeyを使ってYouTubeから動画のリストを取得できます。今回はチャンネルIDを使ってリストを取得。

チャンネルIDは https://www.youtube.com/channel/UCEj6hquMBUiQGunwIO1zVZA の`UCEj6hquMBUiQGunwIO1zVZA` の部分です。（このURLは僕のYouTubeなので登録してね）

以下はCloud Functionsのコードです。

```javascript
const apiKey = '<- something ->'
const youtubeChannelId = '<- something ->'
const youtube = google.youtube({ version: 'v3', auth: apiKey });

exports.fetchYoutube = function () {
    youtube.search.list({
        part: 'snippet',
        channelId: youtubeChannelId,
        maxResults: 1,
        order: `date`,
        type: `video`,
        videoDefinition: `high`
    }, (err, response) => {
        if (err) {
            console.log(err);
            return;
        }
        // realtime databaseに保存
    });
}

```

取得したら、Firebase Realtime Databaseに保存します。これは同じFirebaseプロジェクト内で書き込むのでAPI Keyとかは要りません。同じプロジェクトにFunctionsがデプロイできればOKです。

```javascript
// realtime databaseに保存
function saveToFirebaseRDB(id, title, img_url, description, date){
    const postData = {
        id: id,
        title: title,
        img_url: img_url,
        date: date,
        descritption: descritption,
    };
    const videoRef = admin.database().ref('/Articles/Video/');
    const categoryRef = videoRef.child(category);

    categoryRef.limitToLast(1).once('value').then(function (snapshot) {
        var childData;
        snapshot.forEach(function (child) {
            childData = child.val();
        });
        const last_id = (childData != null) ? childData.id : '';

        // 前のやつとidが違ったら更新
        if (last_id != id) {
            const newPostKey = categoryRef.push().key;
            var updates = {};
            updates['/Articles/Video/' + category + '/' + newPostKey] = postData;
            admin.database().ref().update(updates);
            console.log(`Success to insert a new video.`);
        };
    });
}
```

うまくいくとこんな感じでFirebaseに書き込まれます。

![image](https://user-images.githubusercontent.com/17683316/44627794-de8bca00-a96e-11e8-990e-7e5f230150ce.png)

僕の[サンプルコード](https://github.com/kboy-silvergym/FirebaseCloudFunctions-for-NewsApp
)では、YouTubeだけではなくブログ記事のRSSを取得するコードもあるのでよかったら参考にしてください。

## AppEngineのCronジョブを定期実行

![appengine](https://camo.githubusercontent.com/3791f850579f6e60eb007c492a884b23b862737d/687474703a2f2f69696e65676f6f64732e636f6d2f77702d636f6e74656e742f75706c6f6164732f323031372f30372f6761652e706e67)

RSSで取得して、書き込むって所を自動で毎日やってもらうためにAppEngineのCronジョブを使います。

[Cloud Functions for Firebase でジョブをスケジューリング（cron）する](https://developers-jp.googleblog.com/2017/04/how-to-schedule-cron-jobs-with-cloud.html)を参考にしました。

以下のような感じでcronジョブが生成されると、毎朝7時にさっき作ったfunctionsが実行されて、自動でFirebase Realtime Databaseが更新されます。

![img](https://user-images.githubusercontent.com/17683316/44627795-de8bca00-a96e-11e8-9c0e-6dd4f5310bb2.png)

## アプリからFirebase Realtime Databaseを参照

あとはiOSやAndroid、またはWebアプリから、Firebase Realtime Database(もちろんFirestoreも使えます)を参照すれば、サーバーを作らずともFirebaseだけで自動で動くニュースアプリや動画アプリが作れると思います。

https://firebase.google.com/docs/database/?hl=ja

# まとめ

- firebase cloud functionsにAPIやRSSを叩いてRDBに入れるコードを書く
- App EngineでCronジョブを作る
- アプリからRDBを参照する

という流れでニュースアプリや動画アプリがFirebaseだけで作れますので、是非是非参考にしてみてください。

サンプルは以下です。

https://github.com/kboy-silvergym/FirebaseCloudFunctions-for-NewsApp