SOCKS5 ไปฃ็†้…็ฝฎ โ€” HKO + Polymarket


่ƒŒๆ™ฏ


้ฆ™ๆธฏๅคฉๆ–‡ๅฐ (HKO) ๅŠ Polymarket ๅŸŸๅๅœจไธญๅ›ฝๅคง้™†่ขซ DNS ๆฑกๆŸ“ / ้˜ปๆ–ญ๏ผš


ๅŸŸๅGFW ๅนฒๆ‰ฐๆฑกๆŸ“ IP
www.hko.gov.hkDNS ๆฑกๆŸ“198.18.0.29
data.weather.gov.hkDNS ๆฑกๆŸ“198.18.0.20
www.weather.gov.hkDNS ๆฑกๆŸ“198.18.0.21
polymarket.com / *.polymarket.com้—ดๆญ‡ๆ€ง้˜ปๆ–ญโ€”

้€š่ฟ‡้˜ฟ้‡Œไบ‘ๅขƒๅค–ๆœๅŠกๅ™จ (aliyun.sopher.cool) ๅปบ็ซ‹ SSH SOCKS5 ้šง้“๏ผŒ็ป•่ฟ‡ GFWใ€‚


็œŸๅฎž IP๏ผˆไป… HKO๏ผŒ้˜ฟ้‡Œไบ‘่งฃๆž๏ผ‰๏ผš

  • www.hko.gov.hk โ†’ 103.30.69.148
  • data.weather.gov.hk โ†’ 103.30.70.56
  • www.weather.gov.hk โ†’ 103.30.70.7

  • ๆžถๆž„


    
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚                  Flask app (:8899)                โ”‚
    โ”‚                                                  โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
    โ”‚  โ”‚ urllib.request   โ”‚   โ”‚ subprocess.run(curl) โ”‚  โ”‚
    โ”‚  โ”‚  (monkey-patch)  โ”‚   โ”‚  โ†’ ~/bin/curl        โ”‚  โ”‚
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
    โ”‚           โ”‚                        โ”‚              โ”‚
    โ”‚           โ–ผ                        โ–ผ              โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
    โ”‚  โ”‚  urllib3 SOCKSProxyManager (่ฟžๆŽฅๆฑ )         โ”‚   โ”‚
    โ”‚  โ”‚  4 pools ร— 4 connections = keep-alive      โ”‚   โ”‚
    โ”‚  โ”‚  socks5://127.0.0.1:11080                  โ”‚   โ”‚
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                            โ”‚ SSH -D 11080
                            โ–ผ
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚          aliyun.sopher.cool (ๅขƒๅค–)                โ”‚
    โ”‚          SSH Server                              โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚ ็›ด่ฟž
                           โ–ผ
                  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
                  โ”‚  HKO / Polymarket โ”‚
                  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
    

    ไปฃ็†ๅŸŸๅๅˆ—่กจ


    
    _PROXY_DOMAINS = {
        # HKO weather
        'www.hko.gov.hk', 'data.weather.gov.hk', 'www.weather.gov.hk',
        # Polymarket
        'polymarket.com', 'gamma-api.polymarket.com', 'lb-api.polymarket.com',
        'data-api.polymarket.com', 'clob.polymarket.com',
    }
    

    ๅฎž็Žฐ็ป†่Š‚


    1. urllib3 ่ฟžๆŽฅๆฑ ๏ผˆ้•ฟ้“พๆŽฅ keep-alive๏ผ‰


    
    # app.py: ๅฏๅŠจๆ—ถๅˆ›ๅปบๅ…จๅฑ€่ฟžๆŽฅๆฑ 
    from urllib3.contrib.socks import SOCKSProxyManager
    
    _PROXY_POOL = SOCKSProxyManager(
        'socks5://127.0.0.1:11080',
        num_pools=4,      # 4 ไธช่ฟžๆŽฅๆฑ ๏ผˆๆŒ‰ๅŸŸๅๅˆ†็ป„๏ผ‰
        maxsize=4,        # ๆฏๆฑ ๆœ€ๅคš 4 ไธช่ฟžๆŽฅ
        timeout=Timeout(connect=10, read=15),
    )
    

    2. urllib.request.urlopen monkey-patch


    ๆ‰€ๆœ‰ Python ไปฃ็ ไธญ็š„ urllib.request.urlopen ่‡ชๅŠจ่ตฐไปฃ็†ๆฑ ๏ผš


    
    # app.py: ้€ๆ˜Žๆ‹ฆๆˆช๏ผŒๆ— ้œ€ไฟฎๆ”น็Žฐๆœ‰ไธšๅŠกไปฃ็ 
    _original_urlopen = urllib.request.urlopen
    
    def _patched_urlopen(url_or_req, args, *kwargs):
        hostname = urlparse(url).hostname
        if hostname in _PROXY_DOMAINS:
            r = _PROXY_POOL.request(method, url, ...)
            return io.BytesIO(r.data)  # file-like wrapper
        return _original_urlopen(url_or_req, args, *kwargs)
    
    urllib.request.urlopen = _patched_urlopen
    

    3. curl ๅญ่ฟ›็จ‹ไปฃ็†


    app.py ไธญๆœ‰ 6 ไธช _curl() ๅ‡ฝๆ•ฐ็”จ subprocess.run(['curl', ...]) ่ฐƒ็”จ APIใ€‚

    ้€š่ฟ‡ ~/bin/curl ๅŒ…่ฃ…่„šๆœฌ่‡ชๅŠจๆณจๅ…ฅ --socks5-hostname๏ผš


    
    #!/bin/bash
    # ~/bin/curl โ€” ๆฃ€ๆต‹็›ฎๆ ‡ๅŸŸๅ๏ผŒ่‡ชๅŠจๆทปๅŠ  SOCKS5 ไปฃ็†ๅ‚ๆ•ฐ
    PROXY_DOMAINS=("hko.gov.hk" "weather.gov.hk" "polymarket.com" ...)
    
    for arg in "$@"; do
        for domain in "${PROXY_DOMAINS[@]}"; do
            if [[ "$arg" == "$domain" ]]; then
                exec /usr/bin/curl --socks5-hostname 127.0.0.1:11080 "$@"
            fi
        done
    done
    exec /usr/bin/curl "$@"
    

    launchd ็Žฏๅขƒๅ˜้‡ๆณจๅ…ฅ PATH๏ผš

    
    <key>EnvironmentVariables</key>
    <dict>
        <key>PATH</key>
        <string>/Users/bot_zdw/bin:/usr/bin:/bin:...</string>
    </dict>
    

    ๆ€ง่ƒฝ


    ๅœบๆ™ฏๅปถ่ฟŸ่ฏดๆ˜Ž
    ็บฏไปฃ็†ๅฑ‚ (SOCKS5 โ†’ HKO)0.21-0.24scurl --socks5-hostname
    Flask HKO API (่ฟžๆŽฅๆฑ  keep-alive)1.0-1.8sๅซ Python/Flask ๅผ€้”€
    Flask Polymarket (curl wrapper)1.9-2.3sๅซๅญ่ฟ›็จ‹ๅฏๅŠจๅผ€้”€

    ๅฏนๆฏ”ๆ—งๆ–นๆกˆ๏ผšๆ—งๆ–นๆกˆๆฏๆฌกๆ–ฐๅปบ TCP/TLS ่ฟžๆŽฅ๏ผŒๆ”นไธบ่ฟžๆŽฅๆฑ ๅŽ HKO ็ซฏ็‚นไปŽ ~1.5s โ†’ ~1.0sใ€‚


    ๆœๅŠก็ฎก็†


    ๆ ธๅฟƒๆœๅŠก


    ๆœๅŠกlaunchd ๅ็งฐ็ซฏๅฃ
    SSH SOCKS5 ้šง้“com.polymarket.hko-proxy11080
    Flask Webcom.polymarket.web8899
    SSH ๅๅ‘้šง้“com.polymarket.tunnel18899โ†’8899

    ๅฅๅบทๆฃ€ๆŸฅ


    ๆœๅŠกlaunchd ๅ็งฐ้ข‘็އ
    SOCKS5 ไปฃ็†ๅฅๅบทcom.polymarket.hko-proxy-healthcheckๆฏ 10 ๅˆ†้’Ÿ

    ๅธธ็”จๅ‘ฝไปค


    
    # ไปฃ็†้šง้“็Šถๆ€
    launchctl list | grep hko-proxy
    
    # ้‡ๅฏไปฃ็†
    launchctl kickstart -k gui/$(id -u)/com.polymarket.hko-proxy
    
    # ้‡ๅฏ Web ๆœๅŠก
    kill $(lsof -t -i :8899) && \
      launchctl kickstart -k gui/$(id -u)/com.polymarket.web
    
    # ๆ‰‹ๅŠจๆต‹่ฏ•ไปฃ็†
    curl -s --socks5-hostname localhost:11080 \
      "https://www.hko.gov.hk/wxinfo/json/one_json.xml" | jq .currwx
    
    # ๆต‹่ฏ• Web API
    curl -s http://localhost:8899/api/weather/hk/live | jq .
    
    # ๆต‹่ฏ• Polymarket API๏ผˆ้€š่ฟ‡ curl wrapper๏ผ‰
    ~/bin/curl -s -m 5 \
      "https://data-api.polymarket.com/activity?user=0x...&limit=1" | jq .
    
    # ๆต‹่ฏ•่ฟžๆŽฅๆฑ ๏ผˆkeep-alive ็”Ÿๆ•ˆ๏ผ‰
    for i in {1..5}; do
      curl -s -o /dev/null -w "%{time_total}s\n" \
        http://localhost:8899/api/weather/hk/live
    done
    

    ่‡ชๅŠจ้‡ๅฏ


  • SSH ้šง้“ (KeepAlive: true): ่ฟ›็จ‹้€€ๅ‡บ่‡ชๅŠจ้‡ๅฏ
  • ServerAliveInterval=15 + ServerAliveCountMax=3: SSH 45s ๆฃ€ๆต‹ๆ–ญ่ฟž
  • ๅฅๅบทๆฃ€ๆŸฅ: ๆฏ 10 ๅˆ†้’Ÿ้ชŒ่ฏไปฃ็†ๅฏ็”จๆ€ง๏ผŒๅคฑ่ดฅๅˆ™ kickstart
  • Web ๆœๅŠก (KeepAlive: true): ่ฟ›็จ‹้€€ๅ‡บ่‡ชๅŠจ้‡ๅฏ

  • ๆ•…้šœๆŽ’ๆŸฅ


    ไปฃ็†ไธๅฏ็”จ โ†’ ่‡ชๅŠจ้™็บง

    ๅฏๅŠจๆ—ถๆฃ€ๆต‹ SOCKS5 ็ซฏๅฃ๏ผŒไธๅฏ็”จๆ—ถ _PROXY_POOL = None๏ผŒๆ‰€ๆœ‰่ฏทๆฑ‚่ตฐ็›ด่ฟžใ€‚


    DNS ไป็„ถ่ขซๆฑกๆŸ“

    SOCKS5 ไปฃ็†ไฝฟ็”จ rdns=True๏ผˆๆˆ– curl --socks5-hostname๏ผ‰๏ผŒๅŸŸๅ็”ฑไปฃ็†็ซฏ๏ผˆaliyun๏ผ‰่งฃๆžใ€‚


    urllib3 LibreSSL ่ญฆๅ‘Š

    
    LibreSSL 2.8.3 โ†’ NotOpenSSLWarning
    

    ๆ— ๅฎณ๏ผŒๅฏๅฟฝ็•ฅใ€‚macOS Python 3.9 ่‡ชๅธฆ็š„ LibreSSLใ€‚


    ไฟฎๆ”นไปฃ็ ๅŽไธ็”Ÿๆ•ˆ

    Flask ็”Ÿไบงๆจกๅผไธ็ƒญ้‡่ฝฝใ€‚ๅฟ…้กป๏ผš

    
    kill $(lsof -t -i :8899)
    launchctl kickstart -k gui/$(id -u)/com.polymarket.web
    

    ๆ–‡ไปถๆธ…ๅ•


    ๆ–‡ไปถ็”จ้€”
    app.py (่กŒ 74-195)urllib3 ่ฟžๆŽฅๆฑ  + monkey-patch
    ~/bin/curlcurl ๅญ่ฟ›็จ‹ไปฃ็†ๅŒ…่ฃ…
    ~/Library/LaunchAgents/com.polymarket.hko-proxy.plistSSH SOCKS5 ้šง้“
    ~/Library/LaunchAgents/com.polymarket.hko-proxy-healthcheck.plistไปฃ็†ๅฅๅบทๆฃ€ๆŸฅ
    ~/Library/LaunchAgents/com.polymarket.web.plistWeb ๆœๅŠก๏ผˆๅซ PATH ๆณจๅ…ฅ๏ผ‰
    scripts/hko_proxy_healthcheck.shๅฅๅบทๆฃ€ๆŸฅ่„šๆœฌ
    docs/hko-proxy.mdๆœฌๆ–‡ๆกฃ

    ๆ›ดๆ–ฐๆ—ฅๅฟ—


  • 2026-05-02 (v3): ๆ–ฐๅขž CLOB API CORS ไปฃ็†็ซฏ็‚น (/api/mm/weather/clob-book/, /api/mm/weather/clob-tick/)๏ผŒๆต่งˆๅ™จ็ซฏ CLOB ่ฐƒ็”จๅ…จ้ƒจ้€š่ฟ‡ Flask ๅŽ็ซฏไปฃ็†๏ผˆๅŒๆบๆ—  CORS ้™ๅˆถ๏ผ‰ใ€‚ไปฃ็†ๅ†…้ƒจ้€š่ฟ‡ urllib3 SOCKS5 ่ฟžๆŽฅๆฑ ่ฎฟ้—ฎ clob.polymarket.com๏ผŒSOCKS5 ๅฑ‚ๅฏนๅ‰็ซฏ้€ๆ˜Žใ€‚
  • 2026-04-28 (v2): ๆ”น็”จ urllib3 SOCKSProxyManager ่ฟžๆŽฅๆฑ ๏ผˆkeep-alive๏ผ‰๏ผ›monkey-patch urllib.request.urlopen ๅ…จๅฑ€้€ๆ˜Žไปฃ็†๏ผ›ๆ–ฐๅขž curl ๅญ่ฟ›็จ‹ไปฃ็†๏ผˆ~/bin/curl wrapper๏ผ‰๏ผ›ไปฃ็†่Œƒๅ›ดๆ‰ฉๅฑ•ๅˆฐ Polymarket ๅ…จ็ณปๅˆ—ๅŸŸๅ
  • 2026-04-28 (v1): ้ฆ–ๆฌก้ƒจ็ฝฒใ€‚GFW DNS ๆฑกๆŸ“ๅฏผ่‡ด HKO ๅŸŸๅไธๅฏ็”จใ€‚ๆ–ฐๅขž SSH SOCKS5 ้šง้“ + _hko_urlopen() ไปฃ็†ๅ‡ฝๆ•ฐ