{"id":10725,"date":"2026-01-30T23:13:57","date_gmt":"2026-01-30T14:13:57","guid":{"rendered":"https:\/\/code-plus.jp\/gp\/?p=10725"},"modified":"2026-02-06T17:44:11","modified_gmt":"2026-02-06T08:44:11","slug":"rss-portal-10725","status":"publish","type":"post","link":"https:\/\/code-plus.jp\/gp\/rss-portal-10725\/","title":{"rendered":"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"},"content":{"rendered":"<!--\r\nSEO\u60c5\u5831\r\n===========================================\r\ntitle: AI\u304cRSS\u8a18\u4e8b\u3092\u81ea\u52d5\u63a1\u70b9\uff01\u81ea\u5206\u597d\u307f\u306e\u60c5\u5831\u30dd\u30fc\u30bf\u30eb\u3092\u30b5\u30a4\u30c8\u306b\u8a2d\u7f6e\u3059\u308b\u65b9\u6cd5\r\ndescription: 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 + Gemini API + 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\ntags: AI,\u60c5\u5831\u53ce\u96c6,\u81ea\u52d5\u5316,RSS,WordPress,Python,FastAPI,Gemini API\r\n===========================================\r\n-->\r\n\r\n<p>\u30a8\u30f3\u30b8\u30cb\u30a2\u3084Web\u5236\u4f5c\u8005\u306b\u3068\u3063\u3066\u3001\u6280\u8853\u60c5\u5831\u306e\u30ad\u30e3\u30c3\u30c1\u30a2\u30c3\u30d7\u306f\u907f\u3051\u3066\u901a\u308c\u307e\u305b\u3093\u3002\u3057\u304b\u3057\u3001RSS\u30ea\u30fc\u30c0\u30fc\u3092\u958b\u304f\u3068\u672a\u8aad\u304c\u6570\u767e\u4ef6\u2026\u3068\u3044\u3046\u72b6\u6cc1\u306b\u75b2\u5f0a\u3057\u3066\u3044\u308b\u65b9\u3082\u591a\u3044\u306e\u3067\u306f\u306a\u3044\u3067\u3057\u3087\u3046\u304b\u3002<\/p>\r\n<p>\u4e16\u306e\u4e2d\u306b\u306f\u60c5\u5831\u53ce\u96c6\u3092\u81ea\u52d5\u5316\u3059\u308b\u30c4\u30fc\u30eb\u3084\u30b5\u30fc\u30d3\u30b9\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u591a\u304f\u306f\u300cRSS\u304b\u3089Slack\u3084Discord\u306b\u901a\u77e5\u3059\u308b\u300d\u3060\u3051\u3002\u305d\u308c\u306a\u3089Feedly\u3067\u5341\u5206\u3067\u3059\u3057\u3001\u7d50\u5c40\u306f\u5927\u91cf\u306e\u8a18\u4e8b\u304b\u3089\u81ea\u5206\u3067\u9078\u5225\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\r\n<p>\u305d\u3053\u3067\u4eca\u56de\u306f\u3001<b class=\"bold\">AI\u304c\u8a18\u4e8b\u3092\u81ea\u52d5\u3067\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3057\u3001\u8208\u5473\u306e\u3042\u308b\u8a18\u4e8b\u3060\u3051\u3092\u81ea\u5206\u306e\u30b5\u30a4\u30c8\u306b\u8868\u793a\u3059\u308b<\/b>\r\n    \u81ea\u52d5\u5316\u30b7\u30b9\u30c6\u30e0\u3092\u4f5c\u308a\u307e\u3057\u305f\u3002\u3055\u3089\u306b\u3001\u30ea\u30f3\u30af\u30af\u30ea\u30c3\u30af, Like\/Dislike\u30dc\u30bf\u30f3\u3067\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3059\u308b\u3053\u3068\u3067\u3001AI\u306e\u63a1\u70b9\u7cbe\u5ea6\u304c\u5411\u4e0a\u3057\u3066\u3044\u304f\u4ed5\u7d44\u307f\u3067\u3059\u3002<\/p>\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\r\n\r\n\r\n\r\n<h2 class=\"fz-xl\">API\u300eRSS Portal\u300f<\/h2>\r\n<p>\r\n    <picture class=\"bd-bounds\"><img decoding=\"async\" src=\"https:\/\/i.gyazo.com\/62ef300d8309e9e4954f5a1c22a9c1ab.png\"\r\n            alt=\"RSS Portal \u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8\"><\/picture>\r\n<\/p>\r\n<p><b class=\"bold\">RSS Portal<\/b>\uff1a<br \/>\r\n    AI\u304cRSS\u8a18\u4e8b\u3092\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3057\u3001\u8208\u5473\u306e\u3042\u308b\u8a18\u4e8b\u3060\u3051\u3092\u8868\u793a\u3059\u308bWordPress\u9023\u643a\u30b7\u30b9\u30c6\u30e0<\/p>\r\n<h3 class=\"fz-ml\">\u4e3b\u306a\u6a5f\u80fd<\/h3>\r\n<table class=\"table tbl-responsive\">\r\n    <thead>\r\n        <tr class=\"rung\">\r\n            <th>\u6a5f\u80fd<\/th>\r\n            <td>\u8aac\u660e<\/td>\r\n        <\/tr>\r\n    <\/thead>\r\n    <tbody>\r\n        <tr class=\"rung\">\r\n            <th>RSS\u81ea\u52d5\u53d6\u5f97<\/th>\r\n            <td>\u767b\u9332\u3057\u305f\u6280\u8853\u30d6\u30ed\u30b0\u304b\u3089\u8a18\u4e8b\u3092\u81ea\u52d5\u53ce\u96c6\uff086\u6642\u9593\u3054\u3068\uff09<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>AI\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0<\/th>\r\n            <td>\u5404\u8a18\u4e8b\u30921\u301c5\u70b9\u3067\u81ea\u52d5\u8a55\u4fa1<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>AI\u8981\u7d04\u751f\u6210<\/th>\r\n            <td>\u8a18\u4e8b\u306e\u8981\u7d04\u3092130\u6587\u5b57\u4ee5\u5185\u3067\u751f\u6210<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>Like\/Dislike<\/th>\r\n            <td>\u30ea\u30f3\u30af\u30af\u30ea\u30c3\u30af, Like\/Dislike \u30af\u30ea\u30c3\u30af\u3092\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3068\u3057\u3066AI\u5b66\u7fd2\u306b\u6d3b\u7528<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>Dislike\u975e\u8868\u793a<\/th>\r\n            <td>\u8208\u5473\u306e\u306a\u3044\u8a18\u4e8b\u306f\u6b21\u56de\u304b\u3089\u8868\u793a\u3057\u306a\u3044<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>WordPress\u9023\u643a<\/th>\r\n            <td>\u81ea\u5206\u306e\u30b5\u30a4\u30c8\u306b\u57cb\u3081\u8fbc\u307f\u53ef\u80fd<\/td>\r\n        <\/tr>\r\n    <\/tbody>\r\n<\/table>\r\n<hr class=\"separator mt-3r\">\r\n<h3 class=\"fz-ml\">\u30b7\u30b9\u30c6\u30e0\u69cb\u6210<\/h3>\r\n<pre><code class=\"language-\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502                         \u30b5\u30fc\u30d0\u30fc                                \u2502\r\n\u2502                                                                 \u2502\r\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502\r\n\u2502  \u2502   Cron      \u2502    \u2502         Python FastAPI              \u2502    \u2502\r\n\u2502  \u2502  (6\u6642\u9593\u6bce)   \u2502\u2500\u2500\u2500\u25b6\u2502                                     \u2502    \u2502\r\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502  1. RSS\u53d6\u5f97 (feedparser)            \u2502    \u2502\r\n\u2502                     \u2502  2. AI\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0 (Gemini API)      \u2502    \u2502\r\n\u2502                     \u2502  3. SQLite\u306b\u4fdd\u5b58                    \u2502    \u2502\r\n\u2502                     \u2502  4. JSON\u51fa\u529b                        \u2502    \u2502\r\n\u2502                     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502\r\n\u2502                                    \u2502                           \u2502\r\n\u2502                                    \u25bc                           \u2502\r\n\u2502                     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u2502\r\n\u2502                     \u2502          API (port 8001)            \u2502    \u2502\r\n\u2502                     \u2502          \/api\/rss-portal\/           \u2502    \u2502\r\n\u2502                     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502\r\n\u2502                                    \u2502                           \u2502\r\n\u2502                                    \u25bc                           \u2502\r\n\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510   \u2502\r\n\u2502  \u2502                WordPress \/ \u9759\u7684\u30b5\u30a4\u30c8                    \u2502   \u2502\r\n\u2502  \u2502                                                         \u2502   \u2502\r\n\u2502  \u2502   [JavaScript] \u2500fetch\u2500\u25b6 \/api\/rss-portal\/articles        \u2502   \u2502\r\n\u2502  \u2502                                                         \u2502   \u2502\r\n\u2502  \u2502   [\u8a55\u4fa1\u30dc\u30bf\u30f3] \u2500POST\u2500\u25b6 \/api\/rss-portal\/feedback         \u2502   \u2502\r\n\u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518   \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/code><\/pre>\r\n<h3 class=\"fz-ml\">\u6280\u8853\u30b9\u30bf\u30c3\u30af<\/h3>\r\n<table class=\"table tbl-responsive\">\r\n    <thead>\r\n        <tr class=\"rung\">\r\n            <th>\u5f79\u5272<\/th>\r\n            <td>\u6280\u8853<\/td>\r\n        <\/tr>\r\n    <\/thead>\r\n    <tbody>\r\n        <tr class=\"rung\">\r\n            <th>\u30d0\u30c3\u30af\u30a8\u30f3\u30c9<\/th>\r\n            <td>Python FastAPI + uvicorn<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9<\/th>\r\n            <td>SQLite<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>RSS\u53d6\u5f97<\/th>\r\n            <td>feedparser<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>AI\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0<\/th>\r\n            <td>Gemini API\uff08Gemini 2.0 Flash\uff09<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>\u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9<\/th>\r\n            <td>WordPress\uff08JavaScript\u3067\u57cb\u3081\u8fbc\u307f\uff09<\/td>\r\n        <\/tr>\r\n    <\/tbody>\r\n<\/table>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">AI\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u306e\u4ed5\u7d44\u307f<\/h2>\r\n<h3 class=\"fz-ml\">\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u306e\u57fa\u6e96<\/h3>\r\n<p>AI\u306b\u306f\u300c\u8208\u5473\u306e\u3042\u308b\u5206\u91ce\u300d\u3068\u300c\u8208\u5473\u306e\u306a\u3044\u5206\u91ce\u300d\u3092\u4e8b\u524d\u306b\u8a2d\u5b9a\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\r\n<p><b class=\"bold\">\u8208\u5473\u306e\u3042\u308b\u5206\u91ce\u306e\u4f8b\uff1a<\/b><\/p>\r\n<ul style=\"list-style-type:bullet;\" class=\"my-0.5r\">\r\n    <li>WordPress\u958b\u767a\u30fb\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u30fb\u30d7\u30e9\u30b0\u30a4\u30f3\u958b\u767a<\/li>\r\n    <li>AI\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\uff08Claude Code, Cursor\u7b49\uff09<\/li>\r\n    <li>Web\u5236\u4f5c\u5168\u822c\uff08HTML\/CSS\/JavaScript\uff09<\/li>\r\n    <li>\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u4f8b\u30fb\u30b3\u30fc\u30c9\u4f8b\u304c\u3042\u308b\u8a18\u4e8b<\/li>\r\n<\/ul>\r\n<p><b class=\"bold\">\u8208\u5473\u306e\u306a\u3044\u5206\u91ce\u306e\u4f8b\uff1a<\/b><\/p>\r\n<ul style=\"list-style-type:bullet;\" class=\"my-0.5r\">\r\n    <li>\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u958b\u767a<\/li>\r\n    <li>\u30b2\u30fc\u30e0\u958b\u767a<\/li>\r\n    <li>\u65e5\u8a18\u30fb\u4f53\u9a13\u8ac7\u30fb\u30dd\u30a8\u30e0\u7684\u306a\u5185\u5bb9<\/li>\r\n    <li>\u300c\u307e\u3068\u3081\u3066\u307f\u305f\u300d\u3060\u3051\u3067\u5177\u4f53\u7684\u306a\u5b9f\u88c5\u304c\u306a\u3044\u8a18\u4e8b<\/li>\r\n<\/ul>\r\n<h3 class=\"fz-ml\">\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u5b66\u7fd2<\/h3>\r\n<p>\u30ea\u30f3\u30af\u3092\u30af\u30ea\u30c3\u30af\u3001Like\/Dislike\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001\u305d\u306e\u60c5\u5831\u304c\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u8a18\u9332\u3055\u308c\u307e\u3059\u3002\u6b21\u56de\u306e\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u6642\u306b\u306f\u3001\u904e\u53bb\u306bLike\u3057\u305f\u8a18\u4e8b\u30fbDislike\u3057\u305f\u8a18\u4e8b\u304cAI\u306e\u30d7\u30ed\u30f3\u30d7\u30c8\u306b\u542b\u307e\u308c\u3001\u3088\u308a\u7cbe\u5ea6\u306e\u9ad8\u3044\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u304c\u884c\u308f\u308c\u307e\u3059\u3002<\/p>\r\n<pre><code class=\"language-python\"># \u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u6642\u306b\u30d5\u30a3\u30fc\u30c9\u30d0\u30c3\u30af\u3092\u6d3b\u7528\r\nliked_articles = get_liked_articles(5)  # \u904e\u53bb5\u4ef6\u306eLike\u8a18\u4e8b\r\ndisliked_articles = get_disliked_articles(5)  # \u904e\u53bb5\u4ef6\u306eDislike\u8a18\u4e8b\r\n\r\nprompt = f&quot;&quot;&quot;\r\n\u3010\u904e\u53bb\u306b\u9ad8\u8a55\u4fa1\u3057\u305f\u8a18\u4e8b\u3011\r\n{liked_articles}\r\n\r\n\u3010\u904e\u53bb\u306b\u4f4e\u8a55\u4fa1\u3057\u305f\u8a18\u4e8b\u3011\r\n{disliked_articles}\r\n\r\n\u3053\u306e\u50be\u5411\u3092\u8e0f\u307e\u3048\u3066\u3001\u4ee5\u4e0b\u306e\u8a18\u4e8b\u3092\u8a55\u4fa1\u3057\u3066\u304f\u3060\u3055\u3044...\r\n&quot;&quot;&quot;\r\n<\/code><\/pre>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">Gemini API \u904b\u7528\u30b3\u30b9\u30c8<\/h2>\r\n<p>\u3053\u306e\u30b7\u30b9\u30c6\u30e0\u306e\u5927\u304d\u306a\u30e1\u30ea\u30c3\u30c8\u306f\u3001<b class=\"bold\">\u904b\u7528\u30b3\u30b9\u30c8\u304c\u975e\u5e38\u306b\u5b89\u3044<\/b>\u3053\u3068\u3067\u3059\u3002<\/p>\r\n<h3 class=\"fz-ml\">API\u6599\u91d1\uff08Gemini 2.0 Flash\uff09<\/h3>\r\n<table class=\"table tbl-responsive\">\r\n    <thead>\r\n        <tr class=\"rung\">\r\n            <th>\u9805\u76ee<\/th>\r\n            <td>\u6599\u91d1<\/td>\r\n        <\/tr>\r\n    <\/thead>\r\n    <tbody>\r\n        <tr class=\"rung\">\r\n            <th>1\u8a18\u4e8b\u3042\u305f\u308a<\/th>\r\n            <td>\u7d04$0.0001\u301c0.0005<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>1\u65e5100\u8a18\u4e8b\u51e6\u7406<\/th>\r\n            <td>\u7d04$0.01\u301c0.05<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>\u6708\u9593\u30b3\u30b9\u30c8<\/th>\r\n            <td>\u7d04$0.30\u301c1.50\uff08\u7d0450\u301c200\u5186\uff09<\/td>\r\n        <\/tr>\r\n    <\/tbody>\r\n<\/table>\r\n<p>\u5b9f\u969b\u306e\u904b\u7528\u3067\u306f\u3001<b class=\"bold\">\u6708\u984d$1\u306e\u4e0a\u9650\u8a2d\u5b9a<\/b>\u3067\u5341\u5206\u306b\u53ce\u307e\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\r\n<h3 class=\"fz-ml\">\u30b5\u30fc\u30d0\u30fc\u8cbb\u7528<\/h3>\r\n<p>\u30ec\u30f3\u30bf\u30eb\u30b5\u30fc\u30d0\u30fc\u300c\u30ab\u30e9\u30d5\u30eb\u30dc\u30c3\u30af\u30b9\u300d\u5171\u7528\u30b5\u30fc\u30d0\u30fc\uff08\u6708\u984d500\u301c1,000\u5186\u7a0b\u5ea6\uff09\u3067\u52d5\u4f5c\u53ef\u80fd\u3067\u3059\u3002VPS\u3084\u5c02\u7528\u30b5\u30fc\u30d0\u30fc\u306f\u4e0d\u8981\u3067\u3059\u3002<\/p>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8<\/h2>\r\n<h3 class=\"fz-ml\">1. RSS\u53d6\u5f97\uff08feedparser\uff09<\/h3>\r\n<pre><code class=\"language-python\">import feedparser\r\n\r\ndef fetch_rss(feed_url):\r\n    feed = feedparser.parse(feed_url)\r\n    articles = []\r\n    for entry in feed.entries:\r\n        articles.append({\r\n            &#39;title&#39;: entry.get(&#39;title&#39;, &#39;&#39;),\r\n            &#39;link&#39;: entry.get(&#39;link&#39;, &#39;&#39;),\r\n            &#39;summary&#39;: entry.get(&#39;summary&#39;, &#39;&#39;),\r\n            &#39;published&#39;: entry.get(&#39;published&#39;, &#39;&#39;)\r\n        })\r\n    return articles\r\n<\/code><\/pre>\r\n<h3 class=\"fz-ml\">2. AI\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\uff08Gemini API API\uff09<\/h3>\r\n<pre><code class=\"language-python\">import requests\r\n\r\ndef score_article(title, summary, user_interests, user_dislikes):\r\n    prompt = f&quot;&quot;&quot;\r\n    \u4ee5\u4e0b\u306e\u8a18\u4e8b\u30921-5\u306e\u30b9\u30b3\u30a2\u3067\u8a55\u4fa1\u3057\u3066\u304f\u3060\u3055\u3044\u3002\r\n    \r\n    \u3010\u30e6\u30fc\u30b6\u30fc\u306e\u8208\u5473\u3011\r\n    {user_interests}\r\n    \r\n    \u3010\u30e6\u30fc\u30b6\u30fc\u304c\u8208\u5473\u306e\u306a\u3044\u5206\u91ce\u3011\r\n    {user_dislikes}\r\n    \r\n    \u3010\u8a18\u4e8b\u60c5\u5831\u3011\r\n    \u30bf\u30a4\u30c8\u30eb: {title}\r\n    \u6982\u8981: {summary}\r\n    \r\n    JSON\u5f62\u5f0f\u3067\u56de\u7b54: {{&quot;score&quot;: \u6570\u5024, &quot;reason&quot;: &quot;\u7406\u7531&quot;, &quot;summary&quot;: &quot;130\u6587\u5b57\u4ee5\u5185\u306e\u8981\u7d04&quot;}}\r\n    &quot;&quot;&quot;\r\n    \r\n    response = requests.post(\r\n        f\"https:\/\/generativelanguage.googleapis.com\/v1beta\/models\/gemini-2.0-flash:generateContent?key={API_KEY}\",\r\n        headers={\"Content-Type\": \"application\/json\"},\r\n        json={\r\n            \"contents\": [{\"parts\": [{\"text\": prompt}]}],\r\n            \"generationConfig\": {\"temperature\": 0.1, \"maxOutputTokens\": 500}\r\n        }\r\n    )\r\n    return response.json()\r\n<\/code><\/pre>\r\n<h3 class=\"fz-ml\">3. \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\uff08JavaScript\uff09<\/h3>\r\n<pre><code class=\"language-javascript\">fetch(&#39;\/api\/rss-portal\/articles&#39;)\r\n  .then(res =&gt; res.json())\r\n  .then(data =&gt; {\r\n    data.articles.forEach(article =&gt; {\r\n      \/\/ \u30b9\u30b3\u30a23\u4ee5\u4e0a\u306e\u8a18\u4e8b\u306e\u307f\u8868\u793a\r\n      if (article.score &gt;= 3) {\r\n        renderArticle(article);\r\n      }\r\n    });\r\n  });\r\n\r\nfunction sendFeedback(articleId, type) {\r\n  fetch(&#39;\/api\/rss-portal\/feedback&#39;, {\r\n    method: &#39;POST&#39;,\r\n    headers: {&#39;Content-Type&#39;: &#39;application\/json&#39;},\r\n    body: JSON.stringify({article_id: articleId, feedback: type})\r\n  });\r\n}\r\n<\/code><\/pre>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u307e\u3068\u3081<\/h2>\r\n<p>RSS Portal\u306f\u3001\u4ee5\u4e0b\u306e\u8ab2\u984c\u3092\u89e3\u6c7a\u3059\u308b\u305f\u3081\u306b\u4f5c\u308a\u307e\u3057\u305f\u3002<\/p>\r\n<table class=\"table tbl-responsive\">\r\n    <thead>\r\n        <tr class=\"rung\">\r\n            <th>\u8ab2\u984c<\/th>\r\n            <td>\u89e3\u6c7a\u7b56<\/td>\r\n        <\/tr>\r\n    <\/thead>\r\n    <tbody>\r\n        <tr class=\"rung\">\r\n            <th>\u8208\u5473\u306e\u306a\u3044\u8a18\u4e8b\u304c\u591a\u3044<\/th>\r\n            <td>\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3067\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>\u8981\u7d04\u304c\u306a\u3044\/\u8aad\u307f\u306b\u304f\u3044<\/th>\r\n            <td>AI\u751f\u6210\u306e\u65e5\u672c\u8a9e\u8981\u7d04<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>\u5b66\u7fd2\u3057\u306a\u3044<\/th>\r\n            <td>Like\/Dislike\u3067\u7cbe\u5ea6\u5411\u4e0a<\/td>\r\n        <\/tr>\r\n        <tr class=\"rung\">\r\n            <th>\u5916\u90e8\u30b5\u30fc\u30d3\u30b9\u4f9d\u5b58<\/th>\r\n            <td>\u81ea\u5206\u306e\u30b5\u30a4\u30c8\u306b\u8a2d\u7f6e\u53ef\u80fd<\/td>\r\n        <\/tr>\r\n    <\/tbody>\r\n<\/table>\r\n<p>\u300c\u60c5\u5831\u53ce\u96c6\u306e\u81ea\u52d5\u5316\u300d\u3068\u3044\u3046\u3068\u3001Slack\u3084Discord\u3078\u306e\u901a\u77e5\u304c\u4e00\u822c\u7684\u3067\u3059\u304c\u3001\u305d\u308c\u3060\u3051\u3067\u306f\u7d50\u5c40\u624b\u52d5\u3067\u9078\u5225\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002AI\u306b\u3088\u308b\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0\u3068\u5b66\u7fd2\u6a5f\u80fd\u3092\u81ea\u52d5\u5316\u3059\u308b\u3053\u3068\u3067\u3001\u6b32\u3057\u3044\u60c5\u5831\u3060\u3051\u304c\u5c4a\u304f\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\r\n<hr class=\"separator mt-3r\">\r\n<h2 class=\"fz-xl\">\u95a2\u9023\u8a18\u4e8b<\/h2>\r\n<a href=\"https:\/\/code-plus.jp\/gp\/rss-portal-10737\/\" class=\"linkbox my-1.5r\">\r\n<h4 class=\"linkbox-title fz-md\">\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<\/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.jpg\" alt=\"\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\" loading=\"lazy\" \/>\r\n<\/picture>\r\n<span class=\"linkbox-excerpt\">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\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\">\u53c2\u8003\u30ea\u30f3\u30af<\/h2>\r\n<ul style=\"list-style-type:bullet;\" class=\"my-0.5r\">\r\n    <li><cite><a href=\"https:\/\/ai.google.dev\/\" class=\"link\" target=\"_blank\">Gemini API<\/a><\/cite> - Google\u306eAI API<\/li>\r\n    <li><cite><a href=\"https:\/\/fastapi.tiangolo.com\/\" class=\"link\" target=\"_blank\">FastAPI<\/a><\/cite> -\r\n        Python\u88fd\u306e\u9ad8\u901fWeb\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af<\/li>\r\n    <li><cite><a href=\"https:\/\/feedparser.readthedocs.io\/\" class=\"link\" target=\"_blank\">feedparser<\/a><\/cite> -\r\n        Python\u306eRSS\u30d1\u30fc\u30b5\u30fc<\/li>\r\n<\/ul>","protected":false},"excerpt":{"rendered":"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 + Gemini API + 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","protected":false},"author":1,"featured_media":10741,"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-10725","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\/10725","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=10725"}],"version-history":[{"count":10,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/posts\/10725\/revisions"}],"predecessor-version":[{"id":10873,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/posts\/10725\/revisions\/10873"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/media\/10741"}],"wp:attachment":[{"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/media?parent=10725"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/categories?post=10725"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code-plus.jp\/gp\/wp-json\/wp\/v2\/tags?post=10725"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}