ที่มาของข้อมูล · Data source

สถาปัตยกรรมการดึงข้อมูล

เบื้องหลังของราคาทุกตัว คือลูปฝั่งเซิร์ฟเวอร์ที่อ่านประกาศจากสมาคมค้าทองคำไทย แปลงเป็นข้อมูลที่ใช้งานได้ แล้วส่งต่อให้หน้าเว็บแบบเรียลไทม์ หน้านี้อธิบายทีละขั้น

เรียกแหล่งหลัก

Query the primary source

01

แหล่งหลักคือหน้ารายการปรับราคาระหว่างวันของสมาคม (UpdatePriceList.aspx) ซึ่งแต่ละแถวคือประกาศหนึ่งครั้ง และมีครบทุกฟิลด์ในแถวเดียว ทั้งราคาซื้อ-ขายทองคำแท่งและทองรูปพรรณ ราคาทองโลก อัตราบาทต่อดอลลาร์ และส่วนต่างที่เปลี่ยน จึงได้ค่าครบตั้งแต่การดึงครั้งแรกโดยไม่ต้องคำนวณย้อนหลัง

  • คำสั่งเรียกRequestfetch + browser UA
  • หมดเวลาTimeout12 วินาที · 12s
  • ลองซ้ำRetriesสูงสุด 6 ครั้ง · เว้น 1.2s
  • ตัวพิมพ์ URLURL casingลองทั้งพิมพ์ใหญ่/เล็ก

ต้นทางอยู่หลัง Cloudflare ที่บางครั้งตอบกลับ 403 แบบไม่แน่นอน และแคชแยกตามตัวพิมพ์ของ path ระบบจึงลองทั้งสองตัวพิมพ์ในแต่ละรอบ และวนซ้ำได้ถึง 6 รอบก่อนจะยอมแพ้ ส่วนหัว ของคำขอตั้งไว้เท่าที่จำเป็น เพราะการใส่ header มากเกินไปทำให้ถูกท้าทายบ่อยขึ้น

สำรองเมื่อแหล่งหลักล้มเหลว

Fallback handling

02

ในแต่ละรอบ ระบบลองแหล่งหลักก่อนเสมอ ถ้าอ่านหรือแยกค่าไม่สำเร็จจึงไล่ลงไปตามลำดับ ต่อไปนี้ แถวใดแถวหนึ่งที่ให้ราคาครบและอยู่ในช่วงสมเหตุสมผลจะถูกใช้ทันที

  1. 1
    ตารางประกาศระหว่างวันIntraday table (primary)

    ใช้ regex จับเซลล์แรกที่เป็นวันที่-เวลา DD/MM/YYYY HH:mm แล้วอ่านเซลล์ที่เหลือตามลำดับ: เลขครั้งที่, ซื้อ-ขายทองคำแท่ง, ซื้อ-ขายทองรูปพรรณ, ราคาทองโลก, บาทต่อดอลลาร์ และส่วนต่าง ต้องมีอย่างน้อย 8 เซลล์จึงจะรับแถวนั้น

  2. 2
    อ่านจากรหัส spanControl-ID spans

    ถ้าไม่มีตาราง ระบบอ่านค่าจาก span ที่มีรหัสควบคุมคงที่บนหน้าราคาปัจจุบัน (Default.aspx): lblBLBuy / lblBLSell สำหรับทองคำแท่ง และ lblOMBuy / lblOMSell สำหรับทองรูปพรรณ พร้อมบรรทัดเวลาประกาศจาก lblAsTime

  3. 3
    ไล่เซลล์ตารางตามตำแหน่งPositional table walk

    ถ้ารหัส span เปลี่ยนไป ระบบจะกวาดทุกเซลล์ในตาราง หาป้ายหัวข้อ ทองคำแท่ง และ ทองรูปพรรณ แล้วหยิบตัวเลขสองตัวถัดจากป้ายนั้น (ขายออกก่อน แล้วรับซื้อ)

  4. 4
    กวาดจำนวนเงินตามลำดับOrdered numeric sweep

    ทางเลือกสุดท้าย: ดึงจำนวนเงินรูปแบบหลักพันที่มีคอมมาออกมาตามลำดับในเอกสาร แล้วจับคู่เป็นราคาทองคำแท่งและทองรูปพรรณ ทุกวิธีกรองด้วยช่วงราคาที่สมเหตุสมผล 10,000 ถึง 120,000 บาท เพื่อไม่ให้หยิบปีหรือเบอร์โทรมาผิด

ประมวลผลก่อนส่งต่อ

Backend processing

03
  1. 1
    แปลงตัวเลขให้สะอาดNormalize numbers

    ทุกค่าที่แยกได้ผ่านฟังก์ชันแปลงที่คงเครื่องหมายบวก/ลบ ตัดคอมมา ช่องว่าง และอักขระ minus แบบต่าง ๆ ให้เหลือตัวเลขล้วน แล้วตรวจว่าเป็นจำนวนจริงก่อนใช้

  2. 2
    คำนวณค่าที่ได้มาDerive fields

    ราคาต่อกรัม = ราคาขายทองคำแท่ง หาร 15.244 (ทอง 1 บาท) ราคารับซื้อคืนทองรูปพรรณหัก 5% = ราคารับซื้อทองคำแท่ง คูณ 0.95 การเปลี่ยนแปลงวันนี้ = ผลรวมส่วนต่างของทุกประกาศในวันเดียวกัน และเปอร์เซ็นต์คิดจากราคาปิดเมื่อวาน (ราคาขายลบส่วนต่างวันนี้)

  3. 3
    หาส่วนต่างจากประกาศก่อนหน้าCompute the delta

    ระบบบันทึกทุกประกาศที่พบ (วันที่ + เลขครั้งที่ + ราคาขายทองคำแท่ง) แล้วเทียบราคาปัจจุบันกับประกาศก่อนหน้าที่ต่างออกไป เพื่อให้ได้ส่วนต่างที่แม่นยำ ทิศขึ้น/ลงยึดตามสัญญาณของสมาคมเป็นตัวกำหนดเครื่องหมาย

  4. 4
    แคชและเก็บถาวรCache and persist

    ผลลัพธ์ถูกเก็บในหน่วยความจำ (กันดึงซ้ำภายใน 8 วินาที) และบันทึกลงฐานข้อมูล SQLite (Turso) เพื่ออ่านกลับได้ทันทีข้ามการรีสตาร์ต ถ้าการดึงใหม่ล้มเหลว ระบบจะคืนค่าที่เก็บไว้ล่าสุดแทนการล้มทั้งหน้า

  5. 5
    ส่งต่อแบบเรียลไทม์Serve in real time

    เซิร์ฟเวอร์เปิด WebSocket ที่ /gold ตรวจต้นทางทุก 10 วินาที และส่งชุดข้อมูลใหม่เฉพาะเมื่อค่าจริงเปลี่ยน หน้าเว็บที่เปิดอยู่จะได้รับทันที ส่วนการโหลดครั้งแรกและกรณี WebSocket ต่อไม่ได้ ใช้ server function ดึงภาพรวมล่าสุดแทน

ดูโครงสร้างโค้ดและซอร์สไฟล์Codebase · file tree, stack & source
กลับไปหน้าที่มาของข้อมูล · Back to data source