SOCKS5 ไปฃ็้ ็ฝฎ โ HKO + Polymarket
่ๆฏ
้ฆๆธฏๅคฉๆๅฐ (HKO) ๅ Polymarket ๅๅๅจไธญๅฝๅคง้่ขซ DNS ๆฑกๆ / ้ปๆญ๏ผ
| ๅๅ | GFW ๅนฒๆฐ | ๆฑกๆ IP |
|---|---|---|
www.hko.gov.hk | DNS ๆฑกๆ | 198.18.0.29 |
data.weather.gov.hk | DNS ๆฑกๆ | 198.18.0.20 |
www.weather.gov.hk | DNS ๆฑกๆ | 198.18.0.21 |
polymarket.com / *.polymarket.com | ้ดๆญๆง้ปๆญ | โ |
้่ฟ้ฟ้ไบๅขๅคๆๅกๅจ (aliyun.sopher.cool) ๅปบ็ซ SSH SOCKS5 ้ง้๏ผ็ป่ฟ GFWใ
็ๅฎ IP๏ผไป HKO๏ผ้ฟ้ไบ่งฃๆ๏ผ๏ผ
www.hko.gov.hk โ 103.30.69.148data.weather.gov.hk โ 103.30.70.56www.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.24s | curl --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-proxy | 11080 |
| Flask Web | com.polymarket.web | 8899 |
| SSH ๅๅ้ง้ | com.polymarket.tunnel | 18899โ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
่ชๅจ้ๅฏ
KeepAlive: true): ่ฟ็จ้ๅบ่ชๅจ้ๅฏkickstartKeepAlive: 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/curl | curl ๅญ่ฟ็จไปฃ็ๅ ่ฃ |
~/Library/LaunchAgents/com.polymarket.hko-proxy.plist | SSH SOCKS5 ้ง้ |
~/Library/LaunchAgents/com.polymarket.hko-proxy-healthcheck.plist | ไปฃ็ๅฅๅบทๆฃๆฅ |
~/Library/LaunchAgents/com.polymarket.web.plist | Web ๆๅก๏ผๅซ PATH ๆณจๅ ฅ๏ผ |
scripts/hko_proxy_healthcheck.sh | ๅฅๅบทๆฃๆฅ่ๆฌ |
docs/hko-proxy.md | ๆฌๆๆกฃ |
ๆดๆฐๆฅๅฟ
/api/mm/weather/clob-book/, /api/mm/weather/clob-tick/)๏ผๆต่งๅจ็ซฏ CLOB ่ฐ็จๅ
จ้จ้่ฟ Flask ๅ็ซฏไปฃ็๏ผๅๆบๆ CORS ้ๅถ๏ผใไปฃ็ๅ
้จ้่ฟ urllib3 SOCKS5 ่ฟๆฅๆฑ ่ฎฟ้ฎ clob.polymarket.com๏ผSOCKS5 ๅฑๅฏนๅ็ซฏ้ๆใ~/bin/curl wrapper๏ผ๏ผไปฃ็่ๅดๆฉๅฑๅฐ Polymarket ๅ
จ็ณปๅๅๅ_hko_urlopen() ไปฃ็ๅฝๆฐ