ðŽ é£ã®Chromeãæ¯æ¥æ®ºããŠããââshared-profileãšpkillãæ¶ãIGã»ãã·ã§ã³
æ10äžã®å€§åŠçãæãæã¡ã§æ60äžã皌ããäŒç€Ÿéœåã®è§£éã§ãŒãã«æ»ããå幎ãããŠClaude Codeã®èªåŸç°å¢ãçµã¿äžããŠæå120äžââãã®åºç€ãæ¯ããIGã¢ã«ãŠã³ãããèªåãæžããã¹ã¯ãªããã«æ¯æ¥æ®ºãããŠããã
ãªããã®ä»çµã¿ãå¹ãã®ã
å人éçºã§æåãç©ã¿äžãããšããæåã®å£ã¯ã人æãè¶³ããªããã§ã¯ãªããèªåãå¯ãŠããéã«äœãèµ·ããŠãããããããªããã§ãã
ç§ã®ç°å¢ã§ã¯çŸåšã171æ¬ã®ãžã§ãã launchd ããæ¯æ¥èªåèµ·åããŠããŸããX / Instagram / Threads / TikTok ãžã®æçš¿ã»ãããã»ãã©ããŒã»ã¢ã³ãã©ããŒã»DMããã¹ãŠèªååããããã§ãsns-output-watchdog.sh ãšããBashã¹ã¯ãªããããåœæ¥ã¡ãããšåºåãããããææç©ã®ãã°ã§ç£èŠããŠããŸãã
ãããç£èŠãæŽåããåã¯ã2é±éæ°ã¥ããªãã£ãå®çžŸããããŸããsns-output-watchdog.sh ã®å
é ã³ã¡ã³ãã«ã¯ããæžãããŠããŸãã
# content-watchdog.sh 㯠article/note/maker/series/ameba ã ããèŠãŠããã
# X/IG/TikTok/Threads ã®æçš¿ã»è¿ä¿¡ã¯èª°ãç£èŠããŠããªãã£ãããã®çµæ
# IGæçš¿ã¯7/29ãããTikTokæçš¿ã¯7/28ããæ¢ãŸã£ããŸãŸ2é±éæ°ã¥ãããªãã£ãã
IGæçš¿ãæ¢ãŸãã°ãæ°èŠãã©ãã¯ãŒãå¢ãããå ¬åŒLINEãžã®æµå ¥ãæ¢ãŸããæçµçã«å£²äžã®äŒžã³ãéåããŸãã1ã¹ãããã®å€±æã¯ã仿¥1æ¬æçš¿ã§ããªãã£ããã§ã¯ãªãããããããå§ãŸãã¯ãã ã£ããã¡ãã«ãäžžããšæ»ãã§ããããšããæå³ãæã¡ãŸãã
ç£èŠãæŽåããŠããããæ¬¡ã®åé¡ãé¡ãåºããŸãããexit 0 ãšãææããã£ããã¯å¥ç©ã ãšããããšã§ãã2026-08-08ã®å®æž¬ã§ãIGãããã¬ãŒã³ ig-1 ã¯1æ¥12åã®å®è¡ã®ãã¡8åãããã0ä»¶ã®ãŸãŸ exit 0 ã§çµãã£ãŠããŸãããåœæã® watchdog ã¯ãçµäº ( ãšããããŒã«ãŒã®åºçŸåæ°ããæ°ããã ãã ã£ããããcircuit-breakã§ãneed-loginã§ããå¥å
šããšå€å®ããŠããŸããã
# ðŽ åŸæ¥ã¯ 'çµäº (' ã®åºçŸåæ°ã ããæ°ããŠãããããcircuit-break ã§ã need-login ã§ã
# ãå¥å
šããšå€å®ããŠããã2026-08-08 宿ž¬ã§ ig-1 ã¯12runäž8åãtt-1/tt-2 ã¯6å²ã
# ããã0ä»¶ã®ãŸãŸ exit 0 ã§çµãã£ãŠããã2é±éèª°ãæ°ã¥ããªãã£ãã
ãã®æèšãèžãŸããŠãææãŒãã® run ãæ€ç¥ãã count_dead_runs()ããšãå®éã®ãããæ°ãéèšãã sum_likes_today()ãã远å ããŸãããããã§ããŸã ãå£ããŠããåŽãšå£ãããšå ±åããåŽãå¥ã®ãªããžããªã«ãããšããæ§é çãªåé¡ã¯è§£æ±ºããŠããŸããã§ãããããã 2026-08-24 ã®ã€ã³ã·ãã³ãã§ããè€æ°ã®èªååãåã Mac ã§èµ°ãããŠãã人ãªããåã穎ã«ã¯ãŸããªã¹ã¯ãå¿
ããããŸãã
å šäœã®æµã
ãªããžããªããŸããå ±æè³æº
åé¡ãæŽçããããã«ããŸãæ§æãå³ã«ããŸãã
scent-media ãªããžã㪠social-autolike ãªããžããª
ââââââââââââââââââââââââââ ââââââââââââââââââââââââââââââââââ
scripts/ensure_chrome.sh config/accounts.json
â CDP :9223 ãžæ¥ç¶è©Šè¡ â "reuseProfile": ".profiles/chrome-ig"
å¿çãªã â pkill å®è¡
â th-scent ãžã§ãïŒPlaywrightïŒ
â â .profiles/chrome-ig ãæŽãã§èµ·å
â â» CDP 9223 ã¯äžåéããªã
â â
ââââââââââââââââ¬ââââââââââââââââââââââââââââ
â
.profiles/chrome-ig â äž¡è
ãåããããã¡ã€ã«ãåç
§
Cookie SQLite 匷å¶ç Žå£
instagram.com ã® sessionid â 0è¡
scent-media ã® ensure_chrome.sh ã¯ãIGæçš¿åã«ãChromeãCDPã§å¶åŸ¡å¯èœãªç¶æ
ããã確èªããŸããç¢ºèªæ¹æ³ã¯ããŒã 9223 ãžã®æ¥ç¶è©Šè¡ã§ããå¿çããªããã°ãChromeã¯æ»ãã§ããããšå€æããŠã次ã®ã³ãã³ãã§åŒ·å¶çµäºããŸãã
pkill -f "user-data-dir=$PROFILE"
$PROFILE 㯠.profiles/chrome-ig ã§ããåé¡ã¯ãåããããã¡ã€ã«ã social-autolike ã® th-scent ãžã§ãã reuseProfile èšå®ã§å
±çšããŠããããšã§ããth-scent 㯠Playwright çµç±ã§ Chrome ãèµ·åããŸãããCDP ããŒã 9223 ã¯éããŸãããensure_chrome.sh ããèŠããšããth-scent ã䜿ã£ãŠãã Chromeãã¯åžžã«ã9223 ãéããŠããïŒæ»ãã§ããããã»ã¹ãã«èŠããŸãã
æ¯æ¥æ±ºãŸã£ãæå»ã«èµ·ããè¡çª
ãã®è¡çªã¯å¶çºã§ã¯ãªããlaunchd ã®ã¹ã±ãžã¥ãŒã«ã«ãã£ãŠæ¯æ¥æ±ºãŸã£ãæå»ã«ç¢ºå®çã«çºçããŠããŸããã
| æå» | ãžã§ã | æèŠæé |
|---|---|---|
| 5:18 / 13:18 / 21:18 | th-scent autolike | æå€§40å |
| 6:56 / 14:56 / 22:56 | th-scent unfollow | æå€§40å |
| 7:20 | scent-media daily-generate | â |
| 19:00 / 21:00 / 23:00 | scent-media daily-postïŒIGã«ã«ãŒã»ã«æçš¿ïŒ | â |
22:56 ã« th-scent unfollow ã .profiles/chrome-ig ãæŽã¿ã23:00 ã® daily-post ã ensure_chrome.sh ãåŒã¶ã9223 ã¯å¿çããªãã®ã§ pkill ãèµ°ãããããæ¯æ©ç¹°ãè¿ãããŠããŸããã19æã»21æã®ã¹ããããåæ§ã«ãth-scent autolike ãšæéãéãªããŸãã
Cookie SQLite ã®ç Žå£
pkill -f "user-data-dir=..." 㯠SIGTERM ã®ããš SIGKILL ãéããŸããChrome ã¯ã·ã£ããããŠã³åŠçãå®äºã§ããããããã¡ã€ã«å
ã® Cookie SQLite ãæŽåæ§ã®ããç¶æ
ã§æžãæ»ãæ©äŒã倱ããŸãã
Chrome ã¯æ¬¡åèµ·åæã«ç©ºã® Cookie DB ãäœãçŽããŸãã宿ž¬å€ã¯ããã§ãã
cookiesããŒãã«ã¯å šãã¹ãåèš3è¡ãŸã§çž®ã¿ãinstagram.comã® Cookie ã¯0è¡ãIGsessionidãæ¶ãã
2026-08-24 㯠19æã»21æã»23æã®å šã¹ãããã§æçš¿ãŒãã§ããã
watchdog ãããã°ã€ã³åãããšèª€èšºããçç±
sns-output-watchdog.sh ã® IG æçš¿ãã§ãã¯ã¯ãããªã£ãŠããŸãã
check "ig-autopost" \
"$(count_today "$CL_LOGS/sns-ig-autopost.retry.log" "$TODAY_JST" 'OK posted')" \
1 "IGã«ã«ãŒã»ã«æçš¿" \
"$CL_LOGS/sns-ig-autopost.retry.log" "$TODAY_JST"
OK posted ãåœæ¥ãã°ã«1ä»¶ããªããã° FAILED ã«ç©ãŸããDiscordã« ðš SNSåœæ¥æªåºå: ig-autopost ãé£ã³ãŸããå®éã«ãã®ã¢ã©ãŒãã¯é£ãã§ããŸãããããããã¢ã©ãŒãã®ããã¹ãã¯ãæçš¿å€±æãã§ãããpkillã«ããã»ãã·ã§ã³ç Žå£ãã§ã¯ãããŸããã
ã»ãã·ã§ã³å€å®åšã¯ãIG ã® sessionid ããªãããšæ£ããå ±åããŸãããã°ã«ã¯ need-login ãæ®ããŸãã人éãèŠããšããã°ã€ã³ãåããâåãã°ã€ã³ãããããšå€æããŸããç¿æ¥ãŸãåãæå»ã« pkill ãèµ°ããCookie ãæ¶ããŸãããã®ã«ãŒããç¹°ãè¿ãããŠããŸããã
watchdog: ðš ig-autopost æªåºå
â
session-liveness: sessionid ãç¡ãïŒæ£ããå ±åïŒ
â
人é: GUI åãã°ã€ã³ãå®è¡
â
ç¿æ¥ 22:56: th-scent ããããã¡ã€ã«ãæŽã
â
ç¿æ¥ 23:00: ensure_chrome.sh â pkill â Cookie æ¶æ»
â
watchdog: ðš ig-autopost æªåºåïŒåãå ±åãåºãïŒ
å£ããŠããåŽïŒensure_chrome.sh / scent-mediaïŒãšãå£ãããšå ±åããåŽïŒretry.log / sessionå€å®åšïŒãå¥ã®ãªããžããªã«ãããããçæ¹ã ããèªãã§ããŠã¯æ°žé ã«ç¹ãããŸãããsocial-autolike ã® config/accounts.json ã«æžããã reuseProfile ã®èšå®ã¯ãscent-media åŽã®ã³ãŒãã«ã¯äžåçŸããŸããã
ä¿®æ£ã®éªšæ Œ
ä¿®æ£ã®èŠç¹ã¯1ã€ã§ããpkill ãå šå»ããåŸ ã€ã»èŠéãã«çœ®ãæããã
# ä¿®æ£åŸã® ensure_chrome.shïŒæŠèŠïŒ
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
# ä»ããã»ã¹ãæŽãã§ãã â 10ç§ééã»æå€§420ç§ããŒãªã³ã°
for i in $(seq 1 42); do
sleep 10
pgrep -f "user-data-dir=$PROFILE" > /dev/null || break
done
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
echo "ä»ãžã§ãã䜿çšäž(pid=$(pgrep -f "user-data-dir=$PROFILE"))ãCookieç Žå£ãé¿ããããèµ·åãèŠéã" >&2
exit 2 # ãä»ã¹ãããèŠéããã®å°çšã³ãŒã
fi
fi
# ãããŸã§æ¥ããèª°ãæŽãã§ããªã â SingletonLockçã®æé€ â èµ·ååŠçãž
åŒã³åºãåŽã® daily_post.sh 㯠exit 2 ãç¬ç«ããåå²ã§åãåãããä»ã¹ãããã¯èŠéãã»æ¬¡ã¹ãããã§å詊è¡ããšã㊠exit 0 ããŸããæ€èšŒã¯ bash -n ã«ããã·ã³ã¿ãã¯ã¹ãã§ãã¯2æ¬ãgrep -c pkill ã 0 ã§ããããšãexit 2 ã®ãã¹ã57è¡ç®ã«å®åšããããšã確èªããcommit 15307d7 ã«ãŸãšããŸããã
ãªã exit 2 ããç°åžžãã«åããªãã£ãã®ããèŠéãèšèšã®åæãšãªãã1æ¥3ã¹ããããã®æå³ããã㊠watchdog ãä»åŸåãæ§é çãªç²ç¹ãæããªãããã«ããæ¹ä¿®ã«ã€ããŠã¯ã次ã®ããŒãã§åè§£ããŸãã
å®è£ ã®è©³çް
count_today() ãš has_today() ãçµ¶å¯Ÿã«æ··ããŠã¯ãããªãçç±
watchdog ãæžããšãæåã«æ©ãã®ããä»¶æ°ãŒãïŒç°åžžããèµ·åããŠããªãã ãããã®åºå¥ã§ããsns-output-watchdog.sh ã§ã¯ããã2ã€ã®ç¬ç«ãã颿°ã§æ±ã£ãŠããŸãã
# åœæ¥åã®ãã°è¡ã ãã«æåããŒã«ãŒããããæ°ããã
count_today() {
local file="$1" daymark="$2" marker="$3"
[ -f "$file" ] || { echo 0; return; }
/usr/bin/awk -v day="$daymark" -v mark="$marker" '
index($0, day) { seen = 1 }
seen && index($0, mark) { n++ }
END { print n + 0 }
' "$file"
}
# ãã®ãã°ã«ãåœæ¥ã瀺ãè¡ãèªäœããããã
has_today() {
local file="$1" daymark="$2"
[ -f "$file" ] || return 1
/usr/bin/grep -qF "$daymark" "$file"
}
count_today() ã¯ãåœæ¥ããŒã¯ãåºãè¡ä»¥éã ãã察象ã«ãããããã« awk ã® seen ãã©ã°ã䜿ã£ãŠããŸããåçŽãª grep -c marker ã§ã¯åæ¥ä»¥åã®æåè¡ãæ··å
¥ããŸãããã°ã¯ããŒããŒã·ã§ã³ããªãèšèšãªã®ã§ããã®1æ¥ãããã厩ãããšãæšæ¥æçš¿ã§ããä»¶æ°ã§ä»æ¥ãå¥å
šãšèª€å€å®ããçºçããŸãã
has_today() ãéèŠãªã®ã¯ check() ã®äžã®åå²ã§ãã
check() {
local lane="$1" count="$2" min="$3" note="$4" file="${5:-}" daymark="${6:-}"
# ...
if [ "$count" -ge "$min" ]; then
log "ok lane=$lane count=$count"
return
fi
if [ -n "$file" ] && ! has_today "$file" "$daymark"; then
UNKNOWN="${UNKNOWN:+$UNKNOWN,}$lane"
log "UNKNOWN lane=$lane åœæ¥è¡ãªã"
return
fi
FAILED="${FAILED:+$FAILED,}$lane"
}
ä»¶æ°ã min ãäžåã£ããšããhas_today() ã false ãè¿ãã° FAILED ã§ã¯ãªã UNKNOWN ã«æ¯ãåããŸãã2ã€ãæ··åšããããšãé±3åããèµ·åããªãã¬ãŒã³ãææã»æ°Žæã»éæã«æ¯æ¥ UNHEALTHY ãåºããŸããã¢ã©ãŒããä¿¡çšãããªããªã£ãç¬éã«ç£èŠã¯çµãããŸãã
count_dead_runs() ââãå®èµ°ãããææãŒããã® run ãæŽã
count_dead_runs() {
local file="$1" day="$2"
[ -f "$file" ] || { echo ""; return; }
/usr/bin/grep -a "^$day" "$file" 2>/dev/null \
| /usr/bin/grep -E 'çµäº \((need-login|circuit-break|error|rate-limit)\)' \
| /usr/bin/grep -c 'ããã:0' || true
}
2段 grep ã«ãªã£ãŠããã®ã«ã¯çç±ããããŸãã1段ç®ã®æ£èŠè¡šçŸ çµäº \((need-login|circuit-break|error|rate-limit)\) ã§ãæå®³ãªçµäºçç±ãæã€è¡ãã ãã«çµãã2段ç®ã® grep -c 'ããã:0' ã§ããã€ææãŒããã«çµããŸããrate-limit ã§éäžçµäºãããå°ãããããæŒããã±ãŒã¹ããæ»ãã runãã«ã«ãŠã³ããããšãå€éã®ç·©ãããªã¬ãŒãå¶éã§ã²ã£ããããã³ã«ã¢ã©ãŒããåºãŸãã2æ¡ä»¶ã® AND ã§ãæ¬åœã«äœãã§ããªãã£ããã«çµãã®ããã€ã³ãã§ãã
ãã®é¢æ°ã¯ææããŒã¹ã®ç£èŠã«ãŒãã§äœ¿ãããŠããŸãã
for lane in x-1 ig-1 ig-2 ig-3 ig-sug th-1 th-2 tt-1 tt-2 tt-3; do
lf="$SA_LOGS/$lane.log"
[ -f "$lf" ] || continue
likes=$(sum_likes_today "$lf" "$TODAY_UTC")
dead=$(count_dead_runs "$lf" "$TODAY_UTC")
if [ -n "$likes" ] && [ "$likes" = "0" ]; then
FAILED="${FAILED:+$FAILED,}$lane-likes0"
log "UNHEALTHY lane=$lane æ¬æ¥ã®ãããåèš=0 (ææãŒãrun=${dead:-?}å)"
elif [ -n "$dead" ] && [ "${dead:-0}" -ge 3 ]; then
FAILED="${FAILED:+$FAILED,}$lane-dead${dead}"
log "UNHEALTHY lane=$lane ææãŒãrunã${dead}å (ãããåèš=${likes})"
else
log "OK lane=$lane ãããåèš=${likes:-?} ææãŒãrun=${dead:-0}å"
fi
done
likes ã空æååã®å ŽåïŒãã¡ã€ã«èªäœãååšããªãïŒãš "0" ã®å Žåã§åå²ãç°ãªããŸãã空ã®å Žå㯠UNKNOWN ã§ã¯ãªãåçŽã« skip ããŠæ¬¡ã®ã¬ãŒã³ãžé²ã¿ãŸãããã®åŸ®åŠãªåºå¥ãããç£èŠå¯Ÿè±¡ã«ææ ŒããŠããªãã¬ãŒã³ããšã察象ãªã®ã«åããŠããªãã¬ãŒã³ããæ··åãããªãä»çµã¿ã§ãã
sum_likes_today() ã®3段ãã€ãã©ã€ã³
sum_likes_today() {
local file="$1" day="$2"
[ -f "$file" ] || { echo ""; return; }
/usr/bin/grep -a "^$day" "$file" 2>/dev/null \
| /usr/bin/grep -oE 'ããã:[0-9]+' \
| /usr/bin/grep -oE '[0-9]+' \
| /usr/bin/awk '{s+=$1} END {print s+0}'
}
ãã°ã®è¡é 㯠2026-08-24 ... 圢åŒã§å§ãŸãããã"^$day" ã§åœæ¥è¡ã«çµãã®ã1段ç®ã§ãã2段ç®ã¯ grep -oE 'ããã:[0-9]+' ã§ããŒã«ãŒä»ãæ°å€ãæœåºã3段ç®ã§æ°å€ã ãã«å¥ã㊠awk ã§åèšããŸãã2段 grep ãæãã§ããçç±ã¯ããã°è¡ã« ããã:0 ãã©ããŒ:3 ã®ããã«è€æ°ã®ããŒã«ãŒãåºãŠããããšãããã[0-9]+ ã ãã§æããš ãã©ããŒ:3 ã® 3 ãŸã§æŸã£ãŠããŸãããã§ãã
ãã©ã㌠ã®éèšãåãæ§é ã§ sum_follows_today() ãšããŠç¬ç«ããŠããŸããããããšãã©ããŒã¯ç¬ç«ããææã§ããããããã0ã§ããã©ããŒãåããŠããã±ãŒã¹ããããããå¿
ãå¥ã
ã«å€å®ããŸãã
ensure_chrome.sh ââpkill 廿¢ããèŠéãèšèšãž
ä¿®æ£ã®æ žå¿éšåãå®éã®ã³ãŒãã§ç€ºããŸããä¿®æ£åã¯1è¡ã§è§£æ±ºããããšããŠããŸããã
# ä¿®æ£åïŒCDP 9223 ãå¿çããªã â ç¡æ¡ä»¶ã§æ®ºã
pkill -f "user-data-dir=$PROFILE"
ä¿®æ£åŸã¯3段éã§ãã
# ä¿®æ£åŸ
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
# ä»ããã»ã¹ãæŽãã§ãã â 10ç§ééã»æå€§420ç§ããŒãªã³ã°
for i in $(seq 1 42); do
sleep 10
pgrep -f "user-data-dir=$PROFILE" > /dev/null || break
done
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
echo "ä»ãžã§ãã䜿çšäž(pid=$(pgrep -f "user-data-dir=$PROFILE"))ãCookieç Žå£ãé¿ããããèµ·åãèŠéã" >&2
exit 2
fi
fi
# ãããŸã§æ¥ããèª°ãæŽãã§ããªã â SingletonLock çã®æé€ â èµ·ååŠçãž
exit 2 ããç°åžžãïŒexit 1ïŒã«åããªãã£ãçç±ã¯èšèšäžã®äºå®ã«åºã¥ããŠããŸããIG ã«ã«ãŒã»ã«æçš¿ã¯1æ¥ã«19æã»21æã»23æã®3ã¹ããããããŸãã1ã¹ããããèŠéã£ãŠããæ¬¡ã¹ãããã§åãã³ã³ãã³ããæçš¿ã§ããŸããäžæ¹ exit 1 ã«ãããšãæ¯å th-scent ãšã®è¡çªæé垯㫠Discord ã¢ã©ãŒããé£ã³ç¶ããçã«ç°åžžãªã¢ã©ãŒããéé³ã«åãããŸãããèŠéããã¯å€±æã§ãæåã§ããªã第äžã®ç¶æ
ã§ããããããå°çšã®çµäºã³ãŒãã§è¡šãããšã§åŒã³åºãåŽã® daily_post.sh ãç¬ç«ããåå²ã§åãåããŸãã
SingletonLock ãªã©ã®æé€ããèª°ãæŽãã§ããªããšç¢ºèªã§ããå Žåã®ã¿ãã«ãªã£ãŠããã®ãéèŠã§ããä¿®æ£å㯠pkill ã®çŽåŸã«ç¡æ¡ä»¶ã§ rm -f SingletonLock SingletonSocket SingletonCookie ãå®è¡ããŠããŸããããããã¡ã€ã«ã誰ãã䜿çšäžã«ããã¯ãã¡ã€ã«ãæ¶ããšã䜿çšäžããã»ã¹ãã¯ã©ãã·ã¥ããããšã«ãããã¡ã€ã«ãåå£ããç¶æ
ã§æ®ããŸãã
ç§ãè©°ãŸã£ã話
ãerr.log ãèŠãŠãããââæ¯æ¥ UNKNOWN èª€å ±ãåºãŠãã2é±é
æåã® watchdog å®è£ ã§ã¯ IG æçš¿ã®ç¢ºèªå ãééããŠããŸããã
# ðŽ èª€ãïŒerr.log 㯠2026-08-09 ã§æŽæ°ãæ¢ãŸã£ãŠãã
check "ig-autopost" \
"$(count_today "$CL_LOGS/sns-ig-autopost.err.log" "$TODAY_JST" 'OK posted')" ...
å®éã«ã¯æçš¿ã®æåŠãã°ã¯ retry.log ã«åºåãããŠãããerr.log 㯠2026-08-09 ãæåŸã«æŽæ°ãæ¢ãŸã£ãŠããŸãããhas_today() ã false ãè¿ãç¶ããæ¯æ â ïž SNSç£èŠãå€å®äžèœ: ig-autopostïŒåœæ¥è¡ããã°ã«ç¡ãïŒ ã Discord ã«å±ããŸããã
çç¶ã ãèŠããšãig-autopost ã®ãã°ãå£ããŠãããã«èŠããŸããå®éã«ãã°ãå£ããŠããããã§ã¯ãªãããã¡ã€ã«åãééããŠããã ãã§ããåå ç¹å®ã«2æ¥ããããŸãããls -la ã§ãã¡ã€ã«ã® mtime ã確èªããŠåããŠæ°ã¥ãã話ã§ããã³ãŒãã«ã¯ããŸãã³ã¡ã³ããæ®ã£ãŠããŸãã
# ææã¯ err.log ã§ã¯ãªã retry.log ã«åºããerr.log 㯠2026-08-09 ã§æŽæ°ãæ¢ãŸã£ãŠããã
# ãããèŠãŠããéãæ¯æ¥ UNKNOWN èª€å ±ã«ãªã(å®éã¯åœæ¥3æ¬æçš¿ã§ããŠãã)ã
check "ig-autopost" \
"$(count_today "$CL_LOGS/sns-ig-autopost.retry.log" "$TODAY_JST" 'OK posted')" ...
ãã°ãã¡ã€ã«ãåç §ããç£èŠã¹ã¯ãªããã¯ãåç §å ãã¡ã€ã«ã® mtime ã宿çã«ç¢ºèªããä»çµã¿ãç¡ããã°ããã¡ã€ã«ãå€ããªã£ãïŒç£èŠãæ»ãã ãã«æ°ã¥ããŸããã2é±éèª€å ±ãåãåãç¶ããŠãã¢ã©ãŒããæ¥ãªãç¶æ ãšåãã§ãã
TikTok ã ãæ¥ä»ãã©ãŒããããéã
TikTok ã®ãã°ã¯ launchd ãåºåãã圢åŒãåŒãç¶ãã§ãããããæ¥ä»ãã©ãŒããããä»ã®ã¬ãŒã³ãšç°ãªã£ãŠããŸããã
# Xã»IGã»Threads: TODAY_UTC = "2026-08-24"
# TikTok ã ã: TODAY_HUMAN = "Mon Aug 24" ïŒ%e ã§æ¥ã空çœè©°ã â "Mon Aug 8"ïŒ
TODAY_HUMAN="$(date '+%a %b %e')"
%e ã¯æ¥ä»ã空çœè©°ãã§åºåããããã8æ8æ¥ã¯ Aug 8ïŒã¹ããŒã¹2ã€ïŒã«ãªããŸãã"^$TODAY_UTC" ã§ TikTok ã®ãã°ã grep ãããšãæ¥ä»åœ¢åŒãå
šãäžèŽããã«åžžã« 0ä»¶ ãè¿ã£ãŠããŸããã
tt_ok=$(count_today "$CL_LOGS/tiktok-bokuwalily.log" "$TODAY_HUMAN" 'run end (exit 0)')
tt_maybe=$(count_today "$CL_LOGS/tiktok-bokuwalily.log" "$TODAY_HUMAN" 'run end (exit 2)')
check "tt-autopost" "$((tt_ok + tt_maybe))" 1 \
"TikTokæçš¿(exit0=$tt_ok exit2=$tt_maybe)" "$CL_LOGS/tiktok-bokuwalily.log" "$TODAY_HUMAN"
ä¿®æ£ã¯ TODAY_HUMAN ã䜿ã倿°ãå¥åºãããã ãã§ãããåå ç¹å®ã§è©°ãŸã£ãçç±ã¯ãä»ã®ã¬ãŒã³ãå
šéšæ£åžžã«åããŠãããããTikTok ã®åé¡ã¯ãTikTok åŽã®äžå
·åãã«èŠãããããšã§ããã¹ã¯ãªããå
ã®ãã©ãŒãããäžæŽåã¯ãæ£åžžãªã¬ãŒã³ãšäžŠã¹ãŠæ¯èŒããªããšèŠããŸããã
ããã©ããŒæåãŒãã»å€å®äžèœ20ä»¶ãââfriendship API ã®çµã
2026-08-22 ã«è¿œå ãã count_undecidable_today() ã¯ããã®æèšããçãŸããŠããŸãã
count_undecidable_today() {
local file="$1" day="$2"
[ -f "$file" ] || { echo "0 0"; return; }
/usr/bin/awk -v day="$day" '
index($0, day) && index($0, "followæå") { success++ }
index($0, day) && index($0, "followå€å®äžèœ") { undecidable++ }
END { print success + 0, undecidable + 0 }
' "$file"
}
friendship API 㯠Instagram ã®éå
¬é API ã§ããã©ããŒé¢ä¿ã®ç¢ºèªã«äœ¿ããŸããAPI ãçµããããšããã®äººã¯çžäºãã©ããŒãïŒããå€å®ã§ããªããªãããžã§ã㯠followå€å®äžèœ ãèšé²ããªããå
ã«é²ã¿ãŸãããããã¯åé¡ãªãåããŠãããããsum_likes_today() ã®ãã§ãã¯ã¯ééããŸããå€ããèŠããšãig-1 ã¯ä»æ¥ã healthyãã®ãŸãŸã§ãã
å®éã®çç¶ã¯ ff-ig-2 ã§2255ä»¶ã®æªååãç©ã¿äžãã£ã ã§ãããã¢ã³ãã©ããŒã§ããªããŸãŸç©ã¿äžããããããã©ããŒäžéã«è¿ã¥ããããæ¥çªç¶ãã©ããŒãæ¢ãŸããŸããfollowæå=0 ã〠followå€å®äžèœ>=20 ãšããçµã¿åãããå°çšã®å€å®æ¡ä»¶ãšããŠè¿œå ããŠããŸãã
for lane in ff-ig-1 ff-ig-2 ff-ig-3; do
# ...
if [ "$follow_success" -eq 0 ] && [ "$undecidable" -ge 20 ]; then
FAILED="${FAILED:+$FAILED,}$lane-blocked"
log "UNHEALTHY lane=$lane followæå=0 å€å®äžèœ=$undecidable -> friendship APIãçµãããŠããçã"
fi
done
ãsource-follow å šãœãŒã¹ååŸå€±æãââ4åé£ç¶ã§èª°ã«ãå ±åãããªãã£ã
source-followers ã¬ãŒã³ã¯ããã©ããŒå¯Ÿè±¡ãæ¢ãããã«ãã©ãã¯ãŒãªã¹ããåéãããµãããã»ã¹ã§ãã2026-08-22 ãŸã§ç£èŠã«ãŒãã«äžåå«ãŸããŠããŸããã§ããã
# 2026-08-22 远å åã¯ããã®ã¬ãŒã³ã®ææã¯äžåºŠãç£èŠãããŠããªãã£ãã
# å®å®³: ig-sug ã 23:14/02:13/11:16/14:16 ãš4åé£ç¶ã§
# ãcoverage 0/17 -> å
šãœãŒã¹ååŸå€±æ -> exit 1ãã«ãªãæ¥æ¬¡20ä»¶ã§æ¢ãŸã£ãŠããã®ã«ã
# 誰ã«ãå ±åãããªãã£ãïŒåæå»ã« ig-3 ã14æéãŒãææïŒã
# å®äœã¯ private API ã® 429ã
ig-sug ã¯ååŸ11æã»åå2æã»åå11æã»ååŸ2æã®4ã¹ãããã§ å
šãœãŒã¹ååŸå€±æ ãåºããŠããŸãããååŸå¯Ÿè±¡17ã¢ã«ãŠã³ãã«å¯ŸããŠã«ãã¬ããž0ã®ãŸãŸ exit 1 ã§èœã¡ãŠããŸããããã¡ã€ã³ã¬ãŒã³ã§ãã ig-sug.log ã® sum_likes_today() ã¯å¥éæ£åžžã«åããŠãããããwatchdog ã®ãµããªã¯ OK ã§ããã
远å ããç£èŠã¯ source-followers-*.log ãç¬ç«ã«ãŒãã§èŠã圢ã§ãã
for lane in ig-1 ig-2 ig-3 ig-nagi ig-sug th-1 th-2 th-3 th-nagi x-1 x-2 x-nagi x-reina; do
sf="$SA_LOGS/source-followers-$lane.log"
[ -f "$sf" ] || continue
sf_dead=$(count_today "$sf" "$TODAY_UTC" 'å
šãœãŒã¹ååŸå€±æ')
if [ "$sf_dead" -ge 2 ]; then
FAILED="${FAILED:+$FAILED,}$lane-srcfollow-blocked"
log "UNHEALTHY lane=$lane-srcfollow å
šãœãŒã¹ååŸå€±æ=${sf_dead}å -> APIã¹ããããªã³ã°çã"
fi
done
sf_dead >= 2 ãéŸå€ã«ããŠããã®ã¯ãåçºã®å€±æïŒäžæç㪠429ïŒã¯æ¬¡ã® run ã§èªå·±å埩ããããã§ãã2åé£ç¶ã§å€±æããŠããã°ãã¹ããããªã³ã°ãç¶ããŠããããšå€æã§ããŸãã
pkill ã§é£ã® Cookie ãæ¯æ¥æ¶ããŠããââçç¶ãããã°ã€ã³åããã«ããèŠããªãæ§é
ãããäžçªã¿ããæªãã£ã倱æã§ããçç¶ã¯æç¢ºã§ãããIG ã® sns-ig-autopost.retry.log ã« OK posted ã1ä»¶ããªããwatchdog ãã ðš SNSåœæ¥æªåºå: ig-autopost ã Discord ã«å±ããã»ãã·ã§ã³å€å®åšã¯ sessionid ããªãïŒneed-loginïŒ ãšæ£ããå ±åããã
æ¯å GUI ã§åãã°ã€ã³ããŠããŸãããç¿æã«ã¯åŸ©æŽ»ããŠãããç¿å€ã«ã¯ãŸãæ¶ããŠããããã®ãµã€ã¯ã«ãæ°æ¥ç¶ãããInstagram ã®ã»ãã·ã§ã³æå¹æéãçããªã£ãã®ãããšãã仮説ãæã¡å§ããŠããŸããã
å®éã«ã¯ ensure_chrome.sh ã social-autolike ã® th-scent ãžã§ãã䜿ã£ãŠãããããã¡ã€ã«ãæ¯æ© pkill ããŠããŸãããth-scent 㯠Playwright ã§ Chrome ãèµ·åããŸãããCDP ããŒã 9223 ã¯éããŸãããensure_chrome.sh ããèŠããšã9223 ãéããŠããïŒæ»ãã§ããããã»ã¹ãã§ããpkill ã SIGTERM â SIGKILL ãéããChrome ã¯ã·ã£ããããŠã³åŠçãå®äºã§ãããCookie SQLite ãæŽåæ§ã®ããç¶æ
ã§æžãæ»ããŸãããæ¬¡ã®èµ·åæã« Chrome ã¯ç©ºã® Cookie DB ãäœãçŽããŸãã
åå ã倿ããã®ã¯ããã°ã®æå»ã暪䞊ã³ã§æ¯èŒãããšãã§ãã
22:56 th-scent unfollow start (.profiles/chrome-ig ãæŽã)
23:00 daily-post â ensure_chrome.sh â CDP 9223 å¿çãªã
23:00 pkill -f user-data-dir=.profiles/chrome-ig
23:00 Cookie SQLite ç Žå£ â 空㮠DB äœãçŽã
23:00 daily-post: need-login â æçš¿ãŒã
ãå£ããŠããåŽïŒensure_chrome.sh / scent-mediaïŒããšãå£ãããšå ±åããåŽïŒretry.log / session å€å®åšïŒããå¥ã®ãªããžããªã«ãããããçæ¹ã ããèªãã§ããŠãæ°žé ã«ç¹ãããŸãããsocial-autolike ã® config/accounts.json ã«ãã "reuseProfile": ".profiles/chrome-ig" ãšããèšå®ã¯ãscent-media ã®ã³ãŒãã«ã¯äžåçŸããŸããã
å
±æè³æºã®åšåžãã§ãã¯ããèªåã®æåŸ
ããã€ã³ã¿ãã§ãŒã¹ãå¿çããããã§æžããŠã¯ãããªãããšããæèšã¯ãã®ã€ã³ã·ãã³ããååºã§ããã9223 ãéããŠããã®ã¯ãæ»ãã§ãããã§ã¯ãªããèªåã®æµåã§èµ·åãããŠããªãããããããªããææè
ã®åå®ã¯ã€ã³ã¿ãã§ãŒã¹éäŸåã®ææ®µïŒpgrep / ããã¯ãã¡ã€ã«ïŒã§è¡ããkill ã¯ãèªåãèµ·åããããã»ã¹ãã«ã ãèš±ãââãã®ååããcommit 15307d7 ã® pkill 廿¢ã«ç¹ãã£ãŠããŸãã
ã€ãŸãããã€ã³ã
è€æ°ã®ãªããžããªãåã Mac ã§èµ°ãããç°å¢ã§èžãã èœãšãç©ŽãæŽçããŸããåããŒãã§è©³è¿°ãããerr.log ãã¡ã€ã«åã®ééãããTikTok ã®æ¥ä»ãã©ãŒãããå·®ç°ããfriendship API çµãããsource-follow ç£èŠæŒãããpkill ã«ãã Cookie ç Žå£ãã«å ããŠãåãæ§é ã®ç©Žãå¥ã®åœ¢ã§ãåºãŠããŸããã
-
ã¢ã³ãã©ããŒç£èŠãäžžããšååšããªãã£ãã
ig-1.unfollow.log/ig-2.unfollow.log/tt-1.unfollow.logãªã©ã®ã¢ã³ãã©ããŒã¬ãŒã³ã¯ã2026-08-17 ãŸã§ç£èŠã«ãŒãã«äžåå«ãŸããŠããŸããã§ãããå®å®³ã¯å®æž¬å€ã§åºãŠããŸããig-1ã§72æéè¶ ã®ã¢ã³ãã©ããŒæªååã712ä»¶ãig-2ã§2255ä»¶ãŸã§ç©ã¿äžãããtt-1ã11åé£ç¶ã§ã¢ã³ãã©ããŒäžèœã«ãªã£ãŠããã®ã«ãwatchdog ã¯æ¯æ¥result=healthyãè¿ããŠããŸãããã¢ã³ãã©ããŒãè©°ãŸããšãã©ããŒäžéã«è¿ã¥ããæ°æ¥åŸã«ãã©ããŒãæ¢ãŸããŸããçŽæ¥ã®çç¶ïŒãã©ããŒãæ¢ãŸã£ãïŒãšæ ¹æ¬åå ïŒã¢ã³ãã©ããŒãå ã«è©°ãŸã£ãŠããïŒã1åãããŠãããããåå ãæãã®ã«æéãããããŸãã -
ãããã詊è¡ãŒããã¯ããããææãŒãããšå¥ã®ç°åžžã
th-2ã¯likeBudget=400ã§æ¯æ¥èµ·åããŠããŸãããããã°ãèŠããšlive likeã®æååã1è¡ãåºãŠããŸããã§ããããã©ããŒã ã詊ããŠcircuit-breakã§çµãã£ãŠããã®ã§ããsum_likes_today()ã®èŠç¹ã§ã¯ããããåèš=0ããšãã1ã€ã®å€å®ã«èŠããŸãããããã詊ã¿ããå šéšåŒŸãããããšããããã1åã詊ã¿ãŠããªããã¯åå ãå šãç°ãªããŸããåè ã¯ã¢ã«ãŠã³ãå¶éãåŸè ã¯ã»ã¬ã¯ã¿äžäžèŽãã¢ã¯ã·ã§ã³ãããŒã®ãã°ã§ãããã®åºå¥ãã§ããããã«ããã®ããçŸåšã®sns-output-watchdog.sh244ã259è¡ç®ã«ãã以äžã®æ€ç¥ã«ãŒãã§ãã
# ãèµ·åãããèšé²ãããã®ã«ãããã詊è¡ãã0å = ã»ã¬ã¯ã¿äžäžèŽ/ã¢ã¯ã·ã§ã³å¶éã®çã
for lane in x-1 x-4 x-5 ig-1 ig-2 ig-3 ig-sug th-1 th-2 tt-1 tt-2 tt-3; do
lf="$SA_LOGS/$lane.log"
[ -f "$lf" ] || continue
started=$(count_today "$lf" "$TODAY_UTC" 'éå§ [')
attempts=$(count_today "$lf" "$TODAY_UTC" 'live like')
if [ "$started" -ge 1 ] && [ "$attempts" -eq 0 ]; then
FAILED="${FAILED:+$FAILED,}$lane-noattempt"
log "UNHEALTHY lane=$lane ããã詊è¡ã0å(ã»ã¬ã¯ã¿äžäžèŽ/ã¢ã¯ã·ã§ã³å¶éã®çã) èµ·å=${started}å"
fi
done
-
FAILED ãš UNKNOWN ãæ··åšããããšã¢ã©ãŒããä¿¡çšãããªããªãã é±3åããèµ·åããªãã¬ãŒã³ãæ¯æ¥
check()ã«ããããšãèµ·åããªãæ¥ã¯åœæ¥ãã°è¡ãååšããªãããä»¶æ°ãŒããšèŠãªãããæ¯æ¥FAILEDã«ç©ãŸããŸããDiscordã«ãðš SNSåœæ¥æªåºå: lane-Xããé±4æ¥å±ãç¶ãããšãããæ¥ã®çã®é害ã¢ã©ãŒããããŸãæ¥ãŠãããšããŠèªã¿é£ã°ãããŸããã¢ã©ãŒããä¿¡çšãããªããªã£ãç¬éã«ç£èŠã€ã³ãã©ã¯çµããã§ããhas_today()ã§ãåœæ¥ãã°è¡ãååšããããã確èªããè¡ãç¡ããã°UNKNOWNã«æ¯ãåããåå²ãå ¥ããåŸãèª€å ±çãäœæã§9å²ä»¥äžèœã¡ãŸããã -
UTC ãš JST ã®æ··åšã¯ãæé垯ã«ãã£ãŠã ãå£ããããã°ã«ãªãã
TODAY_JSTãšTODAY_UTCã®å·®ã¯9æéã§ããæ¥æ¬æéã®æ·±å€0æã9æã«åããžã§ããTODAY_UTCã§éèšãããšããã°ã®2026-08-24ãšããæååã忥UTCæ¥ä»ãšäžèŽããŠããŸããæ·±å€ã«å®èµ°ããææããæšæ¥ã®æåããšããŠã«ãŠã³ããããŸãã仿¥ã®ç£èŠäžã¯0ä»¶ã«èŠããFAILED ã¢ã©ãŒããé£ã³ãŸããæŒéã«åãããšåé¡ãªãééãããããããŸã«èª€å ±ãåºããã«èŠããŠåå ç¹å®ãé ããŸããsns-output-watchdog.shã®å é ã§ãã®æ··åšãæç€ºããŠããŸãã
TODAY_JST="$(date '+%Y-%m-%d')"
TODAY_UTC="$(date -u '+%Y-%m-%d')"
TODAY_HUMAN="$(date '+%a %b %e')" # launchdãåºã圢åŒãæ¥ã¯ç©ºçœè©°ããªã®ã§ %e
3倿°ã䜿ãåããåãã°ãã©ã¡ãã§åºåãããŠããããäžèŽãããããšã§è§£æ¶ããŸããããæ°ããã¬ãŒã³ã远å ãããã³ã«ç¢ºèªãå¿ èŠã§ãã
-
Discord éç¥ããµã€ã¬ã³ãã«é£ãã§ããªãå Žåãããã
notify()颿°ã¯[ -f "$DISCORD" ] || return 0ã§discord_tool.pyãååšããªãå Žåã¯éç¥ããã«æ£åžžçµäºããŸããwatchdog ã®ãã°ã«ã¯result=unhealthy lanes=ig-1-likes0ãšæ£ããæžãããŠããã®ã«ãDiscord ã«ã¯äœãå±ããªãç¶æ ãèµ·ãåŸãŸããèšçœ®åæ¥ã«ãã¹ãééã£ãŠããŠãµã€ã¬ã³ãã«éç¥ãé£ã°ãªãã£ãå®çžŸããããŸããç£èŠã¹ã¯ãªããããã¡ãããšã¢ã©ãŒããäžããŠããããèªäœã確èªããã«ã¯ãéç¥ã®åä¿¡åŽïŒDiscord ã®æçµåä¿¡æå»ïŒã§ç¢ºèªããå¿ èŠããããŸããwatchdog ã®ãã°ã ããèŠãŠãããšæ°žé ã«æ°ã¥ããŸããã -
åç §å ãã°ãã¡ã€ã«ãå€ããªã£ãŠãèª°ãæ°ã¥ããªãã
has_today()ã¯ãåœæ¥è¡ãããããã確èªããŸãããããã®ãã¡ã€ã«ãæè¿ãŸã§æŽæ°ããç¶ããŠãããããŸã§ä¿èšŒããŸããããžã§ããæ¢ãŸã£ãçŽåŸã¯has_today()ã false ãè¿ã㊠UNKNOWN ã«ãªããŸããããã¡ã€ã«ãååšããŠåœæ¥è¡ãããç¶æ ââã€ãŸãã仿¥1åã¯åãããããã®åŸã® run ãå šéšãµã€ã¬ã³ã倱æããŠãããââã¯æ€ç¥ã§ããŸãããåç §å ãã°ã®mtimeã宿çã«ç¢ºèªããä»çµã¿ãç¡ããšãç£èŠããå€ã蚌æ ã§ä»æ¥ãå€å®ãç¶ãããç¶æ ã«é¥ããŸãã -
è€æ°ãªããžããªã«ãŸãããå ±æèšå®ã¯ãèšå®ãã¡ã€ã«ã«ã ãæžãããŠãããã
social-autolike/config/accounts.jsonã«"reuseProfile": ".profiles/chrome-ig"ãšæžãããŠããŠããscent-media/scripts/ensure_chrome.shã®ã³ãŒãã«ã¯ãã®ãããã¡ã€ã«ãå¥ãªããžããªã«ã䜿ãããŠãããšããèšè¿°ã¯äžåãããŸãããæ®æ®µã¯å¥ã ã«git log/git diffãèŠãŠäœæ¥ããã®ã§æ¥ç¹ãèŠããªããŸãŸè¡çªãèµ·ãç¶ããŸããåŠç¿ããŒãlearning/shared-resource-kill-corrupts-the-neighbor.mdã«ä»åã®æèšãšããŠæžããŸããïŒãå ±æãèšå®ããåŽã§ã¯ãªããå ±æãããåŽã®ã³ãŒãã«æžããââãããçºèŠã³ã¹ããæå°åããå¯äžã®æ¹æ³ã§ãã -
å®èµ°ãã run ã®ãã¡ãæ¬åœã«äœãã§ããªãã£ã runãã¯ææãŒããšã¯å¥ã«éèšãèŠãã
rate-limitã§æ©æçµäºããã2ä»¶ã ãããããæŒããã±ãŒã¹ããæ»ãã runãã«ã«ãŠã³ããããšãå€éã®ç·©ãããªã¬ãŒãå¶éã§æ¯æ©ã¢ã©ãŒããåºãŸããcount_dead_runs()ããæå®³ãªçµäºçç±ïŒneed-login / circuit-break / error / rate-limitïŒã〠ããã:0 ã® AND æ¡ä»¶ãã«çµã£ãŠããã®ã¯ãã®ããã§ããAND ã OR ã«ããã ãã§èª€å ±çãè·³ãäžãããŸãã
ãã¹ããã©ã¯ãã£ã¹
å®éã«èžãã§çŽããèšèšååããåçŸæ§ã®ãã圢ã§ãŸãšããŸãã
1. å ±æè³æºã®åšåžãã§ãã¯ã¯ã€ã³ã¿ãã§ãŒã¹éäŸåã§è¡ã
ãCDP ããŒã 9223 ãå¿çããããã¯ãChrome ãèµ·åããŠããããã§ã¯ãªããèªåã®æµåã§èµ·åããã Chrome ãåããŠããããã®ç¢ºèªã§ããä»è
ãèµ·åããåããããã¡ã€ã«ã® Chrome ã¯ããŒããéããªããŠãååšããŸããããã»ã¹ã®åšåžç¢ºèªã¯ pgrep -f "user-data-dir=$PROFILE" ã®ããã« PID ããŒã¹ã§è¡ããã€ã³ã¿ãã§ãŒã¹ã®å¿çå¯åŠã«äŸåããªãããšã
2. kill ã¯ãèªåãèµ·åããããã»ã¹ãã«ã ãèš±ã
pkill -f <pattern> ã¯ãã¿ãŒã³ã«äžèŽããå
šããã»ã¹ãèœãšããŸãããã®ããã»ã¹ã誰ãèµ·åãããã¯åããŸãããä»è
ãèµ·åããå¯èœæ§ã1%ã§ããããªããkill ã®ä»£ããã«ãåŸ
ã£ãŠèŠéããã«åããŠãã ãããããã»ã¹ã誀çããã³ã¹ãã¯ãä»åã®å€±æãã§ã¯ãªãã埩æ§ãŸã§ã®å
šã¹ãããïŒäººéã® GUI äœæ¥ãã§ãã
3. 確ä¿ã§ããªãè³æºã¯ãäžéä»ãããŒãªã³ã° â å°çš exit ã³ãŒããã§è¿ã
# 10ç§ééã»æå€§420ç§ããŒãªã³ã°
for i in $(seq 1 42); do
sleep 10
pgrep -f "user-data-dir=$PROFILE" > /dev/null || break
done
if pgrep -f "user-data-dir=$PROFILE" > /dev/null; then
echo "ä»ãžã§ãã䜿çšäžãCookieç Žå£ãé¿ããããèµ·åãèŠéã" >&2
exit 2 # ãä»ã¹ãããã¯èŠéãã
fi
exit 1ïŒç°åžžïŒã«åããšãæ¯ã¹ãããã®è¡çªã§ Discord ã¢ã©ãŒããé£ã³ç¶ããçã®é害ãåãããŸãã1æ¥3ã¹ãããããèšèšã§ã¯ã1åèŠéãïŒæå€±ã»ãŒãŒãããšããèšèšäžã®äºå®ããããšãã ããexit 2 ããèŠéãïŒæ£åžžããšããŠæ±ããŸããã¢ã©ãŒããäžãã䟡å€ããªãç¶æ
ã«ã¯å°çšã³ãŒããå²ãåœãŠãåŒã³åºãåŽãç¬ç«åå²ã§åŠçããã
4. exit code ã§ã¯ãªããææãã°ãã§ç£èŠãã
exit 0 ã¯ãèœã¡ãªãã£ãããæå³ããã ãã§ãã2026-08-08 ã®å®æž¬ã§ ig-1 ã¯12runäž8runãtt-1 / tt-2 ã¯6å²ãããã0ä»¶ã®ãŸãŸ exit 0 ã§çµãã£ãŠããŸãããç£èŠã exit code ã ããèŠãŠããæéããã®ç¶æ
ã2é±éç¶ããŠãèª°ãæ°ã¥ããªãã£ããææã®æç¡ã¯å®éã®ãããæ°ã»ãã©ããŒæ°ã»æçš¿æ°ããã°ãã awk ã§éèšããŠå€å®ããããšã
5. ã0ä»¶ããšãåœæ¥è¡ãªãããå¿ ãåå²ã§åºå¥ãã
check() {
# ...
if [ "$count" -ge "$min" ]; then return; fi # å¥å
š
if ! has_today "$file" "$daymark"; then
UNKNOWN="${UNKNOWN:+$UNKNOWN,}$lane"; return # å€å®äžèœ
fi
FAILED="${FAILED:+$FAILED,}$lane" # ç°åžž
}
é±3åããèµ·åããªãã¬ãŒã³ã4æ¥é£ç¶ã§ FAILED ãåºãç¶ãããšãã¢ã©ãŒããããŸãæ¥ãŠããã«ãªããŸããã仿¥ã¯èµ·åããªãæ¥ã ã£ãããšã仿¥èµ·åããã0ä»¶ã ã£ãããåãã¢ã©ãŒãã«æããªãããšã
6. ææãŒãã»è©Šè¡ãŒãã»å®èµ°ãŒãã3段éã«åãã
ç£èŠã®ç²ŸåºŠã¯3段éã§äžãã£ãŠãããŸãã
| 段é | éèšãããã® | æ€ç¥ã§ããç°åžž |
|---|---|---|
| 第1段 | å®èµ°ãã run ã®æ° | ãžã§ããèœã¡ãŠããã |
| 第2段 | å®éã®ãããæ°åèš | åããŠãããææããªãç¶æ |
| 第3段 | ããã詊è¡åæ° | 詊ã¿ããçºçããŠããªãç¶æ |
第3段ãå
¥ãããŸã§ãth-2 ã®ã»ã¬ã¯ã¿äžäžèŽã¯åæä»¥äžèŠããŠããŸããã§ããã
7. ææã®çš®é¡ããšã«ç¬ç«ããç£èŠã«ãŒããæã€
æçš¿ã»ãããã»ãã©ããŒã»ã¢ã³ãã©ããŒã»ãœãŒã¹åéã¯ããããå¥ã®åŠçã§å¥ã®å€±æã¢ãŒããæã¡ãŸãã1ã€ã®ã«ãŒãã§å
šéšãèŠãããšãããšãç°ãªããææã®å®çŸ©ããæ··åšããŠèª€å€å®ãèµ·ããŸããsns-output-watchdog.sh ã¯çŸåšãæçš¿ãã§ãã¯ã»ææããŒã¹ãããæ€èšŒã»ãã©ããŒæ€èšŒã»ã¢ã³ãã©ããŒæ€èšŒã»source-follow æ€èšŒã»è©Šè¡ãŒãæ€ç¥ã®6ã«ãŒããç¬ç«ããŠæã£ãŠããŸããåé·ã«èŠããŸããããã®åé¢ããªããã°ãig-2 ã§2255ä»¶ã®ã¢ã³ãã©ããŒç©ã¿äžãããã¯çºèŠã§ããŸããã§ããã
8. å šã¬ãŒã³ãäžå 管çãããŠããã宿çã«æ£åžããã
æ°ããã¬ãŒã³ã远å ãããšããç£èŠã«ãŒããžã®è¿œå ãå¿ããããšããããŸããsource-followers-*.log ã¯2026-08-22ãŸã§ç£èŠã«å«ãŸããŠããããig-sug ã4åé£ç¶ã§å
šãœãŒã¹ååŸå€±æãèµ·ãããŠã誰ã«ãå ±åãããŸããã§ãããæ1åãèµ·åããŠãããžã§ãäžèЧãšç£èŠã«ãŒã察象ã®äžèЧãçªãåãããŠãç£èŠãããŠããªãã¬ãŒã³ããŒãã確èªããããšãã«ãŒãã£ã³ã«å
¥ããããšã
9. æ¥ä»ãã©ãŒããããæããäŸå€ãããã°å€æ°åã§æç€ºãã
date '+%Y-%m-%d' ãš date -u '+%Y-%m-%d' ãš date '+%a %b %e' ã®3çš®é¡ã䜿ãåãããªããåãã°ãã©ã®ãã©ãŒãããã§åºåããŠããããå
ã«ç¢ºèªããŠãã倿°ã«å¯Ÿå¿ãããããšãlaunchd ãåºåããã¿ã€ã ã¹ã¿ã³ã㯠%eïŒç©ºçœè©°ãïŒåœ¢åŒã«ãªãå ŽåããããŸããAug 8 ãš Aug 8 㯠grep ã§äžèŽããŸããã倿°å TODAY_HUMAN ã®ããã«**ãä»ãšåœ¢åŒãéãããšããæå³ã倿°åã«èŸŒãã**ãšãåŸããèªãã 人éãæ°ã¥ãããããªããŸãã
10. ãªããžããªããŸããå ±æã¯ãåç §ãããåŽãã®ã³ãŒãã«æ³šèšãã
ãåç
§ããåŽã®èšå®ãã¡ã€ã«ã«æžããã ãã§ã¯ãåç
§ãããåŽã®ã³ãŒããèªã人éã«ã¯èŠããŸãããensure_chrome.sh ãèªãå®è£
è
ãããã®ãããã¡ã€ã«ã¯ social-autolike ã® th-scent ã reuseProfile ã§äœ¿ã£ãŠããããç¥ã£ãŠããã°ãpkill ãæžãåã«ç«ã¡æ¢ãŸããŸããå
±æè³æºã«ã¯ã誰ãäœã®ç®çã§äœ¿ã£ãŠãããããã³ã¡ã³ãã§æžããåç
§ãããåŽã®ã³ãŒãå
ã«çœ®ãããšã
11. ããã»ã¹ã匷å¶çµäºãããšæ°žç¶ç¶æ ãå£ããåæã§èšèšãã
SIGKILL ãåããããã»ã¹ã¯ã·ã£ããããŠã³ãã³ãã©ãå®è¡ã§ããŸãããChrome ã®å ŽåãCookie SQLite ãæŽåæ§ã®ããç¶æ
ã§æžãæ»ããªããŸãŸçµäºããæ¬¡ã®èµ·åæã«ç©ºã® DB ãäœãçŽããŸãã宿ž¬å€ãšããŠãinstagram.com ã® Cookie ã0è¡ãŸã§çž®ãã ããšã確èªãããŠããŸããSQLiteã»ãã£ãã·ã¥ã»ã»ãã·ã§ã³æ
å ±ãæã€ããã»ã¹ã匷å¶çµäºããå Žåã¯ãæ°žç¶ç¶æ
ãå£ããåæã§ãªã«ããªæé ãå
ã«çšæãããããããã匷å¶çµäºããªãèšèšã«åãæ¿ããããšã
12. éç¥åºç€ãåããŠãããã©ããããéç¥ã®åä¿¡åŽãã確èªãã
watchdog ã®ãã°ã result=unhealthy ãšèšé²ããŠããŠããDiscord ã«äœãå±ããŠããªãã±ãŒã¹ããããŸããnotify() 颿°ã¯ discord_tool.py ã®ãã¹ãååšããªããã°ãµã€ã¬ã³ãã« return 0 ããŸããã¹ã¯ãªããã¯ãéç¥ã詊ã¿ãããšããèšé²ã ããæ®ããŸããç£èŠãæ£ããæ©èœããŠãããã確èªããã«ã¯ãwatchdog ã®ãã°ã ããèŠãŠããŠã¯äžååã§ããDiscord ã®æçµåä¿¡æå»ãå¥é確èªãããã宿çã«ããã¹ãéç¥ããéä¿¡ããŠåä¿¡åŽããçé確èªããããšãå¿
èŠã§ãã
13. èŠéãã¯å€±æã§ãæåã§ããªãââå°çšã®çµäºã³ãŒãã§ç¬¬äžã®ç¶æ ã衚ã
exit 0 = æå / exit 1 = 倱æ ã®2å€ã§è¶³ããªãå Žé¢ããããŸãããä»ã¹ãããã¯æ¡ä»¶ãæããªãã£ãã®ã§èŠéã£ããã¯æåã§ã¯ãªãã倱æã§ããªããexit 2 ããä»ã¹ãããã¯èŠéãããšããŠå²ãåœãŠãåŒã³åºãåŽãããããæ¬¡ã¹ãããã§å詊è¡ã»exit 0 ãšããŠæ±ããç¬ç«ããåå²ãæã€ããšã§ãã¢ã©ãŒããã€ãºãå¢ãããã«ç¶æ
ãæ£ç¢ºã«äŒããããŸãããã®èšèšãæç«ããåæã¯ã1æ¥è€æ°ã¹ãããããããšããèšèšäžã®äºå®ã§ããã¹ãããã1æ¥1åãããªããžã§ãã«èŠéãèšèšã¯åããŸããã
ãŸãšã
ä»åã®ã€ã³ã·ãã³ããäžèšã§å§çž®ãããšãèªåã®èªååããèªåã®å¥ã®èªååã®æ°žç¶ç¶æ ãæ¯æ¥å£ããŠãããã§ãã
å£ãåŽïŒensure_chrome.sh / scent-mediaïŒãšå£ãããšå ±åããåŽïŒsns-ig-autopost.retry.log / session å€å®åšïŒã¯å¥ã®ãªããžããªã«ããããããããæ£ããåããŠããŸãããensure_chrome.sh ã¯ãCDP 9223 ãå¿çããªã Chrome ããã»ã¹ããæ£ããæ€åºããŠãããsession å€å®åšã¯ãIG sessionid ããªãããšæ£ããå ±åããŠããã人éãèŠããšãIG ããã°ã€ã³åããèµ·ããããã«ããèŠããŸããã
ãããæãã¿ãã®æªãéå®³ã®æ§é ã§ãããå ±åãæ£ãããã§ãåå ãå¥ã®ãšããã«ãããââãã®åã¯ãçç¶ãã©ãã ã詳ãã远ã£ãŠãåå ã«èŸ¿ãçããŸãããsns-output-watchdog.sh ã®ææãã°ãš launchd ã®èµ·åæå»ã暪䞊ã³ã§ç
§ããåããã22:56 ã® th-scent unfollow éå§ãš 23:00 ã® ensure_chrome.sh å®è¡ã4åå·®ã§ããããšã確èªãããšãã«åããŠã2ã€ã®ãªããžããªãæ¥ç¶ããŸãããåŠç¿ããŒã learning/shared-resource-kill-corrupts-the-neighbor.md ã«èšé²ããäžè¬åœ¢ããã®ãŸãŸä»åŸã®èšèšå€æã®åºæºã«ãªã£ãŠããŸãã
ä¿®æ£ã®ã³ã¢ã¯ pkill ã1è¡åãããšã§ããpkill -f "user-data-dir=$PROFILE" ãæãã10ç§ééã®æå€§420ç§ããŒãªã³ã°ãš exit 2ïŒèŠéãïŒã«çœ®ãæãã commit 15307d7 ã¯ãã³ãŒããšããŠ10è¡ãå¢ããŠããŸãããããããåããããã¡ã€ã«ãå¥ãªããžããªã䜿ã£ãŠããããšããæèãç¡ããã°ããã®1è¡ãåã倿ã«ãã©ãçããŸããã
sns-output-watchdog.sh ã¯çŸåš270è¡è¶
ã®ã¹ã¯ãªããã«ãªã£ãŠããŸããX æçš¿ã»ãããã»ãªãã©ã€ / IG æçš¿ã»ãããã»ãã©ããŒã»ã¢ã³ãã©ã㌠/ Threads 2ã¢ã«ãŠã³ã / TikTok / source-followers 13ã¬ãŒã³ââãããããç°ãªãææå®çŸ©ãæã¡ãç¬ç«ããéèšé¢æ°ã§æ¯æ¥å€å®ãããŸããæåã®ããŒãžã§ã³ã¯ãexit code ã 0 ãªãå¥å
šãã ããèŠãŠããŸããããããã count_today() / has_today() / count_dead_runs() / sum_likes_today() / count_undecidable_today() ãšé¢æ°ãå¢ãããã³ã«ãèŠããŠããªãã£ããç¡é³ã®å€±æãã1ã€ãã€æµ®ãã³äžãã£ãŠããŸããã
SNS åºç€ãã建ãŠããã ãã§çµãããããšãå£ããç¬éãããåããŠããäœã§æ¢ãŸã£ãŠãããç¶æ ã«ãªããŸããIG æçš¿ã7/29ããæ¢ãŸã£ããŸãŸ2é±éæ°ã¥ããªãã£ãã®ãåºçºç¹ã§ããã171æ¬ã®ãžã§ããåããŠãããã©ããã§ã¯ãªãã171æ¬ã®ãžã§ããå®éã«ææãåºããŠãããã©ãããæ¯æ¥ç¢ºèªã§ããä»çµã¿ã®äžã«ãä»ã®æå120äžã®åºç€ã¯ä¹ã£ãŠããŸãã
èªååã¯ãåããå·¥çšããšãç£èŠã§ããç¶æ ã«ããå·¥çšãã®2ã€ãã»ããã§ããã©ã¡ããæ¬ ããŠããã仿ããŸããã£ãŠããã®ã倱æããŠããã®ãããèªåã§ææ¡ã§ããŸãããææ¡ã§ããªããã°ãæ¬¡ã®æã¡æã倿ã§ããŸããã
ä»çµã¿ã®å šäœåã»æ120äžã®å èš³ã»30æ¥æé ã¯æænoteã«ãŸãšããŠããŸãã
ð Claude CodeèªåŸç°å¢ã§ãå®éã©ã皌ãã â ä»çµã¿ã»å®äŸã»å§ãæ¹ã»ãµããŒã
LilyïŒ@bokuwalilyïŒâ å人éçºè ãClaude Code ã§èªåååºç€ãçµã¿ãªãããiOSã¢ããªãWebãµãŒãã¹ãéç£ããŠããŸã
- AIã§ãå¯ãŠãŠãåãä»çµã¿ããäœã£ãŠæ120äžã«ãã話㯠noteã®ææèšäº ã«ð°
- OSS: github.com/bokuwalily ð
- ææ°æ å ±ã»ãåãåãã㯠X @bokuwalily ãžð
- AIå°å ¥ã»èªååã®çžè«ãšå®è£ ãã³ãã¬7æ¬ã®é åžã¯ å ¬åŒLINE ããð¬
çããã® â€ïž ãã·ã§ã¢ãå±ã¿ã«ãªããŸãïŒ