éãšã³ãžãã¢ãè»¢è·æŽ»åãææã«ãRSSãšGemini APIã§ãéããŠèŠçŽãããBotãäœã£ãŠã¿ã #2
ãã®èšäºã¯ãã¬ãžã³ âéãšã³ãžãã¢ãè»¢è·æŽ»åãææã«ãäœã£ãŠåŠã¶ãèšé²â ã®#2ã§ãã
0. ãã®èšäºã§äŒãããããš
åå(#1)ã¯ãã¹ãã¬ããã·ãŒããGASãNotion API ãã€ãªãã§ãè»¢è·æŽ»åã®äŒæ¥ãªã¹ãã管çããä»çµã¿ãäœã£ã話ã§ããã
ä»åã¯ããã®æ¬¡ã«åãçµãã Phase 2 ã®ååã§ããPython ã䜿ã£ãŠæ å ±ãéããçæAI(Gemini API)ã§ãèªã¿ããã圢ãã«å å·¥ãããšãããŸã§ãæžããŸãã
å ã«ããã®èšäºã®ç«ã¡äœçœ®ãæžããŠãããŸããç§ã®ç¬¬äžã®ç®çã¯ãããã°ã©ãã³ã°ã AI ããŒã«ãAPI飿ºãæµ ãåºãè§Šã£ãŠãäœãã§ããããç¥ãããšã§ããããã§äœã£ããã®ã¯ãæ€èšŒçšã®æ®µéã§ãå®çšåã¯ããããã§ããã宿ããã話ãã§ã¯ãªãããè§Šã£ãŠã¿ãŠåãã£ãããšãã®èšé²ãšããŠèªãã§ããããããšæããŸãã
ãã®èšäºã§æžãããšã¯ã次ã®4ã€ã§ãã
Python ã®ç°å¢æ§ç¯ã§ãæåã«è©°ãŸã£ãããš
æ å ±ã®ååŸå ã2ã€(ã¹ã¯ã¬ã€ãã³ã°ãš RSS)詊ããŠãã©ã䜿ãåãããšèããã
ååŸããããŒã¿ã Gemini API ã§å å·¥ããæµã
AI ã®ã¢ãã«éžã³ã§åºããšã©ãŒãšããã®å¯ŸåŠ
åãèšäºãèªãŸããŠããAI ã®å€æ(éèŠåºŠ)ãæ¯åå€ãã£ãããš
1. ãªã Phase 2 ã«é²ãã ã®ã
Phase 1 ã§ã¯ãGAS(Google Apps Script)ã§ãã¹ãã¬ããã·ãŒããš Notion ãã€ãªããŸãããGAS ã¯ãGoogle ã®ãµãŒãã¹ã®äžã§åãã®ã§ãç°å¢ã®æºåãã»ãšãã©èŠããŸããã
次ã¯ãããå°ãèªç±åºŠã®é«ã Python ãè§Šã£ãŠã¿ãããšæããŸãããçç±ã¯ããšã³ãžãã¢ã䜿ããææ®µãããæµ ãã§ãäœéšããŠããããã£ãããã§ãã
顿ã¯ããAI ãææ°ããŒã«ã®æ å ±ãèªåã§éããŠãèŠçŽããŠå±ããæ å ±åéBotãã«ããŸãããèªåãæ å ±åéãç¶ãããããŒãã§ãå®éã«åœ¹ç«ã€å¯èœæ§ããããåŠç¿ã®é¡æãšããŠã¡ããã©ãããšèããããã§ãã
å šäœã®æµãã¯ã次ã®ããã«ãªããŸããä»åã®èšäºã¯ãåå(ååŸãšå å·¥)ã§ãã
ååŸ(Extract)
WebããŒãž(ã¹ã¯ã¬ã€ãã³ã°) / RSSãã£ãŒã
â
éè€æé€(æ¢èªã®ãã®ã¯é€ã)
â
AIã«ããå å·¥(Transform)
3è¡èŠçŽ / éèŠåºŠ(1ã5) / ã¿ã°
â
é
ä¿¡ã»ä¿å(Load) â æ¬¡å(#3)
Slack / Gmail / Notion
ããŒã¿åéã§ã¯ããã®æµãã ETL(æœåºã»å å·¥ã»æ ŒçŽ)ãšåŒã³ãŸããä»åã¯ãE(æœåº)ãš T(å å·¥)ã§ãã
2. ç°å¢æ§ç¯ã§ãæåã«è©°ãŸã£ãããš
ã¿ãŒããã«ãåãããªãç¶æ ããå§ããã®ã§ãããã°ã©ã ãæžãåã®ãæºåããæåã®å£ã§ããã
ä»®æ³ç°å¢(venv)ã¯ãããããžã§ã¯ãå°çšã®å°éšå±ã
Python ã§ã¯ã䟿å©ãªéšå(ã©ã€ãã©ãª)ã远å ããŠäœ¿ããŸãããã ãéšåã PC å šäœã«å ¥ãããããšãããŒãžã§ã³ãè¡çªããŠåããªããªãããšããããŸãã
ããã§ããããžã§ã¯ãããšã«ãå°çšã®ãå°éšå±ããäœããŸãããããä»®æ³ç°å¢(venv)ã§ããå¿ èŠãªéšåã®äžèŠ§ãæžãåºãã°ãä»ã® PC ãã¯ã©ãŠãã§ããåãç°å¢ãåçŸã§ããŸãã
æ¥åã«çœ®ãæãããšããèªåã® PC ã§ã¯åãã®ã«ãååã® PC ã§ã¯åããªãããšããäºæ ãé²ãèãæ¹ã§ãã
PowerShell ã®æš©éã¯ãæå°éã ãèš±å¯ãã
Windows ã®åæèšå®ã§ã¯ãã¹ã¯ãªããã®å®è¡ããã¹ãŠçŠæ¢ãããŠããŸãããã®ãŸãŸã§ã¯ãä»®æ³ç°å¢ãèµ·åã§ããŸããã
ããšãã£ãŠããäœã§ãå®è¡ãèš±å¯ãããèšå®ã«ããã®ã¯å±éºã§ããããã§ã次ã®ç¯å²ã ããèš±å¯ããŸããã
察象ã¯ãããŸäœ¿ã£ãŠããèªåã®ãŠãŒã¶ãŒã ã(PC å šäœã¯å€ããªã)
èš±å¯ããã®ã¯ãèªåã® PC ã§äœã£ãã¹ã¯ãªãã
å€éšããååŸããã¹ã¯ãªããã¯ã眲åããããã®ã ã(RemoteSigned ãšããèšå®)
ããã¯ãIT ã®æš©éèšèšã§ãããæå°æš©éã®ååãããå°ããäœéšã§ããå Žé¢ã§ããã
3. ååŸå ã2ã€è©Šã: ã¹ã¯ã¬ã€ãã³ã°ãš RSS
Python ã§æ å ±ãååŸããæ¹æ³ãšããŠã次ã®2ã€ã詊ããŸããã
ã¹ã¯ã¬ã€ãã³ã°: Web ããŒãžã® HTML ãååŸããå¿ èŠãªéšåã ããæãåºã
RSS: ãµã€ãããæ°çæ å ±ãã³ã³ãã¥ãŒã¿åãã«é ä¿¡ããŠããä»çµã¿(XML 圢åŒ)ãèªã
ç®çã¯ããã®2ã€ã®ææ³ã«è§ŠããŠãéããäœéšããããšã§ããã
ã¹ã¯ã¬ã€ãã³ã°: ä»çµã¿ã¯åãã£ãããå®çšåã¯ããªã
SaaS äŒæ¥ã®å°å ¥äºäŸããŒãžã顿ã«ãã¹ã¯ã¬ã€ãã³ã°ã詊ããŸãããæµãã¯æ¬¡ã®ãšããã§ãã
requests ãšããã©ã€ãã©ãªã§ãããŒãžã® HTML ãååŸãã
BeautifulSoup ãšããã©ã€ãã©ãªã§ãHTML ããæšã®æã®ãããªæ§é ã(DOM ããªãŒ)ã«åè§£ãã
äºäŸã®ã«ãŒããæ¢ããŠãäŒæ¥åãšè©³çްããŒãžã®ãªã³ã¯ãåãåºã
çžå¯Ÿãã¹(ã/case/âŠãã®ãããªçç¥åœ¢)ããå®å šãª URL ã«çŽããŠãã¿ãŒããã«ã«è¡šç€ºãã
ã¢ã¯ã»ã¹ãæåŠãããªãããããã©ãŠã¶ã«è¿ã User-Agent(éä¿¡ã®ãååºãã®ãããªãã®)ãä»ããŸãããAI ã«ããã®ä»ãæ¹ãæããŠããã£ããšããæ£çŽããããã¯å€§äžå€«ãªã®ã ãããããšäžå®ã«ãªããŸããããã©ãŠã¶ã®ãµããããŠååŸããããšã«ãå°ãæããæããããã§ãã
ååŸã¯ãäžèЧããŒãž1ã€ãæå€§10ä»¶ã§ãã¿ãŒããã«ã«è¡šç€ºããã ãã§ããä¿åããåé åžããå ¬éãããŠããŸããã
äžå®ãã確èªã«å€ããŠããå®çšåããªãããšæ±ºãã
ãã®äžå®ãæŸçœ®ãããååŸå ã®å©çšèŠçŽãš robots.txt ã確èªããŸããã(2026幎10æ11æ¥æç¹)
robots.txt: ãµã€ãå šäœã®ã¢ã¯ã»ã¹ãèš±å¯ããŠãã
å©çšèŠçŽ: ã¹ã¯ã¬ã€ãã³ã°ãçŠæ¢ããé ç®ã¯ããµãŒãã¹ã®å¥çŽè åãã®èŠçŽã®äžã«ãããŸãããç§ã¯ãã®ãµãŒãã¹ã䜿ã£ãŠããŸãããå ¬éã®äºäŸããŒãžã®é²èЧã«ã€ããŠããµã€ãå šäœã察象ã«ã¹ã¯ã¬ã€ãã³ã°ãçŠæ¢ããæèšã¯ãç§ã調ã¹ãç¯å²ã§ã¯èŠã€ãããŸããã§ãã
ãšã¯ãããæ³çãªå€æãã§ããããã§ã¯ãªããã°ã¬ãŒãªéšåãæ®ãå¯èœæ§ããããŸããããã§ã次ã®ããã«æ±ºããŸããã
åäœç¢ºèªã®ç¯å²(å°éã»æåã»å人ã®åŠç¿çš)ã«ãšã©ãã
å®çšå(宿å®è¡)ã¯ãããªã
ååŸå ã®äŒæ¥åã¯ãèšäºã«ãåºããªã
åŠãã ããšã¯ã2ã€ã§ãã1ã€ç®ã¯ãã¹ã¯ã¬ã€ãã³ã°ã¯ãã§ãããããšãšããã£ãŠãããããšãå¥ã ãšããç¹ã§ããåãåã«ãèŠçŽãš robots.txt ã確èªããã®ãå ã ãšããããããŠæããŸããã2ã€ç®ã¯ãå ¬åŒã«æäŸãããŠããææ®µããããªãããã¡ããåªå ããã¹ãã ãšããç¹ã§ãã
RSS: å ¬åŒã«é ä¿¡ãããŠããææ®µ
ãã1ã€ã®ååŸå ã¯ãæè¡èšäºãµã€ã Zenn ã® RSS ãã£ãŒãã§ããCursor ãšãããããã¯ã®æ°çèšäºãååŸããŸããã
RSS ã¯ããµã€ãåŽããæ°çèšäºã®ã¿ã€ãã«ãURLãå ¬éæ¥ãæŠèŠããæŽã£ã圢åŒã§å ¬åŒã«é ä¿¡ããŠãããã®ã§ããPython ã§ã¯ãfeedparser ãšããã©ã€ãã©ãªã§èªã¿ãŸãã
import feedparser
feed = feedparser.parse("https://zenn.dev/topics/cursor/feed")
for entry in feed.entries[:3]: # ææ°3ä»¶ãé ã«åãåºã
print(entry.title, entry.link)
ã¹ã¯ã¬ã€ãã³ã°ãšæ¯ã¹ããšãéãã¯æ¬¡ã®ãšããã§ãã
ã¹ã¯ã¬ã€ãã³ã°: ãµã€ãã®ãã¶ã€ã³ãå€ãããšãã³ãŒããå£ãããã
RSS: é ä¿¡åŽããèªãŸããåæã§æŽããŠããã®ã§ãå£ãã«ãããååŸãç°¡å
4. Gemini API ã§ãéããããŒã¿ããèªãã圢ãã«ãã
èšäºã®ã¿ã€ãã«ãæŠèŠãããã®ãŸãŸå šéšèªãã®ã¯å€§å€ã§ããããã§ãçæAI(Google ã® Gemini API)ã«ã次ã®3ã€ãäŸé ŒããŸããã
3è¡ã®èŠçŽ
éèŠåºŠã¹ã³ã¢(1ã5ã®æŽæ°)
ã¿ã°(2ã3å)
èŠç¹ã¯ããOpsè·ããšã³ãžãã¢ã®çç£æ§åäžã»æ¥åå¹çåãã«ããŸãããèªåã«ãšã£ãŠåœ¹ç«ã€èšäºãã©ããããAI ã«å€æããŠããã圢ã§ãã
æ§é åããŒã¿(JSON)ã§åãåãçç±
AI ã®è¿äºããæ®éã®æç« ã§åãåããšãããã°ã©ã ã¯äžèº«ã䜿ããŸãããããã§ãJSON ãšããæ±ºãŸã£ã圢åŒã§è¿ããŠããããŸãã
{
"summary": ["èŠçŽ1", "èŠçŽ2", "èŠçŽ3"],
"score": 4,
"tags": ["#Cursor", "#çç£æ§åäž"]
}
ããããŠãããšããã¹ã³ã¢ã4以äžãªããéç¥ãããã®ãããªæ¡ä»¶åå²ãã§ããŸã(次åã䜿ããŸã)ãèªç±ãªæç« ããããã°ã©ã ãæ±ããé ç®ã«å€æãããããããããŒã¿ã«ä»å 䟡å€ãã€ãã(ãšã³ãªããã¡ã³ã)ãšããããšã ãšçè§£ããŸããã
ããã³ããã®èŠç¹
AI ãžã®æç€º(ããã³ãã)ã«ã¯ã次ã®ããšãæžããŸããã
圹å²: Opsè·ã»ãšã³ãžãã¢ã®çç£æ§åäžã®èгç¹ã§èšäºãåæããã¢ã·ã¹ã¿ã³ã
åºåã®åœ¢åŒ: JSON ã ããåºåãããå眮ãã説æã¯æžããªã
åé ç®ã®ã«ãŒã«: èŠçŽã¯3è¡ã§50æåçšåºŠãã¹ã³ã¢ã¯1ã5ã®æŽæ°ãã¿ã°ã¯2ã3å
ãã ãAI ãæç€ºãå®ãããJSON ã```ã§å²ãã§è¿ããŠããå ŽåãããããŸãããã®ãããããã°ã©ã åŽã«ããè¿äºã®äžãã JSON ã®éšåã ããåãåºãåŠçãå ¥ããŸããã
# æåã® { ãããæåŸã® } ãŸã§ããJSON ãšã¿ãªããŠåãåºã
start = cleaned.find("{")
end = cleaned.rfind("}")
data = json.loads(cleaned[start : end + 1])
AI ã®åºåã¯ãæ¯åããããšã¯éããŸããããAI ã¯ãæç€ºã©ããã«è¿ããªãããšããããããšãåæã«ãåãåãåŽã§å®ããå ¥ãããããããåŠãã ããšã®1ã€ã§ãã
å®è¡çµæ
ã¿ãŒããã«ã«ã¯ã1èšäºããšã«ãéèŠåºŠãã¿ã€ãã«ãURLãå ¬éæ¥ãã¿ã°ã3è¡èŠçŽã衚瀺ãããŸãã

5. ã€ãŸãããã°
AI ã®ã¢ãã«éžã³ã§ããšã©ãŒãç¶ãã
ä»åã¯ãç¡æã®ç¯å²ã§åãããããšèããŠããŸãããèŠçŽã®ç²ŸåºŠã¯ããããŸã§é«ããªããŠãããšããåæã§ãã
æåã¯ãGemini 3.8 Flash ã䜿ãããšããŸãããããããå©çšè ãå€ãã503(ãµãŒããŒãæ··éããŠãã)ã®ãšã©ãŒãåºãããšããããŸãã
ããã§ 3.7 Flash ã«å€æŽããŸãããããã§ãã503 ãåºãŸãã
次ã«ã3.5 Flash-Lite ã«å€æŽããŸããã503 ã¯åºãªããªããŸããããä»åºŠã¯ 429(çæéã«ãªã¯ãšã¹ããéããã)ã®ãšã©ãŒãåºãŸãã
ããã§ããªã¯ãšã¹ãã®ééã空ããã³ãŒããå ¥ããŸããããããšããšã©ãŒã¯åºãªããªããŸãã
503 ãªã©ãžã®å¯ŸåŠæ³ã¯ã2ã€ãããšåŠãã
ãã®éçšã§ãäžæçãªãšã©ãŒãžã®å¯ŸåŠæ³ãšããŠã2ã€ããããšãåŠã³ãŸããã
ã¹ããããªã³ã°: ãªã¯ãšã¹ãã®éã«ããããããåŸ ã¡æéãå ¥ããããããããéããããªãããã«ãã
ææ°ããã¯ãªã: ãšã©ãŒãåºããã2ç§ã4ç§ã8ç§ãšãåŸ ã¡æéãåã«ããªãããèªåã§ããçŽã
ä»åã®ã³ãŒãã§æ¡çšããã®ã¯ãåè ã®ã¹ããããªã³ã°ã§ããå ããŠãäžæçãªãšã©ãŒã®ãšãã«ãäžå®ã®æé(3ç§)åŸ ã£ãŠãæå€§3åãŸã§ããçŽããç°¡æçãªå詊è¡ãå ¥ããŸãããåŸ ã¡æéãåã«ããŠããææ°ããã¯ãªããŸã§ã¯ãå®è£ ããŠããŸããã
# èšäºã1ä»¶åŠçãããã³ã«ã2ç§åŸ
ã€(ç¶ããŠéããããªã)
SLEEP_BETWEEN_ARTICLES_SECONDS = 2
# 503 ã 429 ã®ãããªäžæçãªãšã©ãŒã®ãšãã¯ã3ç§åŸ
ã£ãŠãæå€§3åãŸã§ããçŽã
MAX_RETRIES = 3
RETRY_WAIT_SECONDS = 3
åŠãã ããšã¯ã3ã€ã§ãã
ç®ç(ç¡æã粟床ã¯é«ããªããŠãã)ã«åãããŠã軜ãã¢ãã«ãéžã¶
ã¢ãã«ãæ¿ããã ãã§ãªããéä¿¡ã®ééãèšèšããããšãå¹ã
å€éšãµãŒãã¹ã®ã¢ãã«ãã«ãŒã«ã¯ãå€ãããäœã£ãŠçµããã§ã¯ãªããä¿å®ãå¿ èŠã«ãªã
æ¥åã§ããã°ãå€éšã® SaaS ã API ã«äŸåããä»çµã¿ã¯ããçžæã®å€æŽãæ··éã«åãããèšèšãèŠãããšããããšã§ãã
Windows ã®æååã
èšäºã®ã¿ã€ãã«ã«ãç¹æ®ãªèšå·(é·ãããã·ã¥ãªã©)ãå«ãŸããŠããŠãã¿ãŒããã«ã«è¡šç€ºããããšãããšãšã©ãŒ(UnicodeEncodeError)ã«ãªããŸããã
æåã³ãŒããæå®ãã衚瀺ã§ããªãæåããã£ãŠããæ¢ãŸããªãããã«ããŠè§£æ±ºããŸãããå°ããªåé¡ã§ããããèªåã® PC ã§ã¯åãã®ã«ãç°å¢ã«ãã£ãŠåããªããããšã®ã身è¿ãªäŸã§ããã
6. AIãšã®ä»ãåãæ¹: åãèšäºã§ããAIã®å€æã¯æ¯åå€ãã£ã
åäœç¢ºèªã®ããã«ãåãèšäºãäœåºŠãå®è¡ããŸããããã®ãšããå°è±¡ã«æ®ã£ãããšããããŸãã
3è¡ã®èŠçŽã¯ãæ¯åãããŸãå€ãããŸããã§ãã
äžæ¹ãéèŠåºŠã®ã¹ã³ã¢ã¯ãæ¯åéããŸãããåãèšäºãªã®ã«ã4ã«ãªã£ããã3ã«ãªã£ããã5ã«ãªã£ããããŸãã
ã¿ã°ãã䌌ããã¥ã¢ã³ã¹ã§ã¯ãããã®ã®ãå°ããã€ãã©ã€ããŠããŸãã
䜿ã£ãŠããã®ã¯ãGemini ã®äžã§ã軜ãã¢ãã«(Flash-Lite)ã§ãã粟床ã®é«ãã¢ãã«ãªãçµæãå€ããã®ãã©ããã¯ã詊ããŠããªãã®ã§åãããŸããããã ããåãAIã¢ãã«ã«ãåãèšäºãèªãŸããŠãã倿ã®çµæãå€ãããããšã¯ãäœéšãšããŠããšãŠãé¢çœãã£ãã§ãã
èšèšã«ãé¢ãã
æ¬¡åæžãéç¥ã®ä»çµã¿ã¯ããã¹ã³ã¢ã4以äžãªãéç¥ããããšããæ¡ä»¶ã§åãããŠããŸããã¹ã³ã¢ãæ¯åããããªããå¢ç®ã«ããèšäºã¯ãéç¥ãããããããªãã£ããããã¯ãã§ãã
æ¥åã«çœ®ãæãããšãAI ã«å€æããããä»çµã¿ã§ã¯ã次ã®ããšãèããå¿ èŠãããããã§ãã
å€æåºæºããããã³ããã®äžã§ããã£ãšå ·äœçã«æžã(äŸ: ãå ·äœçãªã³ãŒãäŸãããã°5ããªã©)
1åã®å€æã§æ±ºãããè€æ°åã®çµæãèŠã
AI ã®å€æã¯ãç®å®ããšããŠäœ¿ããæçµå€æã¯äººéããã
ãããã¯ããŸã 詊ããŠããªãæ¡ã§ããä»åŸã®èª²é¡ãšããŠãã¡ã¢ããŠãããŸãã
7. Opså®åãžã®ç¿»èš³
ä»åã®ä»çµã¿ã¯ã次ã®ãããªæ¥åã«çœ®ãæããããŸãã
ç«¶åãæ¥çã®åãã®ç£èŠ: ç«¶åã®ãã¥ãŒã¹ãªãªãŒã¹ããæ¥çãµã€ãã®æ°çããRSS ã§éãããéèŠãªãã®ã ããèŠçŽããŠå ±æãã
åãåãããåè«ã¡ã¢ã®æŽç: èªç±ã«æžãããæç« ã«ãAI ã§éèŠåºŠãšã¿ã°ãã€ããåªå é äœãã€ãã
瀟å ã®æ å ±åé: 瀟å ããŒã¿ã«ã®æŽæ°æ å ±ãéçŽãã
ã©ããããéããããèªãã圢ã«ãããã倿ã®ããã®ææã«ããããšããæµãã§ãå ±éããŠããŸãã
ãŸããã¹ã¯ã¬ã€ãã³ã°ã®ä»¶ã¯ãæ¥åã§ãåãã§ããå€éšã®ããŒã¿ãèªåã§ååŸãããšãã¯ãèŠçŽã®ç¢ºèªãšãå ¬åŒã®ææ®µã®åªå ãå ããšããèãæ¹ã¯ããã®ãŸãŸäœ¿ããŸãã
8. çŸç¶ãšã次åäºå
çŸç¶: ååŸãš AI ã§ã®å å·¥ãŸã§åããçµæã¯ã¿ãŒããã«ã«è¡šç€ºãããŸããå®è¡ã¯æåã§ã
ã¹ã¯ã¬ã€ãã³ã°ã¯ãå®çšåããŸãã
次å(#3)ã¯ããã®çµæã SlackãGmailãNotion ã«å±ããä»çµã¿ãšãåãèšäºãäºåºŠéç¥ããªã工倫(æ¢èªç®¡ç)ããã㊠APIããŒãªã©ã®ç§å¯æ å ±ãå®ãæ¹æ³ã«ã€ããŠæžããŸã
ãã®åŠç¿ãã©ããŸã§ç¶ãããã¯ã転è·å ãæ±ºãŸãææããæŽ»åãç¶ããããæé次第ã§ããã宿ããããããšãããããäœãã§ããããç¥ããåºç€ãåºãæŽããããšãåªå ããŠé²ããŠãããŸãã