{"_id":"@dskhys/mf-scraper","name":"@dskhys/mf-scraper","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@dskhys/mf-scraper","version":"0.0.1","description":"MoneyForward portfolio scraper","license":"ISC","author":"","type":"module","main":"dist/index.js","bin":{"mf-scraper":"dist/index.js"},"scripts":{"prebuild":"node scripts/generate-version.js","build":"tsc","login":"tsx src/login.ts","start":"tsx src/index.ts","test":"vitest run","typecheck":"tsc --noEmit"},"dependencies":{"playwright":"^1.40.0"},"devDependencies":{"@types/node":"^24.10.4","tsx":"^4.21.0","typescript":"~5.9.3","vitest":"^4.0.16"},"gitHead":"6d898fff5da7c933fa8adaf2c680ba3d3bc46725","types":"./dist/index.d.ts","_id":"@dskhys/mf-scraper@0.0.1","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-XHS10cFL+oxtKFicPFRxR8VKymFss2dykjk1hDazgp43wQDdlE+tw1Msm8MttcX6R9BQDt19XWdxLnsr4zajkg==","shasum":"7714203ea7057385f2b39c008daf5311ef0a855a","tarball":"https://registry.npmjs.org/@dskhys/mf-scraper/-/mf-scraper-0.0.1.tgz","fileCount":65,"unpackedSize":162138,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDP44CsNXKUHs5d1QCgXtNLTYf0qtwDq6sZvxko4EPFwQIgIQmAxhNuRfUg8svv3+1ffxOsvOLve5tVsm1KTVEn5cE="}]},"_npmUser":{"name":"dskhys","email":"dskhys@outlook.com"},"directories":{},"maintainers":[{"name":"dskhys","email":"dskhys@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mf-scraper_0.0.1_1768346337600_0.38705992466381267"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-13T23:18:57.532Z","0.0.1":"2026-01-13T23:18:57.750Z","modified":"2026-01-13T23:18:57.908Z"},"maintainers":[{"name":"dskhys","email":"dskhys@outlook.com"}],"description":"MoneyForward portfolio scraper","license":"ISC","readme":"# mf-scraper\r\n\r\nMoneyForward からポートフォリオデータをスクレイピングして、API サーバーに送信するバッチアプリケーション。\r\n\r\nPlaywright を使用して Chromium ブラウザで MoneyForward にアクセスし、ポートフォリオ情報を取得します。\r\n\r\n## 機能\r\n\r\n- 🔐 Playwright による自動スクレイピング\r\n- 🔒 セッション管理（初回ログイン時に保存）\r\n- 🛡️ データ暗号化（AES-256-GCM）\r\n- 📡 REST API 経由でサーバーに送信\r\n- ⏰ 定期実行対応（cron / systemd-timer）\r\n\r\n## インストール\r\n\r\n### npm グローバルインストール\r\n\r\n```bash\r\nnpm install -g @dskhys/mf-scraper\r\n```\r\n\r\n### pnpm グローバルインストール\r\n\r\n```bash\r\npnpm add -g @dskhys/mf-scraper\r\n```\r\n\r\n### ローカル開発インストール\r\n\r\n```bash\r\n# リポジトリをクローン\r\ngit clone https://github.com/dskhys/dskhys.git\r\ncd dskhys/packages/client/mf-scraper\r\n\r\n# 依存関係をインストール\r\npnpm install\r\n\r\n# ビルド\r\npnpm build\r\n\r\n# グローバルリンク（開発時）\r\npnpm link --global\r\n```\r\n\r\n## セットアップ\r\n\r\n### 1. 設定ファイルを作成\r\n\r\n設定ファイルの場所：\r\n\r\n- **Linux/macOS**: `~/.config/mf-scraper/config.json`\r\n- **Windows**: `%USERPROFILE%\\.config\\mf-scraper\\config.json`\r\n\r\n必要な内容：\r\n\r\n```json\r\n{\r\n  \"encryptionKey\": \"Base64エンコードされた32バイトのキー\",\r\n  \"apiUrl\": \"https://api.example.com\",\r\n  \"apiUsername\": \"APIサーバーのユーザー名\",\r\n  \"apiPassword\": \"APIサーバーのパスワード\"\r\n}\r\n```\r\n\r\n**ファイル権限の設定（Linux/macOS）:**\r\n\r\n```bash\r\nchmod 600 ~/.config/mf-scraper/config.json\r\n```\r\n\r\n### 2. MoneyForward にログイン\r\n\r\n```bash\r\nmf-scraper login\r\n```\r\n\r\n実行内容：\r\n\r\n1. ブラウザが開く\r\n2. メールアドレスとパスワードを入力\r\n3. 2FA コードを入力（有効な場合）\r\n4. ログイン完了を自動検知\r\n5. セッション情報が `~/.config/mf-scraper/auth.json` に保存\r\n\r\n### 3. スクレイピングを実行\r\n\r\n```bash\r\nmf-scraper\r\n```\r\n\r\n初回実行時は Playwright がブラウザをダウンロードします（1-5 分）。\r\n\r\n## 使用方法\r\n\r\n### コマンド一覧\r\n\r\n```bash\r\nmf-scraper                 # ポートフォリオをスクレイピング（デフォルト）\r\nmf-scraper login           # MoneyForward にログイン\r\nmf-scraper --help          # ヘルプを表示\r\nmf-scraper --version       # バージョン情報を表示\r\n```\r\n\r\n### スクレイピング実行\r\n\r\n```bash\r\nmf-scraper\r\n```\r\n\r\n実行内容：\r\n\r\n1. 設定ファイルを読み込み\r\n2. API サーバーにログイン\r\n3. MoneyForward のログイン状態を確認\r\n4. ポートフォリオデータを取得\r\n5. データを AES-256-GCM で暗号化\r\n6. API サーバーに送信\r\n\r\n## 定期実行\r\n\r\n### systemd-timer による定期実行（推奨）\r\n\r\nsystemd-timer は cron の代替で、ログ管理が優れています。\r\n\r\n#### 1. サービスファイルを作成\r\n\r\n`~/.config/systemd/user/mf-scraper.service` を作成：\r\n\r\n```ini\r\n[Unit]\r\nDescription=MoneyForward Portfolio Scraper\r\nAfter=network-online.target\r\nWants=network-online.target\r\n\r\n[Service]\r\nType=oneshot\r\nExecStart=/home/YOUR_USERNAME/.npm/_npx/mf-scraper/bin/mf-scraper.js\r\nStandardOutput=journal\r\nStandardError=journal\r\nSyslogIdentifier=mf-scraper\r\n```\r\n\r\n**注意:**\r\n\r\n- `YOUR_USERNAME` を自分のユーザー名に置き換え\r\n- npm グローバルインストール先を確認：`npm bin -g`\r\n\r\nまたは、以下で npm の bin パスを自動で取得：\r\n\r\n```bash\r\nnpm_bin=$(npm bin -g)\r\nsed \"s|ExecStart=.*|ExecStart=$npm_bin/mf-scraper|\" ~/.config/systemd/user/mf-scraper.service\r\n```\r\n\r\n#### 2. タイマーファイルを作成\r\n\r\n`~/.config/systemd/user/mf-scraper.timer` を作成：\r\n\r\n```ini\r\n[Unit]\r\nDescription=MoneyForward Portfolio Scraper Timer\r\nRequires=mf-scraper.service\r\n\r\n[Timer]\r\n# 毎日午前 3 時に実行\r\nOnCalendar=*-*-* 03:00:00\r\n# マシンがスリープ中だった場合、起動時に実行\r\nPersistent=true\r\n\r\n[Install]\r\nWantedBy=timers.target\r\n```\r\n\r\n**タイマースケジュール例:**\r\n\r\n```ini\r\n# 毎日午前 3 時\r\nOnCalendar=*-*-* 03:00:00\r\n\r\n# 毎日午前 3 時 30 分\r\nOnCalendar=*-*-* 03:30:00\r\n\r\n# 毎日午前 0 時と午後 12 時\r\nOnCalendar=*-*-* 00,12:00:00\r\n\r\n# 毎週月曜日午前 3 時\r\nOnCalendar=Mon *-*-* 03:00:00\r\n\r\n# 毎月 1 日午前 3 時\r\nOnCalendar=*-*-01 03:00:00\r\n```\r\n\r\n#### 3. タイマーを有効化・起動\r\n\r\n```bash\r\n# ユーザーサービスとして有効化\r\nsystemctl --user daemon-reload\r\nsystemctl --user enable mf-scraper.timer\r\nsystemctl --user start mf-scraper.timer\r\n\r\n# 起動確認\r\nsystemctl --user status mf-scraper.timer\r\n```\r\n\r\n#### 4. 実行状況確認\r\n\r\n```bash\r\n# タイマーの実行履歴\r\njournalctl --user -u mf-scraper.timer -n 10 --no-pager\r\n\r\n# サービスの実行ログ\r\njournalctl --user -u mf-scraper.service -n 50 --no-pager\r\n\r\n# リアルタイム監視\r\njournalctl --user -u mf-scraper.service -f\r\n```\r\n\r\n#### 5. トラブルシューティング\r\n\r\n**タイマーが起動しない:**\r\n\r\n```bash\r\n# タイマーの状態確認\r\nsystemctl --user list-timers mf-scraper.timer\r\n\r\n# サービスファイルの検証\r\nsystemd-analyze verify ~/.config/systemd/user/mf-scraper.service\r\n\r\n# ユーザー systemd サービス有効化確認\r\nsystemctl --user is-enabled mf-scraper.timer\r\n```\r\n\r\n**手動テスト:**\r\n\r\n```bash\r\n# サービスを直接実行\r\nsystemctl --user start mf-scraper.service\r\n\r\n# ログを確認\r\njournalctl --user -u mf-scraper.service -n 20 --no-pager\r\n```\r\n\r\n### cron による定期実行（代替案）\r\n\r\nsystemd-timer の代わりに cron を使用することもできます：\r\n\r\n```bash\r\n# crontab エディタを開く\r\ncrontab -e\r\n\r\n# 毎日午前 3 時に実行\r\n0 3 * * * /usr/local/bin/mf-scraper >> ~/.local/share/mf-scraper.log 2>&1\r\n```\r\n\r\n**ログファイル管理（logrotate）:**\r\n\r\n`/etc/logrotate.d/mf-scraper` を作成：\r\n\r\n```txt\r\n~/.local/share/mf-scraper.log {\r\n    daily\r\n    rotate 7\r\n    compress\r\n    delaycompress\r\n    missingok\r\n    notifempty\r\n    create 0640 $USER $USER\r\n}\r\n```\r\n\r\n## トラブルシューティング\r\n\r\n### コマンドが見つからない\r\n\r\n```bash\r\n# npm の bin ディレクトリを確認\r\nnpm bin -g\r\n\r\n# PATH に含まれているか確認\r\necho $PATH | grep -o '[^:]*npm[^:]*'\r\n```\r\n\r\n**解決方法（Linux/macOS）:**\r\n\r\n```bash\r\n# ~/.bashrc または ~/.zshrc に追加\r\nexport PATH=\"$(npm bin -g):$PATH\"\r\n\r\n# 再度ログインするか、以下で再読み込み\r\nsource ~/.bashrc  # または source ~/.zshrc\r\n```\r\n\r\n### ブラウザのダウンロード失敗\r\n\r\n```bash\r\n# Playwright キャッシュをクリア\r\nrm -rf ~/.cache/ms-playwright\r\n\r\n# 再度実行\r\nmf-scraper\r\n```\r\n\r\n### セッションが期限切れ\r\n\r\n```bash\r\n# ログイン情報を更新\r\nmf-scraper login\r\n```\r\n\r\n### systemd-timer が実行されない\r\n\r\n**サービスファイルの ExecStart パスが間違っている:**\r\n\r\n```bash\r\n# 実際の npm の bin パスを確認\r\nnpm bin -g\r\n# 例: /home/user/.npm/_npx/mf-scraper\r\n\r\n# サービスファイルを更新\r\nnano ~/.config/systemd/user/mf-scraper.service\r\n# ExecStart=/full/path/to/mf-scraper に修正\r\n\r\n# 再読み込みして起動\r\nsystemctl --user daemon-reload\r\nsystemctl --user restart mf-scraper.timer\r\n```\r\n\r\n### ログが表示されない\r\n\r\n```bash\r\n# journald がユーザーログを記録しているか確認\r\njournalctl --user -n 10\r\n\r\n# システムジャーナルを確認\r\nsudo journalctl -u mf-scraper.timer -n 10\r\n```\r\n\r\n## セキュリティ\r\n\r\n### 設定ファイルの保護\r\n\r\n```bash\r\n# ファイルの所有者のみが読取可能\r\nchmod 600 ~/.config/mf-scraper/config.json\r\nchmod 600 ~/.config/mf-scraper/auth.json\r\n\r\n# ディレクトリの権限も確認\r\nchmod 700 ~/.config/mf-scraper\r\n```\r\n\r\n### API パスワードの管理\r\n\r\n- 設定ファイルのパスワードは定期的に変更\r\n- API トークンベースの認証への移行を検討\r\n\r\n### セッションの有効期限\r\n\r\nMoneyForward のセッションは一定期間で期限切れになります。\r\n定期的に `mf-scraper login` で更新してください：\r\n\r\n```bash\r\n# 毎月 1 日に手動でログイン更新\r\n# または以下で自動化\r\n0 3 1 * * /usr/local/bin/mf-scraper login\r\n```\r\n\r\n## 開発\r\n\r\n### リポジトリ構成\r\n\r\n```txt\r\npackages/client/mf-scraper/\r\n├── src/\r\n│   ├── index.ts          # メインエントリポイント\r\n│   ├── login.ts          # ログイン処理\r\n│   ├── scraper.ts        # スクレイピング処理\r\n│   ├── api.ts            # API クライアント\r\n│   ├── config.ts         # 設定ファイル管理\r\n│   ├── encrypt.ts        # 暗号化処理\r\n│   └── version.ts        # バージョン情報（ビルド時に自動生成）\r\n├── scripts/\r\n│   └── generate-version.js  # ビルド時のバージョン自動生成スクリプト\r\n├── package.json\r\n├── tsconfig.json\r\n├── vitest.config.ts\r\n└── README.md\r\n```\r\n\r\n### バージョン管理\r\n\r\nバージョンは自動採番されます。手動更新は不要です。\r\n\r\n**ビルド時に自動生成される流れ:**\r\n\r\n```txt\r\n1. pnpm build を実行\r\n   ↓\r\n2. prebuild スクリプト実行\r\n   - git rev-parse --short HEAD でコミットハッシュを取得\r\n   - src/version.ts を自動生成\r\n   ↓\r\n3. TypeScript をコンパイル\r\n   - dist/version.js が生成される\r\n   ↓\r\n4. mf-scraper --version で表示\r\n   mf-scraper 0.0.0+git.6d898ff\r\n     ↑コミットハッシュが含まれる\r\n```\r\n\r\n**バージョン形式:**\r\n\r\n```txt\r\n0.0.0+git.{7文字のコミットハッシュ}\r\n```\r\n\r\n例:\r\n\r\n- `0.0.0+git.6d898ff`\r\n- `0.0.0+git.abc1234`\r\n\r\n**バージョン確認:**\r\n\r\n```bash\r\n# ビルド後\r\nmf-scraper --version\r\n# mf-scraper 0.0.0+git.6d898ff\r\n\r\n# または npm info で確認\r\nnpm info @dskhys/mf-scraper\r\n```\r\n\r\n### ビルド\r\n\r\n```bash\r\npnpm build\r\n```\r\n\r\n実行内容:\r\n\r\n1. `scripts/generate-version.js` でコミットハッシュから version.ts を自動生成\r\n2. TypeScript を JavaScript にコンパイル（`dist/` に出力）\r\n\r\n**ビルド時の出力例:**\r\n\r\n```txt\r\n✓ Version generated: 0.0.0+git.6d898ff\r\n  Git Hash: 6d898ff\r\n  Build Date: 2026-01-13T22:50:45.159Z\r\n```\r\n\r\n### テスト\r\n\r\n```bash\r\npnpm test\r\n```\r\n\r\nvitest でユニットテストを実行。\r\n\r\n### リント\r\n\r\n```bash\r\npnpm lint\r\n```\r\n\r\nbiome でコードをチェック・フォーマット。\r\n\r\n## ライセンス\r\n\r\nISC\r\n\r\n## サポート\r\n\r\n問題が発生した場合：\r\n\r\n1. [トラブルシューティング](#トラブルシューティング) を確認\r\n2. ログを確認：`journalctl --user -u mf-scraper.service`\r\n3. GitHub Issues で報告\r\n\r\n## 参考リンク\r\n\r\n- [Playwright 公式ドキュメント](https://playwright.dev/docs/intro)\r\n- [systemd.timer マニュアル](https://www.freedesktop.org/software/systemd/man/systemd.timer.html)\r\n- [Node.js npm グローバルインストール](https://docs.npmjs.com/cli/v10/commands/npm-install)\r\n","readmeFilename":"README.md","_rev":"1-1b4296587211561ebd76345ae7e19752"}