CONTENT
ここから
SNSには、毎日膨大な数の投稿が公開されています。
すべての投稿を人の目で確認し、その中から話題になっている情報だけを探すのは簡単ではありません。そこで本教材では、複数の情報源から公開情報を定期的に収集し、話題度の高い情報を一覧表示するFlutterアプリを作成します。
ただし、SNSの情報取得方法はサービスごとに異なります。有料契約が必要なAPIもあれば、無料で利用できても取得回数に制限があるAPIもあります。
本教材では、次の条件を最優先にします。
月額費用を支払わず、公式に提供されている方法だけでアプリを完成させる。
そのため、取得対象を無理に増やすのではなく、無料で継続利用しやすい情報源に絞って実装します。
なお、本教材における「無料」とは、API、データベース、定期実行環境などを各サービスの無料利用枠内で使用することを意味します。無料枠を超えた利用、独自ドメイン、Apple App StoreやGoogle Playへの公開費用などは対象に含みません。
1.1 作成するアプリの完成イメージ
今回作成するのは、複数の情報源から話題を自動収集する「SNSトレンド収集アプリ」です。
アプリを開くと、現在注目されている投稿や記事が話題度の高い順に表示されます。
完成後の画面構成は、次のようなイメージです。
SNSトレンド収集アプリ
├─ 総合トレンド
│ ├─ 1位:話題になっている投稿
│ ├─ 2位:注目されている動画
│ └─ 3位:複数サイトで取り上げられている記事
│
├─ 情報源別
│ ├─ Mastodon
│ ├─ Bluesky
│ ├─ RSS
│ └─ YouTube
│
├─ キーワード検索
│ ├─ AI
│ ├─ Flutter
│ ├─ 医療
│ └─ 任意の検索キーワード
│
└─ ブックマーク
└─ 後で確認したい情報
利用者は、次の操作ができるようになります。
- 現在話題になっている情報を見る
- SNSや情報源を指定して絞り込む
- キーワードで投稿や記事を検索する
- 話題度順と新着順を切り替える
- 元の投稿や記事をブラウザで開く
- 気になる情報を端末内へ保存する
情報収集は、Flutterアプリを開いている間だけ行うのではありません。
バックエンド側の処理を一定間隔で実行し、取得した情報をデータベースへ保存します。Flutterアプリは、そのデータベースから整理済みの情報を読み込みます。
Mastodon ─┐
Bluesky ─┤
RSS ├─→ 定期収集 → 整理・保存 → Flutterで表示
YouTube ─┘
この構成にすることで、利用者がアプリを開いた直後から、すでに収集された情報を確認できます。
1.2 「SNSで話題」の定義
「SNSで話題になっている」という言葉には、全サービス共通の明確な定義がありません。
例えば、次のような状態は、どれも「話題」と考えられます。
- 短時間で多くの投稿が行われている
- いいねや共有が急増している
- 同じキーワードが繰り返し使われている
- 複数のSNSで同じテーマが取り上げられている
- SNSで紹介された記事が多く読まれている
- 公開から間もない動画の反応が急増している
しかし、取得できる数値は情報源ごとに異なります。
Mastodonでは、接続先サーバーが計算したトレンドタグ、投稿、リンクを取得できます。これらはMastodon内部のトレンドスコアをもとに定期的に再計算されます。ただし、結果は接続するMastodonサーバーによって異なります。
RSSには、通常、SNSのようないいね数や共有数が含まれていません。取得できるのは、記事タイトル、概要、公開日時、記事URLなどです。RSSはWebサイトの更新情報を配信するための形式であり、SNS上の反応を直接表すものではありません。
このように、すべての情報源を同じ基準で比較することはできません。
そこで本教材では、「話題になっている情報」を次のように定義します。
公開されてから時間があまり経過しておらず、一定の反応があり、同じテーマが複数の投稿や情報源で取り上げられている情報。
実装では、次の要素を組み合わせて独自の話題度を計算します。
話題度
├─ 投稿の新しさ
├─ いいね数
├─ コメント数
├─ 共有数
├─ 同じキーワードの出現回数
└─ 複数情報源での掲載数
ただし、第1段階のMVPでは高度なAI分析は行いません。
生成AI APIを使わず、取得できる数値とキーワードの一致を使って話題度を計算します。これにより、外部の有料AIサービスに依存せず、無料で動かせる構成を維持します。
1.3 無料で取得できる情報源を整理する
本教材では、次の4種類を情報源の候補とします。
| 情報源 | 取得する情報 | 認証 | 教材での扱い |
|---|---|---|---|
| Mastodon | トレンドタグ・投稿・リンク | 公開エンドポイントでは不要 | 必須 |
| Bluesky | 公開投稿・投稿者情報 | 公開エンドポイントでは不要 | 必須 |
| RSS/Atom | 記事タイトル・概要・公開日時 | 通常不要 | 必須 |
| YouTube | 動画タイトル・説明・公開日時・統計情報 | APIキーが必要 | 任意 |
Mastodon
Mastodonには、次のトレンド情報を取得する公式APIがあります。
- トレンドタグ
- トレンド投稿
- トレンドリンク
公開用のトレンドAPIは、アクセストークンなしで利用できるエンドポイントとして公式ドキュメントに記載されています。
ただし、Mastodonは一つの企業が管理する単一のSNSではありません。複数のサーバーによって構成されており、取得できるトレンドは接続したサーバーの利用者や管理方針に影響されます。
そのため、あるサーバーで話題になっている情報が、Mastodon全体でも話題になっているとは限りません。
Bluesky
Blueskyでは、公開情報を取得するためのAPIが提供されています。
公開エンドポイントは、認証なしでpublic.api.bsky.appから呼び出せます。公式ドキュメントでは、公開Web用途にはキャッシュ機能のあるpublic.api.bsky.appの使用が推奨されています。
Blueskyには、Mastodonと同じ形式の汎用的なトレンドAPIが用意されているわけではありません。
そのため、本教材では次の流れで話題を判定します。
- 指定したキーワードに関連する公開投稿を取得する
- 投稿日時や反応数を確認する
- 同じ言葉が短時間に何回使われたかを集計する
- 独自の話題度を計算する
つまり、Blueskyから「トレンドランキング」をそのまま受け取るのではなく、取得した公開投稿からアプリ側でランキングを作ります。
RSS/Atom
RSSやAtomは、Webサイトの更新情報を機械的に取得するためのデータ形式です。
主に次の情報を取得できます。
- 記事タイトル
- 記事の概要
- 公開日時
- 記事URL
- 著者
- カテゴリ
- サムネイル画像
RSS 2.0では、チャンネル内に複数のitemを持ち、それぞれの記事情報を配信できます。
RSS自体の利用に共通のAPI料金はありません。公開されているRSSフィードを、提供元の利用条件と適切な取得間隔を守って読み込みます。
ただし、すべてのWebサイトがRSSを提供しているわけではありません。また、RSSに記事全文が含まれるとも限りません。
本教材では、記事本文を無断で複製せず、次の情報を中心に保存します。
- タイトル
- 短い概要
- 公開日時
- 配信元
- 元記事のURL
YouTube
YouTubeでは、YouTube Data APIを使って動画を検索できます。
検索条件には、キーワード、公開日時、地域、言語などを指定できます。検索結果には動画だけでなく、チャンネルや再生リストが含まれる場合もあるため、動画だけを取得する場合は検索条件を設定します。
ただし、YouTube Data APIには利用量の上限があります。
そのため、YouTubeは必須機能ではなく、無料枠に余裕がある場合に追加する選択機能として扱います。
1.4 Mastodon・Bluesky・RSSの違い
Mastodon、Bluesky、RSSは、いずれも無料で情報を取得できますが、仕組みは大きく異なります。
| 比較項目 | Mastodon | Bluesky | RSS |
|---|---|---|---|
| 種類 | 分散型SNS | 分散型SNS | Web更新配信形式 |
| 主な取得対象 | 投稿・タグ・リンク | 公開投稿・フィード | 記事・お知らせ |
| トレンド情報 | 公式エンドポイントあり | アプリ側で集計 | 原則なし |
| 反応数 | 投稿によって取得可能 | 投稿によって取得可能 | 通常は取得不可 |
| 公開日時 | 取得可能 | 取得可能 | 取得可能 |
| 元ページURL | 取得可能 | 取得可能 | 取得可能 |
| 認証 | 公開APIは不要 | 公開APIは不要 | 通常不要 |
| 注意点 | サーバーごとに結果が異なる | 独自集計が必要 | 提供サイトに依存する |
Mastodonが向いている用途
Mastodonは、すでに計算されたトレンドを取得したい場合に適しています。
Mastodonサーバー
↓
トレンドAPI
↓
トレンドタグ・投稿・リンク
一方で、トレンドはサーバー単位です。複数のサーバーを対象にすると、より多くの情報を取得できますが、アクセス回数と重複データも増えます。
MVPでは、最初に一つのサーバーへ接続します。
Blueskyが向いている用途
Blueskyは、指定キーワードに関する公開投稿を調べ、自分で話題度を計算する用途に適しています。
検索キーワード
↓
Blueskyの公開投稿
↓
投稿日時・反応数を集計
↓
独自ランキング
Mastodonよりも実装する処理は増えますが、「AI」「Flutter」「医療」など、特定のテーマに絞ったトレンドを作りやすい特徴があります。
RSSが向いている用途
RSSは、公式発表やニュース記事を補完する用途に適しています。
SNSだけを情報源にすると、出典が不明な投稿や、内容が正確でない投稿が上位に表示される可能性があります。
そこで、SNS上の投稿とRSSの記事を組み合わせます。
SNSで注目されているキーワード
+
公式サイトやニュースサイトのRSS
↓
関連する一次情報や記事を表示
RSSには反応数がないため、SNSと同じ計算方法は使えません。
代わりに、次の条件で話題度を補います。
- 公開された時刻
- 同じキーワードを含む記事数
- 複数のRSSで取り上げられた回数
- SNS投稿と記事タイトルの一致度
1.5 YouTubeを追加する場合の制限
YouTube Data APIを利用するには、Google Cloudでプロジェクトを作成し、APIを有効にしてAPIキーを発行します。
APIの利用料金を直接支払わなくても、自由に無制限で検索できるわけではありません。
2026年7月24日時点の公式ドキュメントでは、YouTube Data APIを有効化したプロジェクトには、search.listについて1日100回の標準割り当てが設定されています。また、その他のエンドポイントには、合計1日10,000ユニットの標準割り当てがあります。
search.listを1回呼び出すと、検索用の割り当てを1回使用します。次のページを取得する場合も、新しいリクエストとして消費されます。
例えば、5個のキーワードを3時間ごとに検索するとします。
1日あたりの実行回数:8回
検索キーワード数:5個
8回 × 5個 = 40回
この場合、単純計算では1日に40回のsearch.listを使用します。
さらに、1回の検索結果について複数ページを取得すると、その分だけ呼び出し回数が増えます。
そのため、MVPでは次の制限を設けます。
- 検索キーワードを3~5個程度にする
- 取得間隔を3時間以上にする
- 1回の検索で複数ページを取得しない
- 同じ検索結果を一定時間キャッシュする
- Flutterアプリを開くたびにYouTube APIを呼ばない
- 収集処理をバックエンド側へ集約する
YouTubeを使わなくても、Mastodon、Bluesky、RSSだけでアプリは完成します。
したがって、本教材ではYouTubeを追加機能として扱い、APIキーを発行しない場合でも最後まで進められる構成にします。
注意
1.6 有料APIとスクレイピングを使わない理由
SNS情報を収集する方法には、公式API以外にスクレイピングがあります。
スクレイピングとは、ブラウザに表示されるHTMLを取得し、画面内から投稿本文や反応数などを抽出する方法です。
技術的には取得できる場合がありますが、本教材では採用しません。
理由1:画面変更に弱い
スクレイピングは、HTMLの構造に依存します。
例えば、投稿本文が次の要素に入っているとします。
<div class="post-text">投稿本文</div>
SNS側の更新によってクラス名が変更されると、取得処理が動かなくなります。
<div class="content-body">投稿本文</div>
公式APIでは、画面デザインが変わっても、APIの仕様が維持されている限り同じ形式でデータを取得できます。
理由2:利用規約を個別に確認する必要がある
Web上で閲覧できる情報であっても、プログラムによる自動取得や再利用が自由に許可されているとは限りません。
サービスによって、次の条件が異なります。
- 自動アクセスを許可しているか
- 投稿データを保存できるか
- 第三者へ再表示できるか
- 商用アプリで利用できるか
- 削除済み投稿を保持できるか
- 投稿者情報を保存できるか
本教材では、取得方法が明確に公開されている公式APIやRSSを優先します。
理由3:Bot対策の影響を受ける
SNSでは、不正アクセスや大量取得を防ぐため、次の仕組みが使われることがあります。
- ログイン要求
- CAPTCHA
- JavaScriptによる画面生成
- IPアドレス単位のアクセス制限
- 短時間の大量アクセスの遮断
- 自動操作の検出
これらを回避する実装は、教材の目的から外れます。
理由4:無料でも安定運用できるとは限らない
スクレイピングはAPI利用料金がかからないように見えます。
しかし、実際には次の運用負担が発生します。
- 画面変更のたびにコードを修正する
- ブラウザ自動操作用のサーバーを動かす
- 取得失敗を監視する
- アクセス制限への対応を行う
- 利用規約の変更を確認する
月額料金が0円でも、安定して維持できなければ、本教材の「無料で完成させる」という目的には適しません。
そのため、本教材では次の方針を採用します。
使用する
├─ 公式の公開API
├─ 無料利用枠のある公式API
├─ RSS/Atom
└─ 自分で作成した話題度計算
使用しない
├─ 有料API
├─ 非公式API
├─ HTMLスクレイピング
├─ Bot対策の回避
└─ 有料の生成AI API
1.7 MVPの完成条件を決める
MVPとは、Minimum Viable Productの略で、目的を検証するために必要な最小限の製品を意味します。
今回の目的は、すべてのSNSへ対応することではありません。
無料で取得できる複数の情報源をまとめ、現在注目されている情報をFlutterアプリで確認できるかを検証すること。
この目的に沿って、MVPの完成条件を決めます。
完成条件1:複数の情報源からデータを収集できる
最低でも、次の3種類から情報を取得します。
- Mastodon
- Bluesky
- RSS
YouTubeは任意機能とし、追加しなくてもMVP完成とします。
完成条件2:異なるデータを共通形式へ変換できる
取得した情報は、情報源ごとに形式が異なります。
アプリ内では、次のような共通データへ変換します。
TrendItem
├─ id
├─ source
├─ title
├─ content
├─ authorName
├─ publishedAt
├─ originalUrl
├─ thumbnailUrl
├─ likeCount
├─ commentCount
├─ shareCount
├─ trendScore
└─ collectedAt
取得できない項目には、nullまたは初期値を設定します。
例えば、RSSにはいいね数がないため、likeCountはnullとして扱います。取得できない値を推測して補完してはいけません。
完成条件3:話題度順に並べられる
投稿日時や反応数などからtrendScoreを計算します。
trendScoreが高い
↓
一覧の上位に表示
情報源ごとに取得できるデータが異なるため、完全に公平なランキングにはなりません。
MVPでは、厳密な社会全体のトレンドではなく、次の意味で使用します。
このアプリが取得した情報の中で、相対的に注目度が高い情報。
完成条件4:SNS別に絞り込める
利用者は、表示する情報源を選択できます。
すべて
Mastodon
Bluesky
RSS
YouTube
YouTubeを実装していない場合は、選択肢に表示しません。
完成条件5:キーワード別に絞り込める
投稿本文、記事タイトル、概要などを対象に検索します。
例えば「Flutter」と入力した場合、次の情報を表示します。
タイトルにFlutterを含む
本文にFlutterを含む
概要にFlutterを含む
登録キーワードにFlutterを含む
最初のMVPでは、完全一致ではなく、大文字と小文字を区別しない部分一致検索を使用します。
完成条件6:元投稿をブラウザで開ける
アプリには投稿や記事の全文を複製するのではなく、概要と元URLを表示します。
利用者が詳細を確認するときは、投稿元のSNSやWebサイトを外部ブラウザで開きます。
Flutterの投稿カード
↓
「元の投稿を見る」
↓
外部ブラウザ
↓
Mastodon・Bluesky・記事・YouTube
完成条件7:一定間隔で自動収集できる
利用者が更新ボタンを押さなくても、バックエンド側で一定間隔ごとに情報を収集します。
MVPでは、3時間ごとの実行を基本とします。
0時 → 自動収集
3時 → 自動収集
6時 → 自動収集
9時 → 自動収集
12時 → 自動収集
15時 → 自動収集
18時 → 自動収集
21時 → 自動収集
ただし、API制限や収集対象数に応じて間隔を変更できる設計にします。
完成条件8:月額費用が発生しない
APIやサーバーは、無料利用枠の範囲内で使用します。
次の状態を維持できれば、MVP完成とします。
- 有料APIを契約していない
- 有料の生成AI APIを使用していない
- APIの無料上限を超えていない
- データベースの無料上限を超えていない
- 定期実行環境の無料上限を超えていない
- 独自ドメインを必須にしていない
- App Storeへの公開を完成条件に含めていない
第1ページのまとめ
このページでは、無料で作れるSNSトレンド収集アプリの範囲を決めました。
本教材では、次の3種類を中心に情報を収集します。
Mastodon
├─ 公式のトレンド情報を取得する
└─ サーバーごとの話題を確認する
Bluesky
├─ 公開投稿を取得する
└─ 独自に話題度を計算する
RSS
├─ ニュースや公式発表を取得する
└─ SNS情報を補完する
YouTubeは、APIの無料割り当てを管理しながら追加する任意機能とします。
完成するMVPは、次の条件を満たします。
- 複数の情報源からデータを収集できる
- 取得データを共通形式へ変換できる
- 話題度順に並べられる
- SNS別に絞り込める
- キーワードで検索できる
- 元投稿をブラウザで開ける
- 一定間隔で自動収集できる
- 月額費用が発生しない
次のページでは、Flutter、データベース、定期収集処理をどのように分担させるかを整理し、無料で動かすためのアプリ全体の構成を設計します。