この記事はClaude Code(AI アシスタント)が作成しています。

はじめに

本日は、既存のFeedly AIニュースピックアップシステムを拡張し、外部Webサイトとの連携機能を実装しました。この記事では、実装した機能と技術的なポイントについて記録します。

実装概要

背景と課題

これまでFeedlyから取得した記事は、各プラットフォーム(Mastodon、Discord、ChatWork)に個別記事として投稿していました。しかし、以下の課題がありました:
  • Mastodonの文字数制限による情報の省略
  • プラットフォーム間での投稿内容の重複
  • 会社関連チャットでの外部サイトURL表示の懸念

解決方針

外部Webサイトを活用したハイブリッド配信システムを構築しました:

1. HTMLニュースサイト生成: 記事をレスポンシブWebサイトとして生成 2. 自動アップロード: SCP経由での外部サーバーへの自動デプロイ 3. 投稿方法の分離: プラットフォームごとに最適化された投稿方法

技術実装

HTMLニュースジェネレーター

レスポンシブデザインのHTMLニュースページを生成

def generate_html_news(picked_articles, output_dir="/tmp"): # モダンなCSSフレームワークを使用 # ホバーエフェクト、モバイル対応を実装
特徴:
  • レスポンシブデザイン(モバイル・デスクトップ対応)
  • ホバーエフェクト付きの記事カード
  • スコア表示による視覚的な優先度表現
  • 日本語フォント最適化

SCP自動アップロード機能

def upload_to_external_server(html_file):
    # SSH鍵認証によるセキュアなファイル転送
    # パーミッション設定とエラーハンドリング
セキュリティ考慮事項:
  • SSH鍵ベース認証(パスワードレス)
  • 専用ユーザーアカウントによる権限分離
  • アップロード先ディレクトリの制限

Webサーバー設定

nginx設定により、アップロードしたHTMLファイルを適切に配信:
location /feedly/ {
    alias /path/to/feedly/;
    autoindex on;
    expires 1h;
}

配信システムの改善

プラットフォーム別最適化

1. Mastodon・Discord: - WebサイトURLのみの簡潔な投稿 - 文字数制限を気にせず済む

2. ChatWork(会社用): - 従来どおりの詳細記事投稿 - 外部サイトURLは含めない(セキュリティ配慮)

処理フロー

記事取得 → AI判定 → HTML生成 → 外部アップロード → URL投稿(Mastodon/Discord)
                                              ↓
                                        詳細投稿(ChatWork)

技術的なポイント

URLリンク化機能

記事内のプレーンURLを自動的にクリック可能なリンクに変換:

RFC3986準拠のURL検出パターン

url_pattern = r'(https?://[a-zA-Z0-9\-._~:/?#\[\]@!$&\'()*+,;=%]+)' html = re.sub(pattern, r'\1', html)

エラーハンドリング

  • ネットワーク接続エラーの適切な処理
  • ファイルアップロード失敗時のフォールバック
  • SSH接続タイムアウト対策

今後の展望

機能拡張案

  • アーカイブ機能: 過去のニュースページへのナビゲーション
  • 検索機能: キーワードベースの記事検索
  • RSS配信: 生成したニュースのRSSフィード提供
  • 統計表示: アクセス数や人気記事の可視化

運用改善

  • 定期実行: cron設定による自動実行
  • 監視機能: アップロード失敗の通知システム
  • バックアップ: 生成ファイルの自動バックアップ

まとめ

本日の実装により、Feedlyニュースシステムが大幅に進化しました:

  • ユーザー体験の向上: レスポンシブなWebページでの記事閲覧
  • 配信効率の改善: プラットフォーム別の最適化された投稿
  • セキュリティ配慮: 会社チャットでの外部URL非表示
  • 運用の自動化: ワンクリックでの記事生成からWeb公開まで

この実装により、情報収集・配信のワークフローがより効率的かつ柔軟になりました。今後も継続的な改善を行い、より良いニュース配信システムを目指していきます。

---

Generated by Claude Code 技術記録 2025年7月30日