๐Ÿ—๏ธ ่ฎฟ้—ฎ่€…ไฝ็ฝฎๅœฐๅ›พ - ็ณป็ปŸๆžถๆž„

๐Ÿ—๏ธ ่ฎฟ้—ฎ่€…ไฝ็ฝฎๅœฐๅ›พ - ็ณป็ปŸๆžถๆž„

๐Ÿ“ ๆ•ดไฝ“ๆžถๆž„ๅ›พ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       ็”จๆˆทๆต่งˆๅ™จ                                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚
โ”‚  โ”‚         ๐Ÿ“ Leafletๅœฐๅ›พ (visitor-tracker.js)          โ”‚      โ”‚
โ”‚  โ”‚  - ๅŠ ่ฝฝOSMๅœฐๅ›พ็“ฆ็‰‡                                   โ”‚      โ”‚
โ”‚  โ”‚  - ็ป˜ๅˆถ่ฎฟ้—ฎ่€…ไฝ็ฝฎๆ ‡่ฎฐ                                โ”‚      โ”‚
โ”‚  โ”‚  - ่šๅˆๅŒๅŸŽๅธ‚่ฎฟ้—ฎ่€…                                  โ”‚      โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚
โ”‚           โ†“ ่Žทๅ–IPๅœฐ็†ไฟกๆฏ          โ†“ ่ฏปๅ–ๅކๅฒๆ•ฐๆฎ           โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”        โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”              โ”‚
โ”‚  โ”‚ ip-api.com API   โ”‚        โ”‚  GitHub Gist     โ”‚              โ”‚
โ”‚  โ”‚ (ๅ…่ดนๅœฐ็†ๅฎšไฝ)   โ”‚        โ”‚ (ๅ…ฌๅผ€่ฎฟ้—ฎ่ฏป)     โ”‚              โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜              โ”‚
โ”‚           โ†“                           โ†“                        โ”‚
โ”‚       ่Žทๅ–ๅฝ“ๅ‰ไฝ็ฝฎ                  ่Žทๅ–ๆ‰€ๆœ‰่ฎฟ้—ฎ่€…ๆ•ฐๆฎ         โ”‚
โ”‚                                                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚
โ”‚  โ”‚  ้กต้ขๅŠ ่ฝฝๅฎŒๆˆ โ†’ ๅ‘้€POST่ฏทๆฑ‚ๅˆฐๅŽ็ซฏ                  โ”‚      โ”‚
โ”‚  โ”‚  (country, city, latitude, longitude, ip)           โ”‚      โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚
โ”‚                           โ†“                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚
                            โ”‚ HTTPS
                            โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Vercel Edge Network                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                  โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”      โ”‚
โ”‚  โ”‚    ๐Ÿš€ Serverless Function (/api/track-visitor.js)   โ”‚      โ”‚
โ”‚  โ”‚  - ้ชŒ่ฏ่ฏทๆฑ‚ๆ•ฐๆฎ                                     โ”‚      โ”‚
โ”‚  โ”‚  - ่Žทๅ–ๅฝ“ๅ‰Gistๅ†…ๅฎน                                 โ”‚      โ”‚
โ”‚  โ”‚  - ๆทปๅŠ ๆ–ฐ่ฎฟ้—ฎ่ฎฐๅฝ•                                   โ”‚      โ”‚
โ”‚  โ”‚  - ๆ›ดๆ–ฐGist                                         โ”‚      โ”‚
โ”‚  โ”‚  - ่ฟ”ๅ›žๆˆๅŠŸๅ“ๅบ”                                     โ”‚      โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜      โ”‚
โ”‚                                                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚ (ไฝฟ็”จGitHub Token)
         โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      GitHub API                                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”‚
โ”‚  โ”‚              ๐Ÿ—‚๏ธ GitHub Gist (ๆ•ฐๆฎๅญ˜ๅ‚จ)           โ”‚         โ”‚
โ”‚  โ”‚                                                    โ”‚         โ”‚
โ”‚  โ”‚  {                                                 โ”‚         โ”‚
โ”‚  โ”‚    "visitors": [                                   โ”‚         โ”‚
โ”‚  โ”‚      {                                             โ”‚         โ”‚
โ”‚  โ”‚        "timestamp": "2025-10-22T10:30:00Z",      โ”‚         โ”‚
โ”‚  โ”‚        "country": "China",                         โ”‚         โ”‚
โ”‚  โ”‚        "city": "Hangzhou",                         โ”‚         โ”‚
โ”‚  โ”‚        "latitude": 30.2741,                        โ”‚         โ”‚
โ”‚  โ”‚        "longitude": 120.1551,                      โ”‚         โ”‚
โ”‚  โ”‚        "ip_hash": "a1b2c3d4"                       โ”‚         โ”‚
โ”‚  โ”‚      },                                            โ”‚         โ”‚
โ”‚  โ”‚      ...ๆ›ดๅคš่ฎฟ้—ฎ่€…...                            โ”‚         โ”‚
โ”‚  โ”‚    ],                                              โ”‚         โ”‚
โ”‚  โ”‚    "updated_at": "2025-10-22T10:30:00Z"           โ”‚         โ”‚
โ”‚  โ”‚  }                                                 โ”‚         โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ”‚
โ”‚                                                                  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ“Š ๆ•ฐๆฎๆต่ฏฆ่งฃ

ๆต็จ‹1๏ผš้ฆ–ๆฌกๅŠ ่ฝฝ้กต้ข

็”จๆˆทๆ‰“ๅผ€็ฝ‘็ซ™
    โ†“
footerๅŠ ่ฝฝLeafletๅบ“
    โ†“
ๆ‰ง่กŒvisitor-tracker.js
    โ†“
ๅˆๅง‹ๅŒ–ๅœฐๅ›พ๏ผˆๆ˜พ็คบๅ…จ็ƒ่ง†ๅ›พ๏ผ‰
    โ†“
ๅนถ่กŒๆ‰ง่กŒไธ‰ไธชๆ“ไฝœ๏ผš
    โ”œโ”€ ่Žทๅ–็”จๆˆทIPๅœฐ็†ไฟกๆฏ (ip-api.com)
    โ”œโ”€ ่ฏปๅ–ๅކๅฒ่ฎฟ้—ฎๆ•ฐๆฎ (Gist Raw URL)
    โ””โ”€ ๆ ‡่ฎฐๅฝ“ๅ‰ไฝ็ฝฎ๏ผˆ็บข่‰ฒ่™š็บฟๅœ†ๅœˆ๏ผ‰
    โ†“
่šๅˆๅކๅฒๆ•ฐๆฎไธญ็š„ๅŸŽๅธ‚ไฟกๆฏ
    โ†“
็ป˜ๅˆถๅœ†ๅฝขๆ ‡่ฎฐๅˆฐๅœฐๅ›พ
    โ”œโ”€ ๆ ‡่ฎฐๅคงๅฐ โˆ ่ฎฟ้—ฎไบบๆ•ฐ
    โ”œโ”€ ๆ ‡่ฎฐ้ขœ่‰ฒ ไปŽ่“โ†’็บข๏ผˆไบบๆ•ฐ่ถŠๅคš่ถŠ็บข๏ผ‰
    โ””โ”€ ๅผน็ช—ๆ˜พ็คบๅŸŽๅธ‚ๅๅ’Œ่ฎฟ้—ฎๆ•ฐ
    โ†“
ๆ›ดๆ–ฐ็ปŸ่ฎกไฟกๆฏ
    โ”œโ”€ ๆ€ป่ฎฟ้—ฎ่€…ๆ•ฐ
    โ””โ”€ ๆ€ปๅ›ฝๅฎถๆ•ฐ
    โ†“
ๅผ‚ๆญฅๅ‘้€ๆ–ฐ่ฎฟ้—ฎ่ฎฐๅฝ•ๅˆฐๅŽ็ซฏ
    โ†“
ๅŽ็ซฏๆ›ดๆ–ฐGist
    โ†“
ๅฎŒๆˆ

ๆต็จ‹2๏ผšๅŽ็ซฏๆ•ฐๆฎๆ›ดๆ–ฐ

ๅ‰็ซฏPOST่ฏทๆฑ‚ๅˆฐ /api/track-visitor
    โ†“
Vercel Functionๅค„็†่ฏทๆฑ‚
    โ”œโ”€ ้ชŒ่ฏHTTPๆ–นๆณ•๏ผˆๅฟ…้กปๆ˜ฏPOST๏ผ‰
    โ”œโ”€ ้ชŒ่ฏๅฟ…ๅกซๅญ—ๆฎต
    โ””โ”€ ๆฃ€ๆŸฅ็Žฏๅขƒๅ˜้‡
    โ†“
ๆˆๅŠŸ โ†’ ็ปง็ปญ๏ผ›ๅคฑ่ดฅ โ†’ ่ฟ”ๅ›ž้”™่ฏฏ
    โ†“
่ฐƒ็”จGitHub API่Žทๅ–ๅฝ“ๅ‰Gistๅ†…ๅฎน
    โ”œโ”€ ไฝฟ็”จ GITHUB_TOKEN ่ฎค่ฏ
    โ””โ”€ ่Žทๅ–gist/{GIST_ID}
    โ†“
่งฃๆžGist JSONๆ•ฐๆฎ
    โ†“
ๆ–ฐๅปบ่ฎฟ้—ฎ่€…่ฎฐๅฝ•
    โ”œโ”€ timestamp: ๅฝ“ๅ‰ๆ—ถ้—ด
    โ”œโ”€ country: ๅ›ฝๅฎถ
    โ”œโ”€ city: ๅŸŽๅธ‚
    โ”œโ”€ latitude: ็บฌๅบฆ
    โ”œโ”€ longitude: ็ปๅบฆ
    โ””โ”€ ip_hash: IPๅ“ˆๅธŒ๏ผˆไฟๆŠค้š็ง๏ผ‰
    โ†“
ๆทปๅŠ ๅˆฐvisitorsๆ•ฐ็ป„
    โ†“
ๅฏ้€‰๏ผšๅฆ‚ๆžœ่ถ…่ฟ‡1000ๆก่ฎฐๅฝ•๏ผŒๅˆ ้™คๆœ€ๆ—ง็š„
    โ†“
่ฐƒ็”จGitHub APIๆ›ดๆ–ฐGist
    โ”œโ”€ ไฝฟ็”จPATCHๆ–นๆณ•
    โ”œโ”€ ๅ‘้€ๆ–ฐ็š„JSONๅ†…ๅฎน
    โ””โ”€ ๆทปๅŠ ๆ›ดๆ–ฐๆ—ถ้—ดๆˆณ
    โ†“
่ฟ”ๅ›žๆˆๅŠŸๅ“ๅบ”็ป™ๅ‰็ซฏ
    โ”œโ”€ success: true
    โ”œโ”€ message: ๆ่ฟฐไฟกๆฏ
    โ””โ”€ visitorCount: ๅฝ“ๅ‰ๆ€ปๆ•ฐ
    โ†“
ๅฎŒๆˆ

๐Ÿ” ๅฎ‰ๅ…จๆœบๅˆถ

1. ้š็งไฟๆŠค

็”จๆˆทIP: 192.168.1.100
    โ†“ (hashIPๅ‡ฝๆ•ฐ)
IPๅ“ˆๅธŒ: a1b2c3d4e5f6g7h8
    โ†“
ๅญ˜ๅ‚จๅˆฐGistไธญ
  • โœ… ๆ— ๆณ•ๅๅ‘่Žทๅ–ๅŽŸๅง‹IP
  • โœ… ็›ธๅŒIP็”Ÿๆˆ็›ธๅŒๅ“ˆๅธŒ
  • โœ… ็”จไบŽๅŽป้‡ๅ’Œ่ฟฝ่ธชๅŒไธ€็”จๆˆท

2. Tokenๅฎ‰ๅ…จ

GitHub Token: ghp_xxx...xxx
    โ†“
ๅญ˜ๅ‚จๅœจ โ†’ Vercel Environment Variables
    โ†“
ไป…ๆœๅŠกๅ™จๅฏ่ฎฟ้—ฎ โ†’ ๅ‰็ซฏๆ— ๆณ•่Žทๅ–
    โ†“
ไฝฟ็”จBearer่ฎค่ฏ โ†’ GitHub API
  • โœ… Tokenไธไผšๅœจๅ‰็ซฏไปฃ็ ไธญๅ‡บ็Žฐ
  • โœ… HTTPSๅŠ ๅฏ†ไผ ่พ“
  • โœ… ๅฎšๆœŸๆฃ€ๆŸฅTokenๆœ‰ๆ•ˆๆœŸ

3. ่ฏทๆฑ‚้ชŒ่ฏ

ๅ‰็ซฏ่ฏทๆฑ‚ โ†’ ๅŽ็ซฏFunction
    โ†“
ๆฃ€ๆŸฅHTTPๆ–นๆณ•๏ผˆๅฟ…้กปPOST๏ผ‰
    โ†“
ๆฃ€ๆŸฅๅฟ…ๅกซๅญ—ๆฎต๏ผš
    โ”œโ”€ country: ๅ›ฝๅฎถ
    โ”œโ”€ city: ๅŸŽๅธ‚
    โ”œโ”€ latitude: ็บฌๅบฆ
    โ””โ”€ longitude: ็ปๅบฆ
    โ†“
้ชŒ่ฏ็Žฏๅขƒๅ˜้‡
    โ†“
ๆ‰ง่กŒๆ›ดๆ–ฐ

๐Ÿ“ˆ ๆ€ง่ƒฝไผ˜ๅŒ–

1. ๅ‰็ซฏไผ˜ๅŒ–

ไผ˜ๅŒ–้กนๅฎž็Žฐๆ–นๅผ
ๅ‡ๅฐ‘API่ฐƒ็”จsessionStorage้˜ฒๆญข้‡ๅค่ฟฝ่ธช๏ผˆๆฏๅคฉไธ€ๆฌก๏ผ‰
ๅผ‚ๆญฅๅŠ ่ฝฝ่ฎฟ้—ฎ่ฟฝ่ธชไธ้˜ปๅกž้กต้ขๆธฒๆŸ“
CDNๅŠ ้€ŸOSMๅœฐๅ›พ็“ฆ็‰‡็”ฑCDNๆไพ›
ๅบ“ไผ˜ๅŒ–Leaflet่ฝป้‡็บง๏ผˆ~40KB๏ผ‰

2. ๅŽ็ซฏไผ˜ๅŒ–

ไผ˜ๅŒ–้กนๅฎž็Žฐๆ–นๅผ
ๆ•ฐๆฎ้™ๅˆถGistไป…ไฟๅญ˜ๆœ€่ฟ‘1000ๆก่ฎฐๅฝ•
ๅฟซ้€Ÿๅ“ๅบ”Vercel Edge Function๏ผˆๅ…จ็ƒCDN๏ผ‰
้”™่ฏฏๅค„็†้™้ป˜ๅคฑ่ดฅ๏ผŒไธๅฝฑๅ“็”จๆˆทไฝ“้ชŒ

๐Ÿ”„ ๆ•ฐๆฎ็”Ÿๅ‘ฝๅ‘จๆœŸ

็”จๆˆท่ฎฟ้—ฎ
    โ†“
1. ็ซ‹ๅณ่Žทๅ–๏ผšIPๅœฐ็†ไฟกๆฏ
    โ””โ”€ ๆฅๆบ๏ผšip-api.com
    โ””โ”€ ๅปถ่ฟŸ๏ผš<100ms
    
2. ๅณๆ—ถๆ˜พ็คบ๏ผšๅฝ“ๅ‰ไฝ็ฝฎๆ ‡่ฎฐ
    โ””โ”€ ๅœจๅœฐๅ›พไธŠๆ ‡่ฎฐ็”จๆˆท
    โ””โ”€ ๆ— ้œ€็ญ‰ๅพ…ๅŽ็ซฏ
    
3. ๅŠ ่ฝฝๅކๅฒๆ•ฐๆฎ๏ผšGistๅ†…ๅฎน
    โ””โ”€ ๆฅๆบ๏ผšGitHub Gist๏ผˆๅ…ฌๅผ€๏ผ‰
    โ””โ”€ ็ผ“ๅญ˜๏ผš1ๅฐๆ—ถ
    
4. ๅผ‚ๆญฅไฟๅญ˜๏ผšๆ–ฐ่ฎฟ้—ฎ่ฎฐๅฝ•
    โ””โ”€ ็›ฎๆ ‡๏ผšGitHub Gist
    โ””โ”€ ๅปถ่ฟŸ๏ผšๅฏๆŽฅๅ—๏ผˆๅŽๅฐ๏ผ‰
    
5. ็”จๆˆทไฝ“้ชŒ๏ผšๅฎŒๅ…จไธๅ—ๅฝฑๅ“
    โ””โ”€ ้กต้ข็ซ‹ๅณๅ“ๅบ”
    โ””โ”€ ๆ•ฐๆฎๆœ€็ปˆไธ€่‡ดๆ€ง

๐Ÿ”— API็ซฏ็‚น

1. IPๅœฐ็†ๅฎšไฝ API

GET https://ip-api.com/json/?fields=status,country,countryCode,city,lat,lon,query

่ฏทๆฑ‚ๅคด๏ผš
ๆ— ้œ€่ฎค่ฏ

ๅ“ๅบ”ๆ ผๅผ๏ผš
{
  "status": "success",
  "country": "China",
  "countryCode": "CN",
  "city": "Hangzhou",
  "lat": 30.2741,
  "lon": 120.1551,
  "query": "1.2.3.4"
}

้™ๅˆถ๏ผš45่ฏทๆฑ‚/ๅˆ†้’Ÿ

2. GitHub Gist API

GET https://api.github.com/gists/{GIST_ID}
PATCH https://api.github.com/gists/{GIST_ID}

่ฎค่ฏ๏ผšBearer {GITHUB_TOKEN}

ๅ“ๅบ”๏ผšGistๅ†…ๅฎน+ๅ…ƒๆ•ฐๆฎ

3. ๅŽ็ซฏ่ฟฝ่ธชๅ‡ฝๆ•ฐ

POST /api/track-visitor

่ฏทๆฑ‚ไฝ“๏ผš
{
  "country": "China",
  "city": "Hangzhou",
  "latitude": 30.2741,
  "longitude": 120.1551,
  "ip": "1.2.3.4"
}

ๅ“ๅบ”๏ผš
{
  "success": true,
  "message": "Visitor tracked successfully",
  "visitorCount": 123
}

๐Ÿ“ฑ ๅ…ผๅฎนๆ€ง

ๆต่งˆๅ™จๆ”ฏๆŒๅค‡ๆณจ
Chrome 90+โœ…ๅฎŒๅ…จๆ”ฏๆŒ
Firefox 88+โœ…ๅฎŒๅ…จๆ”ฏๆŒ
Safari 14+โœ…ๅฎŒๅ…จๆ”ฏๆŒ
Edge 90+โœ…ๅฎŒๅ…จๆ”ฏๆŒ
IE 11โŒไธๆ”ฏๆŒES6 Promise

๐Ÿš€ ๆ‰ฉๅฑ•ๅฏ่ƒฝๆ€ง

ๆœชๆฅๅŠŸ่ƒฝ

  1. ็ƒญๅŠ›ๅ›พๆ˜พ็คบ
    • ไฝฟ็”จLeaflet.Heatๅบ“
    • ๆ˜พ็คบ่ฎฟ้—ฎๅฏ†ๅบฆ็ƒญๅŠ›
  2. ๅฎžๆ—ถๆŽ’่กŒๆฆœ
    • ๆ˜พ็คบ่ฎฟ้—ฎๆœ€ๅคš็š„ๅŸŽๅธ‚TOP10
    • ๅŠจๆ€ๆ›ดๆ–ฐ
  3. ๆ—ถ้—ดๅบๅˆ—็ปŸ่ฎก
    • ๆŒ‰ๅคฉ/ๅ‘จ/ๆœˆ็ปŸ่ฎก
    • ่ถ‹ๅŠฟๅˆ†ๆž
  4. ๅœฐๅŒบๆทฑ้’ป
    • ็‚นๅ‡ปๅœฐๅŒบๆŸฅ็œ‹่ฏฆ็ป†ไฟกๆฏ
    • ๆ˜พ็คบๆ—ถ้—ดๆฎตๅˆ†ๅธƒ
  5. ๆ•ฐๆฎๅฏผๅ‡บ
    • ๅฏผๅ‡บCSVๆŠฅๅ‘Š
    • ้›†ๆˆBIๅทฅๅ…ท