aboutsummaryrefslogtreecommitdiffhomepage
path: root/scripts/fetch-logoform-events.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/fetch-logoform-events.mjs')
-rw-r--r--scripts/fetch-logoform-events.mjs75
1 files changed, 62 insertions, 13 deletions
diff --git a/scripts/fetch-logoform-events.mjs b/scripts/fetch-logoform-events.mjs
index f499d47..650e530 100644
--- a/scripts/fetch-logoform-events.mjs
+++ b/scripts/fetch-logoform-events.mjs
@@ -5,27 +5,77 @@
// ただし Node の fetch では 403 になるため、curl を使って取得している。
//
// 使い方:
-// node scripts/fetch-logoform-events.mjs # イベント情報(procedure id 49006)
-// node scripts/fetch-logoform-events.mjs 48668 # 電子申請(手続き一覧)
+// node scripts/fetch-logoform-events.mjs # イベント情報(49006)
+// node scripts/fetch-logoform-events.mjs 49789 # 市議会からのお知らせ
// node scripts/fetch-logoform-events.mjs 49006 --json
+// node scripts/fetch-logoform-events.mjs --uri 2524 # 手続きページの番号から自動で調べる
//
-// procedure id は、手続きページの設定に "id" として入っている。
-// 2517(イベント情報)は 49006、666(電子申請)は 48668。
+// 手続きページ(https://logoform.jp/procedure/exdH/<uri>)の内部IDは、
+// ページを開いたときに呼ばれる一覧APIのURL(.../detail/search/<id>)に出る。
+// --uri を指定すると、ブラウザで開いてそのURLからIDを調べる。
+//
+// 既知の内部ID:
+// 49006 … exdH/2517 イベント情報
+// 48668 … exdH/666 電子申請(手続き一覧)
+// 49789 … exdH/2524 市議会からのお知らせ
import { execFileSync } from 'node:child_process';
-const DEFAULT_ID = '49006';
+const KNOWN_IDS = {
+ '2517': '49006',
+ '666': '48668',
+ '2524': '49789',
+};
+
+const UA =
+ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
+
const args = process.argv.slice(2);
const asJson = args.includes('--json');
-const procedureId = args.find((a) => /^\d+$/.test(a)) ?? DEFAULT_ID;
+const uriIndex = args.indexOf('--uri');
+const uri = uriIndex >= 0 ? args[uriIndex + 1] : null;
+const directId = args.find((a) => /^\d+$/.test(a));
-const PAGE = procedureId === '48668'
- ? 'https://logoform.jp/procedure/exdH/666'
- : 'https://logoform.jp/procedure/exdH/2517';
+let procedureId = directId ?? '49006';
-const UA =
- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
+if (uri) {
+ procedureId = KNOWN_IDS[uri] ?? (await discoverId(uri));
+}
+
+/** 手続きページをブラウザで開き、一覧APIのURLから内部IDを調べる */
+async function discoverId(procedureUri) {
+ const { chromium } = await import('playwright');
+ const browser = await chromium.launch({
+ args: ['--disable-blink-features=AutomationControlled', '--no-sandbox'],
+ });
+ const context = await browser.newContext({
+ locale: 'ja-JP',
+ userAgent: UA,
+ viewport: { width: 1400, height: 1000 },
+ });
+ await context.addInitScript(() => {
+ Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
+ });
+
+ let found = null;
+ const page = await context.newPage();
+ page.on('response', (res) => {
+ const match = res.url().match(/\/api\/procedure\/branch\/detail\/search\/(\d+)/);
+ if (match) found = match[1];
+ });
+
+ await page.goto(`https://logoform.jp/procedure/exdH/${procedureUri}`, {
+ waitUntil: 'domcontentloaded',
+ timeout: 60000,
+ });
+ for (let i = 0; i < 10 && !found; i++) await page.waitForTimeout(2000);
+ await browser.close();
+
+ if (!found) throw new Error(`内部IDが分かりませんでした(exdH/${procedureUri})`);
+ return found;
+}
+// 空のオブジェクトで全件返る。page などの項目を足すと「不明な項目」で弾かれる。
const curlArgs = [
'-s',
'--max-time',
@@ -37,10 +87,9 @@ const curlArgs = [
'-H',
'Accept: application/json',
'-H',
- `Referer: ${PAGE}`,
+ `Referer: https://logoform.jp/procedure/exdH/${uri ?? '2517'}`,
'-H',
`User-Agent: ${UA}`,
- // 空のオブジェクトで全件返る。page などの項目を足すと「不明な項目」で弾かれる。
'-d',
'{}',
`https://logoform.jp/api/procedure/branch/detail/search/${procedureId}`,