Help us understand the problem. What is going on with this article?

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

YouTube Data APIに登録してAPI KEYを取得します。(取得手順はドキュメントをみてみてください)

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

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

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

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です。

// 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

僕のサンプルコードでは、YouTubeだけではなくブログ記事のRSSを取得するコードもあるのでよかったら参考にしてください。

AppEngineのCronジョブを定期実行

appengine

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

Cloud Functions for Firebase でジョブをスケジューリング(cron)するを参考にしました。

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

img

アプリから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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away