Skip to content

Instantly share code, notes, and snippets.

@tatsuyasusukida
Last active August 26, 2022 06:07
Show Gist options
  • Save tatsuyasusukida/f96228a9389603c767feab06f697e23f to your computer and use it in GitHub Desktop.
Save tatsuyasusukida/f96228a9389603c767feab06f697e23f to your computer and use it in GitHub Desktop.
出発地 到着地 利用カード種別 運賃 マイル プレミアムポイント
新潟 札幌(新千歳) ANAカード ゴールド 運賃1 691 1507
新潟 札幌(新千歳) ANAカード ゴールド 運賃2 576 1322
新潟 札幌(新千歳) ANAカード ゴールド 運賃3 461 1138
新潟 札幌(新千歳) ANAカード ゴールド 運賃4 461 738
新潟 札幌(新千歳) ANAカード ゴールド 運賃5 345 953
新潟 札幌(新千歳) ANAカード ゴールド 運賃6 345 753
新潟 札幌(新千歳) ANAカード ゴールド 運賃7 345 553
新潟 札幌(新千歳) ANAカード ゴールド 運賃8 230 369
新潟 札幌(新千歳) ANAカード ゴールド 運賃9 691 1107
新潟 札幌(新千歳) ANAカード ゴールド 運賃10 461 738
新潟 札幌(新千歳) ANAカード ゴールド 運賃11 322 516
新潟 札幌(新千歳) ANAカード ゴールド 運賃12 230 369
新潟 札幌(新千歳) ANAカード ゴールド 運賃13 137 221
新潟 東京(成田) ANAカード ゴールド 運賃1 312 901
新潟 東京(成田) ANAカード ゴールド 運賃2 260 817
新潟 東京(成田) ANAカード ゴールド 運賃3 208 734
新潟 東京(成田) ANAカード ゴールド 運賃4 208 334
新潟 東京(成田) ANAカード ゴールド 運賃5 156 650
新潟 東京(成田) ANAカード ゴールド 運賃6 156 450
新潟 東京(成田) ANAカード ゴールド 運賃7 156 250
新潟 東京(成田) ANAカード ゴールド 運賃8 103 167
新潟 東京(成田) ANAカード ゴールド 運賃9 312 501
新潟 東京(成田) ANAカード ゴールド 運賃10 208 334
新潟 東京(成田) ANAカード ゴールド 運賃11 145 233
新潟 東京(成田) ANAカード ゴールド 運賃12 103 167
新潟 東京(成田) ANAカード ゴールド 運賃13 62 100
新潟 名古屋(中部) ANAカード ゴールド 運賃1 466 1147
新潟 名古屋(中部) ANAカード ゴールド 運賃2 388 1022
新潟 名古屋(中部) ANAカード ゴールド 運賃3 311 898
新潟 名古屋(中部) ANAカード ゴールド 運賃4 311 498
新潟 名古屋(中部) ANAカード ゴールド 運賃5 232 773
新潟 名古屋(中部) ANAカード ゴールド 運賃6 232 573
新潟 名古屋(中部) ANAカード ゴールド 運賃7 232 373
新潟 名古屋(中部) ANAカード ゴールド 運賃8 155 249
新潟 名古屋(中部) ANAカード ゴールド 運賃9 466 747
新潟 名古屋(中部) ANAカード ゴールド 運賃10 311 498
新潟 名古屋(中部) ANAカード ゴールド 運賃11 217 348
新潟 名古屋(中部) ANAカード ゴールド 運賃12 155 249
新潟 名古屋(中部) ANAカード ゴールド 運賃13 92 149
新潟 大阪(伊丹) ANAカード ゴールド 運賃1 588 1342
新潟 大阪(伊丹) ANAカード ゴールド 運賃2 490 1185
新潟 大阪(伊丹) ANAカード ゴールド 運賃3 392 1028
新潟 大阪(伊丹) ANAカード ゴールド 運賃4 392 628
新潟 大阪(伊丹) ANAカード ゴールド 運賃5 293 871
新潟 大阪(伊丹) ANAカード ゴールド 運賃6 293 671
新潟 大阪(伊丹) ANAカード ゴールド 運賃7 293 471
新潟 大阪(伊丹) ANAカード ゴールド 運賃8 196 314
新潟 大阪(伊丹) ANAカード ゴールド 運賃9 588 942
新潟 大阪(伊丹) ANAカード ゴールド 運賃10 392 628
新潟 大阪(伊丹) ANAカード ゴールド 運賃11 273 439
新潟 大阪(伊丹) ANAカード ゴールド 運賃12 196 314
新潟 大阪(伊丹) ANAカード ゴールド 運賃13 117 188
新潟 大阪(関西国際) ANAカード ゴールド 運賃1 588 1342
新潟 大阪(関西国際) ANAカード ゴールド 運賃2 490 1185
新潟 大阪(関西国際) ANAカード ゴールド 運賃3 392 1028
新潟 大阪(関西国際) ANAカード ゴールド 運賃4 392 628
新潟 大阪(関西国際) ANAカード ゴールド 運賃5 293 871
新潟 大阪(関西国際) ANAカード ゴールド 運賃6 293 671
新潟 大阪(関西国際) ANAカード ゴールド 運賃7 293 471
新潟 大阪(関西国際) ANAカード ゴールド 運賃8 196 314
新潟 大阪(関西国際) ANAカード ゴールド 運賃9 588 942
新潟 大阪(関西国際) ANAカード ゴールド 運賃10 392 628
新潟 大阪(関西国際) ANAカード ゴールド 運賃11 273 439
新潟 大阪(関西国際) ANAカード ゴールド 運賃12 196 314
新潟 大阪(関西国際) ANAカード ゴールド 運賃13 117 188
新潟 福岡 ANAカード ゴールド 運賃1 1072 2116
新潟 福岡 ANAカード ゴールド 運賃2 893 1830
新潟 福岡 ANAカード ゴールド 運賃3 715 1544
新潟 福岡 ANAカード ゴールド 運賃4 715 1144
新潟 福岡 ANAカード ゴールド 運賃5 536 1258
新潟 福岡 ANAカード ゴールド 運賃6 536 1058
新潟 福岡 ANAカード ゴールド 運賃7 536 858
新潟 福岡 ANAカード ゴールド 運賃8 357 572
新潟 福岡 ANAカード ゴールド 運賃9 1072 1716
新潟 福岡 ANAカード ゴールド 運賃10 715 1144
新潟 福岡 ANAカード ゴールド 運賃11 500 800
新潟 福岡 ANAカード ゴールド 運賃12 357 572
新潟 福岡 ANAカード ゴールド 運賃13 213 343
新潟 沖縄(那覇) ANAカード ゴールド 運賃1 1972 3556
新潟 沖縄(那覇) ANAカード ゴールド 運賃2 1643 3030
新潟 沖縄(那覇) ANAカード ゴールド 運賃3 1315 2504
新潟 沖縄(那覇) ANAカード ゴールド 運賃4 1315 2104
新潟 沖縄(那覇) ANAカード ゴールド 運賃5 986 1978
新潟 沖縄(那覇) ANAカード ゴールド 運賃6 986 1778
新潟 沖縄(那覇) ANAカード ゴールド 運賃7 986 1578
新潟 沖縄(那覇) ANAカード ゴールド 運賃8 657 1052
新潟 沖縄(那覇) ANAカード ゴールド 運賃9 1972 3156
新潟 沖縄(那覇) ANAカード ゴールド 運賃10 1315 2104
新潟 沖縄(那覇) ANAカード ゴールド 運賃11 920 1472
新潟 沖縄(那覇) ANAカード ゴールド 運賃12 657 1052
新潟 沖縄(那覇) ANAカード ゴールド 運賃13 393 631
import fsPromises from 'fs/promises';
import test from "@playwright/test";
import { sources, destinations, cards, fares } from "./input.json";
test('HTMLを取得します', async ({ page }) => {
const sleep = 5000
const timeout = sources.length * destinations.length
* cards.length * fares.length * sleep * 2
test.setTimeout(timeout)
const url = 'https://cam.ana.co.jp/amcmember/SimulationJaResult'
// 事前アクセス(初回アクセス時にエラーページが表示されるため)
await page.goto(url)
fsPromises.mkdir('tmp/fetch', { recursive: true })
for (const source of sources) {
for (const destination of destinations) {
for (const card of cards) {
for (const fare of fares) {
// ANAフライトマイル・プレミアムポイントシミュレーションページへアクセス
await page.goto(url)
// 出発地の選択
await page.locator('#DepApo_ticket').selectOption(source.code)
// 到着地の選択
await page.locator('#ArrApo_ticket').selectOption(destination.code)
// 利用カード種別の選択
await page.locator('#cardList_kind').selectOption(card.code)
// 利用運賃の選択
await page.locator('#fareList_section').selectOption(fare.code)
// 次へ(計算する)ボタンをクリック&ページ遷移を待機
await Promise.all([
page.waitForNavigation(),
page.locator('.btn_c a').click(),
])
const basename = [source.code, destination.code, card.code, fare.code].join('-')
fsPromises.writeFile(`tmp/fetch/${basename}.html`, await page.content())
await page.screenshot({ path: `tmp/fetch/${basename}.png` })
// 優しさ
await page.waitForTimeout(sleep)
}
}
}
}
})
{
"sources": [
{ "name": "新潟", "code": "KIJ" }
],
"destinations": [
{ "name": "札幌(新千歳)", "code": "CTS" },
{ "name": "東京(成田)", "code": "NRT" },
{ "name": "名古屋(中部)", "code": "NGO" },
{ "name": "大阪(伊丹)", "code": "ITM" },
{ "name": "大阪(関西国際)", "code": "KIX" },
{ "name": "福岡", "code": "FUK" },
{ "name": "沖縄(那覇)", "code": "OKA" }
],
"cards": [
{ "name": "ANAカード ゴールド", "code": "WID_GLD" }
],
"fares": [
{ "name": "運賃1", "code": "400_150_1" },
{ "name": "運賃2", "code": "400_125_2" },
{ "name": "運賃3", "code": "400_100_3" },
{ "name": "運賃4", "code": "0_100_4" },
{ "name": "運賃5", "code": "400_75_5" },
{ "name": "運賃6", "code": "200_75_6" },
{ "name": "運賃7", "code": "0_75_7" },
{ "name": "運賃8", "code": "0_50_8" },
{ "name": "運賃9", "code": "0_150_9" },
{ "name": "運賃10", "code": "0_100_10" },
{ "name": "運賃11", "code": "0_70_11" },
{ "name": "運賃12", "code": "0_50_12" },
{ "name": "運賃13", "code": "0_30_13" }
]
}
import fsPromises from "fs/promises";
import test from "@playwright/test";
import { sources, destinations, cards, fares } from "./input.json";
test("HTMLを解析します", async ({ page }) => {
const items: any[] = []
for (const source of sources) {
for (const destination of destinations) {
for (const card of cards) {
for (const fare of fares) {
const basename = [
source.code,
destination.code,
card.code,
fare.code,
].join('-')
const filename = `html/${basename}.html`
const buffer = await fsPromises.readFile(filename)
const html = buffer.toString()
await page.setContent(html)
const マイル = (await page.locator('#result_mile .total strong').innerText()).replace(/,/g, '')
const フライトマイル = (await page.locator('#mile_flight strong').innerText()).replace(/,/g, '')
const ボーナスマイル = (await page.locator('#mile_bonus strong').innerText()).replace(/,/g, '')
const 区間基本マイレージ = (await page.locator('#bonus_cal tr:nth-child(1) td strong').innerText()).replace(/,/g, '')
const クラス運賃倍率 = await page.locator('#bonus_cal tr:nth-child(2) td strong').innerText() + '%'
const プレミアムステイタス = await page.locator('#bonus_cal tr:nth-child(3) td strong').innerText() + '%'
const プレミアムポイント = (await page.locator('#result_point .total strong').innerText()).replace(/,/g, '')
const 路線倍率 = await page.locator('#result_point table table tr:nth-child(3) td strong').innerText() + '倍'
const 搭乗ポイント = (await page.locator('#result_point table table tr:nth-child(4) td strong').innerText()).replace(/,/g, '')
const input = { source, destination, card, fare }
const output = { マイル, フライトマイル, ボーナスマイル, 区間基本マイレージ,
クラス運賃倍率, プレミアムステイタス, プレミアムポイント, 路線倍率, 搭乗ポイント }
items.push({ input, output })
}
}
}
}
const text = JSON.stringify({ items }, null, 2)
await fsPromises.mkdir('tmp/parse', { recursive: true })
await fsPromises.writeFile('tmp/parse/data.json', text)
})
import fsPromises from "fs/promises";
import test from "@playwright/test";
import { items } from "../tmp/parse/data.json";
test("CSVファイルを出力します", async ({ page }) => {
const lines = ['出発地,到着地,利用カード種別,運賃,マイル,プレミアムポイント']
for (const { input, output } of items) {
const cells = [
input.source.name, input.destination.name, input.card.name,
input.fare.name, output.マイル, output.プレミアムポイント,
]
lines.push(cells.join(','))
}
await fsPromises.mkdir('tmp/print', { recursive: true })
await fsPromises.writeFile('tmp/print/data.csv', lines.join('\n'))
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment