77
101

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-01-26

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

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

流れ

  • 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だけで自動で動くニュースアプリや動画アプリが作れると思います。

まとめ

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

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

サンプルは以下です。

77
101
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
77
101

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?