回答 · フロントエンド · セキュリティ
ブラウザJavaScriptでピナクルオッズ
回答: /v1/* のREST応答には Access-Control-Allow-Origin: * が付くため、ページからの fetch() はCORSエラーになりません。問題はキーで、フロントのコードは誰でも見られます。公開サイトでは PINNFEED_KEY を持つ小さなサーバー(またはサーバーレス)からPinnFeedを呼び、必要な分だけ返します。ブラウザはWebSocketにヘッダーを付けられないため、ブラウザソケットはURLの ?key= が必要で、同様にキーが露出します。
私的なテストなら可#
<script>
fetch('https://pinnfeed.io/v1/odds?sport=tennis&market=moneyline&main=true&limit=5', {
headers: { 'x-api-key': 'ps_live_your_key' } // visible to anyone who opens this page
}).then(r => r.json()).then(d => console.log(d.events));
</script>
公開サイト:プロキシパターン#
// server.js (Node 18+), run with PINNFEED_KEY in the environment
import http from 'node:http';
http.createServer(async (req, res) => {
if (!req.url.startsWith('/odds')) { res.writeHead(404).end(); return; }
const r = await fetch('https://pinnfeed.io/v1/odds?sport=tennis&market=moneyline&main=true&limit=20', {
headers: { 'x-api-key': process.env.PINNFEED_KEY },
});
res.writeHead(r.status, { 'content-type': 'application/json', 'cache-control': 'max-age=5' });
res.end(await r.text());
}).listen(3000);
短いキャッシュで多数の訪問者がレート制限を使い切るのを防ぎます(Free 1、Hobby 2、Builder 10、Pro 30 req/s)。既成プロキシ:FastAPI、Cloudflare Worker、Supabase Edge。
ページ内のライブ更新#
WebSocketはサーバー(Builder)で保持し、必要な変更だけ自前のWSやSSEでブラウザへ転送します。Node再接続。
CTA#
Builder(99€/月)。3日間トライアル、カード必須。無料REST:signup。 キー漏洩時はローテーション。
よくある質問#
キーをドメイン制限できますか?#
ドメイン制限はありません。だからプロキシが安全なパターンです。
WebSocketはCORSヘッダーを送りますか?#
CORSはWebSocketに適用されません。問題はブラウザからURLにキーを載せる点です。
成人向けの教育コンテンツですか?#
はい(18+)。
18歳以上の方を対象とした教育目的のコンテンツです。予想や利益の約束ではありません。日本では刑法により賭博は原則として禁止されています。