debug-run.js•3.93 kB
import dotenv from "dotenv";
import process from "process";
import { scrapeProfile } from "./scraper.js";
import { generateReport } from "./report.js";
dotenv.config();
function parseArgs(rawArgs) {
const args = { includeRaw: false };
for (let i = 2; i < rawArgs.length; i += 1) {
const current = rawArgs[i];
switch (current) {
case "--username":
case "-u":
args.username = rawArgs[++i];
break;
case "--max-posts":
case "-m":
args.maxPosts = Number(rawArgs[++i]);
break;
case "--headless":
args.headless = rawArgs[++i] !== "false";
break;
case "--no-headless":
args.headless = false;
break;
case "--storage-state":
case "-s":
args.storageStatePath = rawArgs[++i];
break;
case "--include-raw":
args.includeRaw = true;
break;
case "--model":
args.model = rawArgs[++i];
break;
case "--wait-until":
args.waitUntil = rawArgs[++i];
break;
case "--quiet":
args.quiet = true;
break;
case "--verbose":
args.verbose = true;
break;
case "--help":
case "-h":
args.help = true;
i = rawArgs.length; // exit loop
break;
default:
if (!args.username) {
args.username = current;
} else {
console.warn(`Unrecognised argument: ${current}`);
}
break;
}
}
return args;
}
function printHelp() {
console.log(`Usage: node src/debug-run.js [options] <username>
Options:
-u, --username <handle> Instagramハンドル (@なしでも可)
-m, --max-posts <number> 取得する投稿数 (最大50)
--headless <true|false> Playwrightのヘッドレス設定を上書き
--no-headless 常にヘッドレス無しで実行
-s, --storage-state <path> storageState.json のパス
--include-raw レスポンスに生JSONを表示
--model <name> OpenAIモデルを指定
--wait-until <event> Playwright page.goto の waitUntil (既定: domcontentloaded)
--verbose 進捗ログを詳細表示
--quiet ログ出力を抑制
-h, --help このヘルプを表示
例:
node src/debug-run.js tanaka_insta
node src/debug-run.js --username tanaka_insta --max-posts 6 --no-headless --verbose
`);
}
async function main() {
const args = parseArgs(process.argv);
if (args.help) {
printHelp();
return;
}
const username = args.username;
if (!username) {
printHelp();
throw new Error("ユーザー名を指定してください");
}
const logPrefix = args.verbose ? "[debug]" : "";
const logger = args.quiet
? undefined
: (message) => {
if (args.verbose) {
console.log(`${logPrefix} ${message}`);
} else {
// 非verboseでも簡易ログは表示
console.log(message);
}
};
const scrapeOptions = {
maxPosts: Number.isFinite(args.maxPosts) ? args.maxPosts : undefined,
headless: args.headless,
storageStatePath: args.storageStatePath,
waitUntil: args.waitUntil,
logger,
};
if (!args.quiet) {
console.log(`➡️ ${username} のプロフィールを取得します...`);
}
const profileData = await scrapeProfile(username, scrapeOptions);
if (!args.quiet) {
console.log("✅ スクレイピング完了");
}
const report = await generateReport(profileData, { model: args.model, logger });
console.log("\n--- 要約 ---\n");
console.log(report.summary);
if (args.includeRaw) {
console.log("\n--- 生JSON ---\n");
console.log(JSON.stringify(profileData, null, 2));
}
}
main().catch((error) => {
console.error("デバッグ実行中にエラーが発生しました:", error.message);
process.exitCode = 1;
});