この記事は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日