現在「保留」、進捗 80%。工程は全9件中 8件完了。
残りの工程: slnm_lacoco.py修正
最新報告「slnm_lacoco.py修正」(2026-05-25 23:08:40)
負荷があり、他のジョブに影響などのため
ASPデータの取得タスクをメンテンナンス
現状の負荷を下げる
https://gyazo.com/9b6571bfb3398adfe757d24471d3acd5
https://plus-creative.xyz/nakata/asp_data/
https://plustest:plussp@data-organizing.com/
Claude Code
対象: asp_data_get/slnm_lacoco.py (lacoco 日別報酬の取得)
referrer 側と同方針。本番データを書き換えずに、どの工程で落ちているか / 報酬額がどう積算されているかを実測する。ファイル名は本番と同名のまま (原本は bak/ に退避済)。
工程ごとに [STEP0]〜[STEP9] のタグ付きログを標準出力 + /tmp/slnm_lacoco_debug/run_<日時>.log へ出力。
DRY_RUN=1 python3 /var/www/html/asp_data_get/slnm_lacoco.py
DRY_RUN=1 FORCE_SCRAPE=1 python3 /var/www/html/asp_data_get/slnm_lacoco.py
link_name in data['link_name'] が TypeError: 'in if insert_reward == "Err" で文字列比較しており、条件が常に False。referrer 版とあわせて ConoHa へ設置し DRY_RUN=1 で実走 → ログと画面キャプチャで原因を確定 → 上記 1〜5 の修正方針を決定。
Claude Code
対象: data-organizing_lacoco_pluslacoco_referrer_get.py
本番へデータを送らずに、どの工程で落ちているかを実測するデバッグ版を作成。ファイル名は本番と同名のまま (差し替えて実行 / 原本は bak/ に退避済)。
工程ごとに [STEP1]〜[STEP7] のタグ付きログを標準出力 + /tmp/lacoco_debug/run_<日時>.log へ出力。
DRY_RUN=1 python3 /var/www/html/asp_referrer/data-organizing_lacoco_pluslacoco_referrer_get.py
デバッグ版を ConoHa へ設置し DRY_RUN=1 で実走 → ログと画面キャプチャで原因を確定 → 修正方針を決定。
中田
python3 /var/www/html/asp_referrer/data-organizing_lacoco_pluslacoco_referrer_get.py
ソース確認ポイント
- ブラウザの起動
- ログイン
- レポートページ遷移
- CSVダウンロード
- CSVデータ取得
- データのAPI送信
中田
現状反映未設定
/var/www/html/_asp_referrer
/var/www/html/_asp_data_get
タイミングを見てテスト確認後、
ディレクトリをリネームし反映
Claude
asp_data_get / asp_referrer の両ディレクトリで、Python と shell のハードコード機密値を .env_asp に切出し。
.env_asp (chmod 600) を _lib_env.py の env() で読込。shell は set -a; . .env_asp; set +a で読込https://plus-creative.xyz/nakata/conoha_server_plus/report/
.env_asp 経路に整合
中田
ソースの整理をしてアップ。
https://github.com/PLUS-Company/asp_data_get
https://github.com/PLUS-Company/asp_referrer
→ファイル、ソース整理中
ファイル構成などが整ったら共有
中田
使用しているソースをGitHubにアップし、そこで管理する設定に切り替える
1.現ソースのダウンロード
2.現ソースの整理(.envなど切り分け)
3.リポジトリ作成( asp_data_getとasp_referrerの2種)
4.ソースのアップ
中田
https://plus-creative.xyz/nakata/conoha_server_plus/report/
00概要 / システム全体像
01アーキテクチャ
02サーバ環境(ConoHa VPS)
03受け先サイト環境(PHP / SQLite)
04cron 一覧(3 本)
05取得スクリプト #1: asp_data_get
06取得スクリプト #2: asp_referrer
07受け先サイト #1: ASPデータ(plus-creative.xyz)
08受け先サイト #2: ASP Referrer(data-organizing.com)
09データフロー / 連携先一覧
10運用・メンテナンス手順
11トラブルシューティング
12リスク・改善点
13アーカイブ ダウンロード
14ローカル取得状況
中田
必要ライブラリ/ファイルの設置と構成を更にわかりやすく記述する
以下conohaサーバーでPLUS社関連のcronです。
その関連ファイルを
/Users/nakatafumito/dev/htdocs/conoha_server_plus/conoha_data
にダウンロード。
利用していないバックアップや不要ファイルもあるため、実際に使用しているものを揃える。
またその内容について
/Users/nakatafumito/dev/htdocs/conoha_server_plus/reportにindex.phpで作成。
cron:
[nakata@160-251-6-246 ~]$ crontab -l
MAILTO=
中田
中田
Claude
前提読み: comment_id=1054(同タスク内)に「ファイル構成・ログ・直近実行結果・打ち手候補」を投稿済み。本コメントはその続編。
ConoHa上の /var/www/html/asp_data_get/ 配下14スクリプトを driver.quit() / try-finally の有無で分類:
| スクリプト | try/finally | driver.quit() | 残留リスク |
|---|---|---|---|
| slnm_a8.py | 部分的 | 0回 | あり |
| slnm_a8_2.py | 部分的 | 0回 | あり |
| slnm_a8_3.py | 部分的 | 0回 | あり |
| slnm_a8_4.py | 部分的 | 0回 | あり |
| slnm_felma.py | 部分的 | 0回 | あり |
| slnm_a8_5.py | 権限600で読めず | ? | ? |
| slnm_accesstrade.py | あり | あり | 低 |
| slnm_afib.py | あり | あり | 低 |
| slnm_janet.py | 無 | あり(try外) | 例外時残留 |
| slnm_janet_200xxxx ×4 | 無 | あり(try外) | 例外時残留 |
| slnm_tgafi.py | あり | あり | 低(リファレンス) |
| slnm_lacoco.py | あり | あり | 低(Phase 1修正済) |
結論: driver.quit() を一度も呼んでいない a8 / a8_2 / a8_3 / a8_4 / felma の 5本 + 1(a8_5 想定)= 6本 が、観測された残留6本と数が一致。
/home/claude/asp_data_get_bak/20260427/slnm_a8_5.py のみ権限 -rw------- (600 / owner: nakata) で claude ユーザーから読めず未バックアップリストア手順(claude → nakata 権限が必要):
ssh conoha
sudo -u nakata cp -p /home/claude/asp_data_get_bak/20260427/<filename> /var/www/html/asp_data_get/<filename>
リファレンスは slnm_tgafi.py(既に options=options + try/finally + driver.quit() の最適化済み形)。
Options() 生成箇所に追加:options.add_argument("--disable-dev-shm-usage")options.add_argument("--disable-gpu")options.add_argument("--window-size=1280,720")webdriver.Chrome(chrome_options=options) → webdriver.Chrome(options=options) に統一try: ... finally: try: driver.quit() except Exception: pass で囲うslnm_a8.py から1本だけパッチ → ConoHa上で単体実行 → 成功 + プロセス残留なしを確認janet_200xxxx)に try/finally 追加asp_data_get.sh 一括実行 → output.txt とプロセス残留チェックssh conoha "ps aux | grep -E 'chrome|python.*slnm' | grep -v grep; echo '---'; free -h"
output.txt は 毎回 rm -f → 上書き で履歴が残らない。Phase 2 着手前に asp_data_get.sh のリダイレクト先を output_$(date +%Y%m%d).txt 等にローテーション化するのが筋(comment_id=1054 の打ち手 C)。観察期間を要する Phase 2 効果検証のため先に整備するのが望ましい。
slnm_lacoco.py line 178:
TypeError: 'in <string>' requires string as left operand, not float
原因: lacoco_sales_datas の link_name に float 値が混入。
修正案(型ガード):
if isinstance(data.get('link_name'), str) and link_name in data['link_name']:
これは Phase 1 のスコープ外として残されている案件。Phase 2 と独立して着手可能。
ssh conoha で接続。User: claude / Port: 2122)/var/www/html/asp_data_get/(owner: nakata)asp_data_get.sh が冒頭で pkill -f chromedriver → 14本順次実行 → send_mail.pyoutput.txt(毎回上書き、履歴なし)lifework.link/task_manage への投稿は 必ず https://lifework.link/task_manage/api/?action=comment.create + role: admin で行う。HTML フォーム経由(/task_manage/detail/?id=XXX への POST)は class=user 扱いで「対応者 未読」になる事故がある(2026-04-27 / comment_id=1053 の誤投稿で確定)。memory に feedback として保存済み。
中田
メモ
asp_referrer:
/var/www/html/asp_referrer/data-organizing_asp_referrer_get.sh
[conohaVPS:160.251.6.246]
asp_data_get:
/var/www/html/asp_data_get/asp_data_get.sh
[conohaVPS:160.251.6.246]
asp_referrer:
https://data-organizing.com/
[sv16152.xserver.jp]
asp_data_get:
https://plus-creative.xyz/nakata/asp_data/
[plus-x9.xsrv.jp]
Claude
/var/www/html/asp_data_get/ (owner: nakata)asp_data_get.sh — pkill chromedriver/chrome → 14本のslnm_*.pyを順次実行 → send_mail.py--disable-dev-shm-usage / --disable-gpu / --window-size=1280,720 反映済み/var/www/html/asp_data_get/output.txt の 1ファイル単独rm -f output.txt → { ... } >> output.txt 2>&1 で上書きFile "slnm_lacoco.py", line 178, in <module>
if link_name in data['link_name']:
TypeError: 'in <string>' requires string as left operand, not float
07:44 起動の chromedriver が 6本残っている:
nakata 812716/812798/812879/812963/813044/813127 chromedriver --port=...
swap 使用 170MB / 全体 mem 510MB available。
Phase 1 で driver.quit() を保証したのに残留している ← lacoco以外の13本がオプション/quit保証未対応のままだから。lacoco は14番目(最後)なので、6本残るのは a8 系/felma/janet 系の可能性が高い。
| 課題 | 現状 |
|---|---|
| lacoco TypeError | 未解決(line 178 / link_name が float)。Phase 1のスコープ外 |
| Chromedriver残留 | lacoco 1本だけ修正でも他13本が原因で発生継続 |
| ログ保存 | 上書き運用で履歴なし → 観察期間の意味が薄い |
if isinstance(data.get('link_name'), str) and link_name in data['link_name']:)個人的には C → A → B の順が筋がいい(観察基盤を先に作らないと B の効果検証ができない)。
/var/www/html/asp_data_get/ (owner: nakata)asp_data_get.sh — pkill chromedriver/chrome → 14本のslnm_*.pyを順次実行 → send_mail.py--disable-dev-shm-usage / --disable-gpu / --window-size=1280,720 反映済み/var/www/html/asp_data_get/output.txt の 1ファイル単独rm -f output.txt → { ... } >> output.txt 2>&1 で上書きFile "slnm_lacoco.py", line 178, in <module>
if link_name in data['link_name']:
TypeError: 'in <string>' requires string as left operand, not float
07:44 起動の chromedriver が 6本残っている:
nakata 812716/812798/812879/812963/813044/813127 chromedriver --port=...
swap 使用 170MB / 全体 mem 510MB available。
Phase 1 で driver.quit() を保証したのに残留している ← lacoco以外の13本がオプション/quit保証未対応のままだから。lacoco は14番目(最後)なので、6本残るのは a8 系/felma/janet 系の可能性が高い。
| 課題 | 現状 |
|---|---|
| lacoco TypeError | 未解決(line 178 / link_name が float)。Phase 1のスコープ外 |
| Chromedriver残留 | lacoco 1本だけ修正でも他13本が原因で発生継続 |
| ログ保存 | 上書き運用で履歴なし → 観察期間の意味が薄い |
if isinstance(data.get('link_name'), str) and link_name in data['link_name']:)個人的には C → A → B の順が筋がいい(観察基盤を先に作らないと B の効果検証ができない)。
Claude
/var/www/html/asp_data_get/ に書込権限なし(Permission denied)SERVER/key/conoha/20201011180445.pem)→ 書込権限確保| 項目 | 値 |
|---|---|
| Chrome | 86.0.4240.75 |
| ChromeDriver | 86 |
| selenium | 3.141.0 |
--headless=new 使用可否 |
不可(Chrome 109+必須)→ --headless 維持で確定 |
options=options 新API |
動作OK(selenium 3.141でも通る) |
driver.close() のみ組/var/www/html/asp_data_get/_bak/20260423/slnm_lacoco.py.original に cp -a で保全--disable-dev-shm-usage / --disable-gpu / --window-size=1280,720webdriver.Chrome(chrome_options=options) → webdriver.Chrome(options=options)try: ... finally: driver.quit() で囲んで例外時quit保証driver.quit()(単独行)は finally に移動したため削除asp_data_get.sh とは独立)=== BEFORE: chrome processes: 0 ===
=== RUN slnm_lacoco.py ===
データがないので、スクレイピングしてアップロードします
スクレイピングします
before
after
Traceback (most recent call last):
File "slnm_lacoco.py", line 178, in <module>
if link_name in data['link_name']:
TypeError: 'in <string>' requires string as left operand, not float
=== elapsed: 19s ===
=== AFTER RUN: chrome processes: 0 === ← 残留ゼロ確認
TypeError は既知(別タスク #2135)。ポイントは 例外時でも driver.quit() が finally で確実実行された点。旧コードでは L172 の TypeError 発生で L163 の単独 driver.quit() に到達せずプロセス残留していた。
Phase 2(残り13本への一括適用)は lacoco の数日観察後に判断。
# 07:50 以降に確認
ssh conoha "ps -ef | grep -c chrome; free -h; tail -30 /var/www/html/asp_data_get/output.txt"
chromedriver プロセスだけ残るパターン vs chrome 本体も残るパターン)cp _bak/20260423/slnm_lacoco.py.original ./slnm_lacoco.py2〜3日運用観察 → 中田側から Phase 2 の GO/NO-GO を投げてもらう。
中田
修正箇所を特定。lacocoは既に driver.quit() が存在するので(L163)、主な改善は以下4点:
L163 の driver.quit() は finally に移動
TypeError部(L172)はdriverスコープ外のため触らない(別タスク #2135)。修正版を作成
Claude
Phase 1(lacoco単体試験)完了。結果は成功。
/var/www/html/asp_data_get/_bak/20260423/slnm_lacoco.py.original/var/www/html/asp_data_get/slnm_lacoco.py (7,212 → 7,518 bytes)/Workspace/20260423/asp_data_get_chromedriver_fix/--disable-dev-shm-usage / --disable-gpu / --window-size=1280,720webdriver.Chrome(chrome_options=options) → webdriver.Chrome(options=options) (新API統一)try:...finally: driver.quit() で囲み、例外時にも必ず quit される形にdriver.quit() は finally に移動したので削除| 項目 | 値 |
|---|---|
| 実行前 chromeプロセス | 0 |
| 実行中 | before → after(driver起動)→ CSV DLまで正常 |
| TypeError発生行 | L178(try外)。別タスクで対応予定 |
| 実行後 chromeプロセス | 0 ← driver.quit() が finally で確実に呼ばれた |
| 実行時間 | 19秒 |
| swap 変化 | 164MB → 164MB(単体なので変化なし) |
--headless=new は不可。--headless 維持で確定options=options 新API は正常動作作業開始時のサーバ状態で ps -ef | grep chrome = 6プロセス残存(前回実行終了から3時間経過後)。
原因: driver.close() のみで driver.quit() が呼ばれないスクリプト(a8系5本+felma等)が終了処理で chromedriver プロセスを殺せていなかったため。
Phase 2 で同じパッチを残り13本に適用すれば、asp_data_get.sh 全体として swap 消費が下がる見込み。
残り13本への適用順(lacocoと同じ3つの修正のみ):
1. driver.close() のみで driver.quit() 未呼出の組(swap残留の主犯): slnm_a8, _2, _3, _4, _5, slnm_felma
2. 既に driver.quit() はあるが古いAPI の組: slnm_accesstrade, slnm_afib, slnm_janet(×5)
3. 既に新APIで修正済み: slnm_tgafi(追加するなら disable-dev-shm-usage 等の3行のみ)
着手判断待ち。Phase 2 続行可否を返してほしい。
Claude
サーバ状態(現時点)
- uptime 15日、load 0.00、Mem 147MiB/818MiB、Swap 178MiB/2GiB
- 今朝07:44の実行直後スナップショット。プロセス残存なし(pkill効いてる)
- 既に asp_data_get.sh 先頭に pkill -f chromedriver 入り
スクリプト構成(15本、全部 nakata ユーザー所有・パス /var/www/html/asp_data_get/)
- slnm_a8 / _2 / _3 / _4 / _5 / felma / accesstrade / afib / janet×5 / tgafi / lacoco
- 全て Selenium+Chromedriver。構造はほぼ同一
共通する重い原因(grep結果から確定)
| 症状 | 該当ファイル |
|---|---|
| driver.close() のみで driver.quit() 未呼出(プロセス残存) | slnm_a8.py, slnm_felma.py ほか(a8系5本・felma など) |
| chrome_options=options(Selenium 4で削除済みの旧API) | tgafi以外の13本 |
| --disable-dev-shm-usage / --disable-gpu / --headless=new 未指定 | 全15本 |
| try/finally でdriver保証なし | tgafi以外 |
tgafi.py だけは既に options=options と try/except/finally: driver.quit() に改修済(コメント「chrome_options → options に修正」あり)。これが良いテンプレートになる。
lacoco の TypeError は別タスク。今回はChromedriver調整のみに限定する。
options = Options()
options.add_argument('--headless=new') # Chrome 109+前提で置換、ダメなら '--headless'
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage') # 追加
options.add_argument('--disable-gpu') # 追加
options.add_argument('--window-size=1280,720') # 追加
driver = webdriver.Chrome(options=options) # chrome_options= を廃止
try:
...既存処理...
finally:
try: driver.quit()
except: pass
| リスク | 対応 |
|---|---|
| --headless=new がサーバChrome未対応 | Phase 0でバージョン確認、旧ならfallbackで --headless のまま |
| selenium旧版で options=options が通らない | Phase 1のfelmaで即検知、通らなければ pip show で selenium バージョン確認し判断 |
| 本番cronと手動実行が衝突 | 07:40〜08:00は避ける |
| nakataユーザー権限(claudeでsshしてる) | スクリプトは nakata nakata 所有。書き込みに sudo 必要かは Phase 0最初で touch で試す。失敗したら作業手順を切り替える |
この3点合意できたらPhase 0から動く。
Claude
コメント#1042の調査結果をもとに、残り2項目の解釈を整理。着手前の方針確認用。
TypeError: in <string> requires string as left operand, not floatin 演算子を使っている箇所がある。Lacoco側のレスポンス仕様変更で、以前は文字列だった値が数値型で返ってきている可能性が高い。str(value) への明示キャスト、または数値比較への切り替えdriver.quit() とプロセス kill を徹底。--headless=new / --disable-dev-shm-usage / --no-sandbox 等のメモリ抑制オプションを付与(堅実)タスク441は進捗60%。前半3項目(負荷調査・最適化・ログイン設定)は完了済み。この2件が残りの実作業で、完了後にチェックリスト #1987「動作確認・負荷テスト」へ進む。
着手の許可が出てから実作業に入る。
中田
ASP発生額収集:
asp_data_get/asp_data_get.sh
毎日 朝07:40
Selenium + Chrome で15スクリプト逐次実行。A8(5種)・Felmat・AccessTrade・AfiB・Janet(4種)・TGAFI・Lacoco
ASPリファラー取得:
asp_referrer/asp_referrer_get.sh
毎日 (daily CSV生成あり)
A8/AfiB/Felmat/Lacoco のリファラーデータ取得。curlベースで軽量
最も重いのは asp_data_get.sh
Chromedriver を毎回6プロセス起動してSeleniumでスクレイピング。今日07:44に実行された痕跡あり(output.txt 07:47更新)。swap 212MB消費の主因はこれの可能性が高い。
slnm_lacoco.py
TypeError: 'in
lacoco の結果取り込みが失敗している
中田
https://pub.a8.net/a8v2/media/loginAction.do
Service Temporarily Unavailable
The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
plus03のみ取得できていなかった。
アカウント情報に変更あったか?
ログインスクリプトエラーか?
中田
https://data-organizing.com/report_check.php?date=2026-04-12
負荷となっている 確定情報停止(承認・キャンセル)の送信停止
→crontab コメント化
中田
Claude
【2026-03-31 作業内容】
■ report_check.php 新規作成(旧report_test.php)
- report.phpのメインテーブル下に以下2セクションを追加
1. データ未取得のスクリプト一覧(asp/accountがDBに存在しない場合に表示)
- asp_dataの発生額が0 → OK(成果なし)
- asp_dataの発生額が0超 → NG(取得漏れ)
2. 総合判定テーブル
- report.php合計 vs asp_data合計を比較
- 一致 → 「完璧」表示、不一致 → 差額表示
■ asp_dataサイト(plus-creative.xyz/nakata/asp_data/)
- status00〜03.phpに合計行を追加
■ ページ間遷移
- report.php → report_check.php リンク追加(日付引き継ぎ)
- report_check.php → report.php 戻りリンク追加
アップロードはユーザー側で実施予定。
Claude
パスワード変更後から不動作。対象スクリプト:
- /var/www/html/asp_referrer/data-organizing_asp_referrer_get.sh
- /var/www/html/asp_referrer/data-organizing_confirm_asp_referrer_get.sh
cat /var/log/cron.log | tail -50
bash /var/www/html/asp_referrer/data-organizing_asp_referrer_get.sh
スクリプト内のID/PW記述箇所を確認:
grep -n "password\|passwd\|login\|user" /var/www/html/asp_referrer/data-organizing_asp_referrer_get.sh
ls -la /var/www/html/asp_referrer/
chmod +x が必要なケースset -x # シェルスクリプト先頭に追加
exec >> /var/log/asp_referrer_debug.log 2>&1
実行結果を /var/log/asp_referrer_debug.log に出力して原因を絞り込む
run-parts等)パスワード変更後の不動作なので、スクリプト内の認証情報が古いままの可能性が最も高い。Step 1→3を優先的に確認する。
中田
test
Claude
アカウント情報(パスワード)を変更後、不具合発生。
asp_referrerのスクレイピングがうまく実行されない。
原因を調査し、修正、様子を見ていく。
Claude
タスク情報を補完しました。
中田
本日、以下ページのAfiB以下が自動取得がとまっていた
https://plus-creative.xyz/nakata/asp_data/
JANet(pp1037642)
JANet(pp2005790)
JANet(pp2005141)
JANet(pp2007625)
JANet(pp2007788)
TGaffi(plus-tg)
調査、修正対応
lacoco 実測結果と修正内容 (2026-07-28) ※チェックリスト #2135
ConoHa 上で DRY_RUN=1 (= API へ書き込まない) で実走し、原因を確定した。
実測でわかったこと
サーバ環境は python 3.6.8 / selenium 3.141.0 / pandas 1.1.4 / Chrome 86。
前回コメントで挙げた「Selenium 4 で旧 API が削除されている」という推測は誤りだった。selenium は 3 系のままで、find_element_by_* は正常に動く。
ログイン → 日付入力 → CSV ダウンロードまでは両スクリプトとも完全に成功していた。不動作の原因はスクレイピングではなく、ダウンロード後のデータ処理側にあった。
原因1: 成果 0 件の日に異常終了する (slnm_lacoco.py)
ラココの CSV は成果が 0 件の日でも、中身が空のダミー行を 1 行返す。この行の「リンク」列が NaN (float) になり、' requires string as left operand, not float で落ちる。本番コードはこの集計処理が try の外にあるため、そのまま異常終了して報酬が登録されない。
link_name in data['link_name']が TypeError: 'in管理画面で確認したところ、ラココの成果は 2026-04-19 を最後に発生していない。つまり 04-20 以降は毎日この経路で落ちていた。
原因2: 成果があった日も報酬 0 円で登録されていた (slnm_lacoco.py)
成果のあった 2026-04-19 を TARGET_DATE 指定で再取得したところ、CSV は正常に取得でき型エラーも 0 件だったが、報酬額は 0 のままだった。
CSV のリンク名 : 美容器CP_水着ピンク脱毛完全ガイド (https://xn--eckp2g630n3ukyzxne8a.com/)
単価表のリンク名 : 美容器CP脱毛完全ガイド (https://xn--eckp2g630n3ukyzxne8a.com/)
「水着ピンク_」が入った新しいリンク名が単価表に無いため照合が成立しない。旧コードは照合できなかった行を黙って素通りする作りで、警告も出ないまま報酬 0 円として登録される。成果は発生しているのに金額が計上されない状態だった。
原因3: エラー通知が一度も飛ばない仕組みだった
if insert_reward == "Err"は int と文字列の比較なので条件が常に False。原因1・原因2 のどちらが起きても通知されず、気づけない構造になっていた。マスタ (単価表) と照らし合わせる仕組み
ラココの CSV の「金額」列は実額ではなく常に 1 が入っている。そのため実際の報酬額は、成果が発生した LP のリンク名をキーに単価表を引いて算出する設計になっている。
: listingSite / 48000
: listingSite / 48000
: halfPrice / 24000
: etc / 42000
: etc / 42000
: listingSite / 48000
今回入れた修正
slnm_lacoco.py
1. 空行・NaN を集計対象から除外。成果 0 件の日は報酬 0 で正常終了するようにした (原因1 の解消)
2. 照合ループの向きを「成果行ごとに単価表を引く」形に是正。旧コードは 単価表 x 成果行 の二重ループで、1 行が複数の単価表項目に当たると多重加算する構造だった。当たった最初の 1 件で確定させる
3. halfPrice の二重加算を解消。旧コードは halfPrice の分岐で price を足したうえ、直後の共通処理でも price を足しており、報酬額が過大になっていた。加算は 1 行につき 1 回だけにした
4. 単価表に無いリンク名を unmatched として記録し、ログに STEP7-UNMATCH として出力するようにした (原因2 の可視化)
5. エラー通知の条件を修正。常に False だった
insert_reward == "Err"をやめ、単価表に無いリンク名を検出したときに通知を送る形にした。件名と本文に該当リンク名を列挙する (原因3 の解消)data-organizing_lacoco_pluslacoco_referrer_get.py
6. 列数チェックの閾値を 13 から 16 に是正。参照する最大列が row[15] なのに 13 列で通しており、13〜15 列の行が IndexError になる状態だった
7. 空行スキップを追加。管理ID とクリック日時がどちらも空の行は成果行ではないと判定して弾く。旧コードはこれを弾かず、成果 0 件の日に全項目が空のレコードを毎日 API へ登録していた
なお referrer 側は 2026-04-19 のデータ取得自体は正常で、クリック日時・成果日時・リンク・リファラ・ステータスがすべて正しく取れることを確認済み。
残っている判断事項