diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/fetch-logoform-events.mjs | 75 |
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}`, |
