使用TradingView Widget调用搜索接口遇403 Forbidden问题求助
解决TradingView搜索接口403 Forbidden问题
核心原因
TradingView的公开搜索接口存在CORS限制和反爬校验机制:浏览器直接访问时会自动携带符合要求的请求头(如User-Agent、Referer),而AJAX或服务器直接调用缺少这些头,或被识别为非授权请求,导致返回403。
推荐解决方案:使用Charting Library内置搜索方法
既然你已拥有Charting Library API权限,官方提供的searchSymbols方法是最稳定、合规的方式,完全避免接口调用限制:
// 假设已完成Charting Library初始化,得到chart实例 chart.searchSymbols( 'NISHIB', // 要搜索的标的代码 '', // 交易所过滤(留空则全平台搜索) 'crypto', // 标的类型 (searchResults) => { // 处理搜索结果 if (searchResults.length > 0) { const targetSymbol = searchResults[0].symbol; // 将图表切换到匹配的标的 chart.setSymbol(targetSymbol, () => { console.log('图表已切换至目标标的'); }); } } );
临时前端方案:模拟浏览器请求头
如果必须调用公开搜索接口,可在AJAX请求中添加浏览器标准请求头(注意:该方法依赖TradingView反爬策略,随时可能失效,不建议生产环境使用):
function loadDoc() { const xhttp = new XMLHttpRequest(); xhttp.onload = function() { document.getElementById("demo").innerHTML = this.responseText; } xhttp.open("GET", "https://symbol-search.tradingview.com/symbol_search/v3/?text=NISHIB&lang=en&search_type=crypto"); // 添加浏览器标识头 xhttp.setRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); // 若你的域名在TradingView授权列表,添加Referer头 xhttp.setRequestHeader('Referer', 'https://你的授权域名.com'); xhttp.send(); }
生产环境稳定方案:服务器端代理
通过自己的服务器代理请求TradingView接口,规避浏览器CORS限制,同时可灵活设置请求头:
// Node.js/Express示例 const express = require('express'); const axios = require('axios'); const app = express(); app.get('/api/search-tradingview-symbol', async (req, res) => { try { const { text, lang, search_type } = req.query; const tvResponse = await axios.get('https://symbol-search.tradingview.com/symbol_search/v3/', { params: { text, lang, search_type }, headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', // 可选:添加授权域名作为Referer 'Referer': 'https://你的授权域名.com' } }); res.json(tvResponse.data); } catch (err) { res.status(err.response?.status || 500).send(err.message); } }); app.listen(3000, () => console.log('代理服务器运行在端口3000'));
前端调用代理接口即可:/api/search-tradingview-symbol?text=NISHIB&lang=en&search_type=crypto
内容的提问来源于stack exchange,提问作者Eran Levi
相关产品推荐
相关产品推荐

