{"id":10737,"date":"2026-02-02T10:19:17","date_gmt":"2026-02-02T01:19:17","guid":{"rendered":"https:\/\/code-plus.jp\/gp\/?p=10737"},"modified":"2026-02-02T15:04:54","modified_gmt":"2026-02-02T06:04:54","slug":"rss-portal-10737","status":"publish","type":"post","link":"https:\/\/code-plus.jp\/gp\/rss-portal-10737\/","title":{"rendered":"\u7d9a\u30fbRSS\u00d7AI\u3067\u60c5\u5831\u53ce\u96c6\u3092\u81ea\u52d5\u5316\uff01\u63a1\u70b9\uff06\u5b66\u7fd2\u3059\u308b\u81ea\u5206\u597d\u307f\u306e\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u306e\u4f5c\u308a\u65b9"},"content":{"rendered":"<p>\u524d\u56de\u306e\u8a18\u4e8b\u3067\u7d39\u4ecb\u3057\u305f\u300cRSS Portal\u300d\u3092\u5b9f\u969b\u306b\u904b\u7528\u3057\u3066\u307f\u305f\u3068\u3053\u308d\u3001\u3044\u304f\u3064\u304b\u306e\u8ab2\u984c\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\u4eca\u56de\u306f\u3001\u305d\u308c\u3089\u306e\u6539\u5584\u3068 <b class=\"bold\">GitHub\u3067\u306eOSS\u516c\u958b<\/b> \u306b\u3064\u3044\u3066\u307e\u3068\u3081\u307e\u3059\u3002<\/p>\r\n\r\n<a href=\"https:\/\/code-plus.jp\/gp\/rss-portal-10725\/\" class=\"linkbox my-1.5r\">\r\n<h4 class=\"linkbox-title fz-md\">RSS\u00d7AI\u3067\u60c5\u5831\u53ce\u96c6\u3092\u81ea\u52d5\u5316\uff01\u63a1\u70b9\uff06\u5b66\u7fd2\u3059\u308b\u81ea\u5206\u597d\u307f\u306e\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u306e\u4f5c\u308a\u65b9<\/h4>\r\n<picture class=\"linkbox-thumbnail\">\r\n<img decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/code-plus.jp\/gp\/wp-content\/uploads\/99e46c49330a17661d6a17792b3dc727-1.jpg\" alt=\"RSS\u00d7AI\u3067\u60c5\u5831\u53ce\u96c6\u3092\u81ea\u52d5\u5316\uff01\u63a1\u70b9\uff06\u5b66\u7fd2\u3059\u308b\u81ea\u5206\u597d\u307f\u306e\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u306e\u4f5c\u308a\u65b9\" loading=\"lazy\" \/>\r\n<\/picture>\r\n<span class=\"linkbox-excerpt\">RSS\u30d5\u30a3\u30fc\u30c9\u3092AI\u304c\u81ea\u52d5\u3067\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3057\u3001\u8208\u5473\u306e\u3042\u308b\u8a18\u4e8b\u3060\u3051\u3092\u8868\u793a\u3059\u308b\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u4f5c\u308a\u65b9\u3002FastAPI + OpenRouter + WordPress\u3067\u69cb\u7bc9\u3057\u3001Like\/Dislike\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3067\u5b66\u7fd2\u3059\u308b\u4ed5\u7d44\u307f\u3092\u89e3\u8aac\u3002\r\n&emsp;<u class=\"linkbox-more\">\u7d9a\u304d\u3092\u8aad\u3080<\/u>\r\n<\/span>\r\n<\/a>\r\n\r\n<!-- \u2605\u76ee\u6b21\u30ea\u30b9\u30c8 -->\r\n<ul class=\"tocList mt-1r\" data-toc-id=\"js-tocBWGD\"><\/ul>\r\n<ins class=\"tocBtn is-fixed\" data-toc-id=\"js-tocBWGD\"><\/ins>\r\n<!-- \u76ee\u6b21\uff1aJS -->\r\n<script src=\"https:\/\/code-plus.jp\/cdn\/js\/_gimmicks\/inppend-tocList.js\"><\/script>\r\n<script src=\"https:\/\/code-plus.jp\/cdn\/js\/_gimmicks\/inppend-tocBtn.js\"><\/script>\r\n\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u904b\u7528\u3057\u3066\u898b\u3064\u304b\u3063\u305f\u8ab2\u984c<\/h2>\r\n<p>\u5b9f\u969b\u306b\u6570\u65e5\u9593\u904b\u7528\u3057\u3066\u307f\u308b\u3068\u3001\u4ee5\u4e0b\u306e\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<table class=\"table tbl-responsive\">\r\n  <thead>\r\n  <tr class=\"rung\">\r\n    <th>\u554f\u984c<\/th>\r\n    <td>\u539f\u56e0<\/td>\r\n  <\/tr>\r\n<\/thead><tbody>\r\n<tr class=\"rung\">\r\n  <th>2023\u5e74\u306e\u53e4\u3044\u8a18\u4e8b\u304c\u8868\u793a\u3055\u308c\u308b<\/th>\r\n  <td>RSS\u30d5\u30a3\u30fc\u30c9\u306b\u6b8b\u3063\u3066\u3044\u308b\u53e4\u3044\u8a18\u4e8b\u3082\u53d6\u5f97\u3057\u3066\u3044\u305f<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th>\u300cZenn\u300d\u306e\u8a18\u4e8b\u304c\u30ba\u30e9\u30c3\u3068\u4e26\u3076<\/th>\r\n<td>\u30d5\u30a3\u30fc\u30c9\u9806\u306b\u53d6\u5f97\u3057\u3001\u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u306e\u5236\u9650\u304c\u306a\u304b\u3063\u305f<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th>\u300cQiita\u300d\u304c\u8868\u793a\u3055\u308c\u306a\u3044<\/th>\r\n<td>URL\u304c <code>http:\/\/<\/code> \u306e\u307e\u307e\u3067\u30d5\u30a3\u30fc\u30c9\u304c\u53d6\u5f97\u3067\u304d\u3066\u3044\u306a\u304b\u3063\u305f<\/td>\r\n<\/tr>\r\n<\/tbody><\/table>\r\n<p>\u7279\u306b\u300cZenn\u306e\u30c8\u30ec\u30f3\u30c9\u300d\u306f\u8a18\u4e8b\u6570\u304c\u591a\u304f\u3001\u305d\u308c\u3060\u3051\u3067\u8868\u793a\u67a0\u3092\u57cb\u3081\u3066\u3057\u307e\u3046\u72b6\u614b\u3067\u3057\u305f\u3002<\/p>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u6539\u5584\u3057\u305f\u5185\u5bb9<\/h2>\r\n<h3 class=\"fz-ml\">1. \u53e4\u3044\u8a18\u4e8b\u3092\u9664\u5916\uff0814\u65e5\u5236\u9650\uff09<\/h3>\r\n<p><code>rss_fetcher.py<\/code> \u306b\u3001\u516c\u958b\u65e5\u304c14\u65e5\u4ee5\u4e0a\u524d\u306e\u8a18\u4e8b\u3092\u30b9\u30ad\u30c3\u30d7\u3059\u308b\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<pre><code class=\"language-python\">from datetime import datetime, timedelta\r\n\r\ndef is_article_too_old(published_at, days_limit=14):\r\n    &quot;&quot;&quot;\u8a18\u4e8b\u304c\u53e4\u3059\u304e\u308b\u304b\u30c1\u30a7\u30c3\u30af&quot;&quot;&quot;\r\n    if not published_at:\r\n        return False\r\n    \r\n    pub_date = datetime.fromisoformat(published_at)\r\n    cutoff_date = datetime.now() - timedelta(days=days_limit)\r\n    return pub_date &lt; cutoff_date\r\n\r\n# fetch_single_feed() \u5185\u3067\u4f7f\u7528\r\nfor entry in feed.entries:\r\n    published_at = parse_published_date(entry)\r\n    \r\n    # 14\u65e5\u4ee5\u4e0a\u524d\u306e\u8a18\u4e8b\u306f\u30b9\u30ad\u30c3\u30d7\r\n    if is_article_too_old(published_at):\r\n        continue\r\n<\/code><\/pre>\r\n<h3 class=\"fz-ml\">2. \u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u304b\u3089\u306e\u8868\u793a\u5236\u9650<\/h3>\r\n<p><code>database.py<\/code> \u306e <code>get_scored_articles()<\/code> \u306b\u3001\u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u304b\u3089\u6700\u592710\u4ef6\u307e\u3067\u3068\u3044\u3046\u5236\u9650\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<pre><code class=\"language-python\">from collections import defaultdict\r\n\r\ndef get_scored_articles(min_score=1, limit=100, max_per_feed=10):\r\n    &quot;&quot;&quot;\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u6e08\u307f\u306e\u8a18\u4e8b\u3092\u53d6\u5f97\uff08\u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u5236\u9650\u4ed8\u304d\uff09&quot;&quot;&quot;\r\n    \r\n    # \u307e\u305a\u5168\u4ef6\u53d6\u5f97\r\n    all_articles = fetch_all_scored_articles(min_score)\r\n    \r\n    # \u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u304b\u3089\u306e\u8a18\u4e8b\u6570\u3092\u5236\u9650\r\n    feed_count = defaultdict(int)\r\n    filtered_articles = []\r\n    \r\n    for article in all_articles:\r\n        feed_name = article[&#39;feed_name&#39;]\r\n        \r\n        if feed_count[feed_name] &lt; max_per_feed:\r\n            filtered_articles.append(article)\r\n            feed_count[feed_name] += 1\r\n        \r\n        if len(filtered_articles) &gt;= limit:\r\n            break\r\n    \r\n    return filtered_articles\r\n<\/code><\/pre>\r\n<h3 class=\"fz-ml\">3. \u8868\u793a\u9806\u3092\u300c\u6295\u7a3f\u65e5\u9806\u300d\u306b\u5909\u66f4<\/h3>\r\n<p>\u4ee5\u524d\u306f <code>fetched_at<\/code>\uff08\u53d6\u5f97\u65e5\u6642\uff09\u3067\u30bd\u30fc\u30c8\u3057\u3066\u3044\u305f\u305f\u3081\u3001\u30ea\u30e9\u30a4\u30c8\u3055\u308c\u305f\u53e4\u3044\u8a18\u4e8b\u304c\u4e0a\u4f4d\u306b\u6765\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3057\u305f\u3002<\/p>\r\n<pre><code class=\"language-sql\">-- \u5909\u66f4\u524d\r\nORDER BY a.fetched_at DESC, a.ai_score DESC\r\n\r\n-- \u5909\u66f4\u5f8c\r\nORDER BY a.published_at DESC, a.ai_score DESC\r\n<\/code><\/pre>\r\n<p>\u3053\u308c\u306b\u3088\u308a\u3001<b class=\"bold\">\u6295\u7a3f\u65e5\u304c\u65b0\u3057\u3044\u9806 \u2192 \u540c\u65e5\u5185\u306f\u30b9\u30b3\u30a2\u9806<\/b> \u3068\u3044\u3046\u81ea\u7136\u306a\u4e26\u3073\u306b\u306a\u308a\u307e\u3057\u305f\u3002<\/p>\r\n<h3 class=\"fz-ml\">4. \u30d5\u30a3\u30fc\u30c9\u306e\u6574\u7406\u3068\u6d77\u5916\u30b5\u30a4\u30c8\u8ffd\u52a0<\/h3>\r\n<p>\u5b9f\u969b\u306b\u53c2\u8003\u306b\u3057\u3066\u3044\u308b\u30b5\u30a4\u30c8\u306b\u53b3\u9078\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<p><b class=\"bold\">\u6574\u7406\u5f8c:<\/b> \u7d0420\u30d5\u30a3\u30fc\u30c9\uff08\u53b3\u9078 + \u6d77\u5916\u30b5\u30a4\u30c8\u8ffd\u52a0\uff09<\/p>\r\n<p>\u8ffd\u52a0\u3057\u305f\u6d77\u5916\u30d5\u30a3\u30fc\u30c9\uff1a<\/p>\r\n<table class=\"table tbl-responsive\">\r\n  <thead>\r\n  <tr class=\"rung\">\r\n    <th>\u30b5\u30a4\u30c8<\/th>\r\n    <td>\u7279\u5fb4<\/td>\r\n  <\/tr>\r\n<\/thead><tbody>\r\n<tr class=\"rung\">\r\n  <th>CSS-Tricks<\/th>\r\n  <td>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\u6280\u8853\u306e\u5b9a\u756a<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th>Codrops<\/th>\r\n<td>\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306aUI\/UX\u306e\u5b9f\u88c5\u4f8b<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th>Smashing Magazine<\/th>\r\n<td>Web\u5236\u4f5c\u5168\u822c\u306e\u6df1\u6398\u308a\u8a18\u4e8b<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th>Ahmad Shadeed<\/th>\r\n<td>CSS\u5b9f\u88c5\u30d1\u30bf\u30fc\u30f3\u306e\u8a73\u7d30\u89e3\u8aac<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th>Josh W Comeau<\/th>\r\n<td>CSS\/React\u306e\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306a\u89e3\u8aac<\/td>\r\n<\/tr>\r\n<\/tbody><\/table>\r\n<p>\u6d77\u5916\u30b5\u30a4\u30c8\u306e\u8a18\u4e8b\u3082\u3001AI\u304c\u65e5\u672c\u8a9e\u3067\u8981\u7d04\u3057\u3066\u304f\u308c\u308b\u306e\u3067\u554f\u984c\u306a\u304f\u8aad\u3081\u307e\u3059\u3002<\/p>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u8a2d\u5b9a\u5024\u306e\u30c1\u30e5\u30fc\u30cb\u30f3\u30b0<\/h2>\r\n<p><code>config.py<\/code> \u306e\u8a2d\u5b9a\u3092\u8abf\u6574\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<table class=\"table tbl-responsive\">\r\n  <thead>\r\n  <tr class=\"rung\">\r\n    <th>\u8a2d\u5b9a\u9805\u76ee<\/th>\r\n    <td>\u5909\u66f4\u524d<\/td>\r\n    <td>\u5909\u66f4\u5f8c<\/td>\r\n    <td>\u7406\u7531<\/td>\r\n  <\/tr>\r\n<\/thead><tbody>\r\n<tr class=\"rung\">\r\n  <th><code>MAX_ARTICLES_PER_FETCH<\/code><\/th>\r\n  <td>100<\/td>\r\n  <td>2000<\/td>\r\n  <td>\u5168\u30d5\u30a3\u30fc\u30c9\u304b\u3089\u53d6\u5f97\u3059\u308b\u305f\u3081<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th><code>MAX_ITEMS_PER_FEED<\/code><\/th>\r\n<td>20<\/td>\r\n<td>100<\/td>\r\n<td>\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u524d\u306b\u5341\u5206\u306a\u6bcd\u6570\u3092\u78ba\u4fdd<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th><code>MAX_DISPLAY_PER_FEED<\/code><\/th>\r\n<td>\u306a\u3057<\/td>\r\n<td>10<\/td>\r\n<td>\u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u306e\u504f\u308a\u3092\u9632\u6b62<\/td>\r\n<\/tr><tr class=\"rung\">\r\n<th><code>ARTICLE_RETENTION_DAYS<\/code><\/th>\r\n<td>14<\/td>\r\n<td>14<\/td>\r\n<td>\u7dad\u6301<\/td>\r\n<\/tr>\r\n<\/tbody><\/table>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u6539\u5584\u5f8c\u306e\u7d50\u679c<\/h2>\r\n<p><picture class=\"bd-bounds\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/62ef300d8309e9e4954f5a1c22a9c1ab.png\" alt=\"\u6539\u5584\u5f8c\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\"><\/picture><\/p>\r\n<ul style=\"list-style-type:bullet;\" class=\"my-0.5r\">\r\n<li>\u65e5\u4ed8\u9806\u306b\u4e26\u3076\u306a2026-01-31 \u2192 01-30 \u2192 01-29...<\/li>\r\n<li>\u30d5\u30a3\u30fc\u30c9\u304c\u5206\u6563\u306aZenn\u3001Qiita\u3001\u30b3\u30ea\u30b9\u3001npaka \u306a\u3069\u69d8\u3005\u306a\u30bd\u30fc\u30b9\u304b\u3089\u8868\u793a<\/li>\r\n<li>\u53e4\u3044\u8a18\u4e8b\u306a\u3057\u306a14\u65e5\u4ee5\u5185\u306e\u8a18\u4e8b\u306e\u307f<\/li>\r\n<\/ul>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">GitHub\u3067\u516c\u958b\u3057\u307e\u3057\u305f<\/h2>\r\n<p>RSS Portal \u3092OSS\u3068\u3057\u3066\u516c\u958b\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<p><b class=\"bold\">GitHub<\/b>: <cite><a href=\"https:\/\/github.com\/sarap422\/api-rss-portal\" class=\"link\" target=\"_blank\">sarap422\/api-rss-portal<\/a><\/cite><\/p>\r\n<h3 class=\"fz-ml\">\u542b\u307e\u308c\u308b\u30d5\u30a1\u30a4\u30eb<\/h3>\r\n<pre><code class=\"language-\">api-rss-portal\/\r\n\u251c\u2500\u2500 api\/rss-portal\/\r\n\u2502   \u251c\u2500\u2500 main.py           # FastAPI\u672c\u4f53\r\n\u2502   \u251c\u2500\u2500 config.py         # \u8a2d\u5b9a\uff08API\u30ad\u30fc\u3001\u8208\u5473\u5206\u91ce\uff09\r\n\u2502   \u251c\u2500\u2500 rss_fetcher.py    # RSS\u53d6\u5f97\r\n\u2502   \u251c\u2500\u2500 ai_scorer.py      # AI\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\r\n\u2502   \u251c\u2500\u2500 database.py       # SQLite\u64cd\u4f5c\r\n\u2502   \u251c\u2500\u2500 json_output.py    # JSON\u51fa\u529b\r\n\u2502   \u251c\u2500\u2500 cron_job.py       # \u5b9a\u671f\u5b9f\u884c\r\n\u2502   \u2514\u2500\u2500 data\/feeds.opml   # \u30b5\u30f3\u30d7\u30eb\u30d5\u30a3\u30fc\u30c9\r\n\u251c\u2500\u2500 public_html\/api\/rss-portal\/\r\n\u2502   \u2514\u2500\u2500 .htaccess         # \u30d7\u30ed\u30ad\u30b7\u8a2d\u5b9a\r\n\u251c\u2500\u2500 rss-portal.php         # WordPress\u7d44\u307f\u8fbc\u307f\u7528\r\n\u2514\u2500\u2500 README.md\r\n<\/code><\/pre>\r\n<h3 class=\"fz-ml\">\u4f7f\u3044\u65b9<\/h3>\r\n<ol style=\"list-style-type:decimal;\" class=\"my-0.5r\">\r\n<li>\u30d5\u30a1\u30a4\u30eb\u3092\u30b5\u30fc\u30d0\u30fc\u306b\u914d\u7f6e<\/li>\r\n<li><code>config.py<\/code> \u3067API\u30ad\u30fc\u3068\u8208\u5473\u5206\u91ce\u3092\u8a2d\u5b9a<\/li>\r\n<li><code>data\/feeds.opml<\/code> \u306bRSS\u30d5\u30a3\u30fc\u30c9\u3092\u767b\u9332<\/li>\r\n<li>Cron\u3067\u5b9a\u671f\u5b9f\u884c\u3092\u8a2d\u5b9a<\/li>\r\n<li>WordPress\u306b <code>rss-portal.php<\/code> \u3092\u7d44\u307f\u8fbc\u307f<\/li>\r\n<\/ol>\r\n<p>\u8a73\u7d30\u306fREADME\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\r\n<p>\u8208\u5473\u306e\u3042\u308b\u65b9\u306fGitHub\u304b\u3089\u30af\u30ed\u30fc\u30f3\u3057\u3066\u3001\u305c\u3072\u81ea\u5206\u597d\u307f\u306b\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\r\n\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u95a2\u9023\u8a18\u4e8b<\/h2>\r\n\r\n<a href=\"https:\/\/code-plus.jp\/gp\/rss-portal-10725\/\" class=\"linkbox my-1.5r\">\r\n<h4 class=\"linkbox-title fz-md\">RSS\u00d7AI\u3067\u60c5\u5831\u53ce\u96c6\u3092\u81ea\u52d5\u5316\uff01\u63a1\u70b9\uff06\u5b66\u7fd2\u3059\u308b\u81ea\u5206\u597d\u307f\u306e\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u306e\u4f5c\u308a\u65b9<\/h4>\r\n<picture class=\"linkbox-thumbnail\">\r\n<img decoding=\"async\" width=\"300\" height=\"200\" src=\"https:\/\/code-plus.jp\/gp\/wp-content\/uploads\/99e46c49330a17661d6a17792b3dc727-1.jpg\" alt=\"RSS\u00d7AI\u3067\u60c5\u5831\u53ce\u96c6\u3092\u81ea\u52d5\u5316\uff01\u63a1\u70b9\uff06\u5b66\u7fd2\u3059\u308b\u81ea\u5206\u597d\u307f\u306e\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u306e\u4f5c\u308a\u65b9\" loading=\"lazy\" \/>\r\n<\/picture>\r\n<span class=\"linkbox-excerpt\">RSS\u30d5\u30a3\u30fc\u30c9\u3092AI\u304c\u81ea\u52d5\u3067\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3057\u3001\u8208\u5473\u306e\u3042\u308b\u8a18\u4e8b\u3060\u3051\u3092\u8868\u793a\u3059\u308b\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u30b7\u30b9\u30c6\u30e0\u306e\u4f5c\u308a\u65b9\u3002FastAPI + OpenRouter + WordPress\u3067\u69cb\u7bc9\u3057\u3001\u30af\u30ea\u30c3\u30af, Like\/Dislike\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3067\u5b66\u7fd2\u3059\u308b\u4ed5\u7d44\u307f\u3092\u89e3\u8aac\u3002\r\n&emsp;<u class=\"linkbox-more\">\u7d9a\u304d\u3092\u8aad\u3080<\/u>\r\n<\/span>\r\n<\/a>\r\n\r\n<h2 class=\"fz-xl\">\u95a2\u9023\u30ea\u30f3\u30af<\/h2>\r\n<ul style=\"list-style-type:bullet;\" class=\"my-0.5r\">\r\n<li>GitHub: <cite><a href=\"https:\/\/github.com\/sarap422\/api-rss-portal\" class=\"link\" target=\"_blank\">sarap422\/api-rss-portal<\/a><\/cite><\/li>\r\n<li>OpenRouter: <cite><a href=\"https:\/\/openrouter.ai\/\" class=\"link\" target=\"_blank\">https:\/\/openrouter.ai\/<\/a><\/cite><\/li>\r\n<\/ul>","protected":false},"excerpt":{"rendered":"RSS Portal\u3092\u904b\u7528\u3057\u3066\u898b\u3064\u304b\u3063\u305f\u8ab2\u984c\uff08\u53e4\u3044\u8a18\u4e8b\u306e\u8868\u793a\u3001\u540c\u4e00\u30d5\u30a3\u30fc\u30c9\u306e\u504f\u308a\uff09\u3092\u6539\u5584\u300214\u65e5\u5236\u9650\u3001\u30d5\u30a3\u30fc\u30c9\u5225\u8868\u793a\u5236\u9650\u3001\u6295\u7a3f\u65e5\u9806\u30bd\u30fc\u30c8\u3092\u5b9f\u88c5\u3057\u3001GitHub\u3067OSS\u516c\u958b\u3057\u307e\u3057\u305f\u3002","protected":false},"author":1,"featured_media":10740,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25],"tags":[607,605,606,551,510,364,161,102],"class_list":{"0":"post-10737","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-aicoding","8":"tag-openrouter","9":"tag-605","10":"tag-rss","11":"tag-fastapi","12":"tag-ai","13":"tag-364","14":"tag-python","15":"tag-wordpress"},"_links":{"self":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/posts\/10737","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/comments?post=10737"}],"version-history":[{"count":6,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/posts\/10737\/revisions"}],"predecessor-version":[{"id":10754,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/posts\/10737\/revisions\/10754"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/media\/10740"}],"wp:attachment":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/media?parent=10737"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/categories?post=10737"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/tags?post=10737"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}