微盘数字货币火币网api延迟很高,导致k线很卡的问题结局
1.换高配服务器
2.换币安接口
3.火币网api接口代理镜像
1.换高配服务器
2.换币安接口
3.火币网api接口代理镜像
# K线数据接口
https://api.binance.com/api/v3/klines?symbol=BTCUSDT&interval=1d&limit=200
# 优点:
- 响应速度快
- 完全免费
- 稳定可靠
- 数据格式类似
# K线数据接口
https://www.okx.com/api/v5/market/candles?instId=BTC-USDT&bar=1D
# 优点:
- 国内访问快
- 免费使用
- 数据实时性好
# 市场数据接口
https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usdt&days=200&interval=daily
# 优点:
- 无需注册
- 免费额度大
- 数据全面
# 历史K线数据
https://min-api.cryptocompare.com/data/v2/histoday?fsym=BTC&tsym=USDT&limit=200
# 优点:
- 响应快
- 基础功能免费
- 数据准确
****************
镜像代理 火币网api
****************
public function getkdata()
{
$pid = $this->app->request->param('pid');
if(!$pid) $this->error('产品id不能为空');
$num = $this->app->request->param('num', 30);
if(!$num) $this->error('时间不能为空');
$pro = Db::name('LcProduct')->where(['id'=>$pid])->find();
if(!$pro) $this->error('产品信息异常');
$interval = input('interval','1');
$klength = ($interval == 'd') ? 24*60*60*$num : $interval*60*$num;
$k_map['pid'] = $pid;
$k_map['ktime'] = array('between', array(time() - $klength, time()));
$pro['procode'] = $pro['code'];
if(strpos($pro['procode'],"btc")!==false || strpos($pro['procode'],"usdt")!==false) {
// 转换为Binance的时间间隔格式
switch ($interval) {
case '1': $binance_interval = "1m"; break;
case '5': $binance_interval = "5m"; break;
case '15': $binance_interval = "15m"; break;
case '30': $binance_interval = "30m"; break;
case '60': $binance_interval = "1h"; break;
case 'd': $binance_interval = "1d"; break;
default: $this->error('Invalid interval'); break;
}
try {
// 构建交易对
$testacode = explode("_", $pro['procode']);
$symbol = strtoupper($testacode[0].$testacode[1]);
// 设置CURL选项
$ch = curl_init();
$timeout = 5;
$url = "https://api.binance.com/api/v3/klines?symbol={$symbol}&interval={$binance_interval}&limit={$num}";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$data = curl_exec($ch);
if(curl_errno($ch)) {
// 如果Binance API失败,尝试使用备用API(OKX)
$backup_url = "https://www.okx.com/api/v5/market/candles?instId={$testacode[0]}-{$testacode[1]}&bar={$binance_interval}";
curl_setopt($ch, CURLOPT_URL, $backup_url);
$data = curl_exec($ch);
if(curl_errno($ch)) {
$this->error('API request failed');
}
}
curl_close($ch);
$_data_arr = json_decode($data, true);
// Binance数据处理
if(isset($_data_arr) && is_array($_data_arr)) {
$res_arr = [];
foreach($_data_arr as $v) {
// Binance K线数据格式:
// [0]开盘时间 [1]开盘价 [2]最高价 [3]最低价 [4]收盘价
$res_arr[] = [
intval($v[0]/1000), // 转换为秒级时间戳
floatval($v[1]), // 开盘价
floatval($v[4]), // 收盘价
floatval($v[3]), // 最低价
floatval($v[2]) // 最高价
];
}
// 缓存结果(可选)
cache('kline_'.$symbol.'_'.$interval, $res_arr, 60); // 缓存1分钟
return $res_arr;
}
} catch(\Exception $e) {
$this->error('Data fetch error: ' . $e->getMessage());
}
}
$this->error('Unsupported trading pair');
}
*********************镜像代理 火币网api
<?php
header('Access-Control-Allow-Origin: *'); // 允许跨域访问
header('Content-Type: application/json; charset=utf-8');
class KlineProxy {
private $cache_dir = './cache/'; // 缓存目录
private $cache_time = 5; // 缓存时间(秒)
private $api_timeout = 5; // API超时时间(秒)
public function __construct() {
if (!is_dir($this->cache_dir)) {
mkdir($this->cache_dir, 0777, true);
}
}
// 主处理方法
public function handle() {
try {
// 获取参数
$period = $this->getParam('period', '1min');
$size = $this->getParam('size', '50');
$symbol = $this->getParam('symbol', 'btcusdt');
// 验证参数
$this->validateParams($period, $size, $symbol);
// 检查缓存
$cache_key = "{$symbol}_{$period}_{$size}";
$cache_data = $this->getCache($cache_key);
if ($cache_data !== false) {
return $this->success($cache_data);
}
// 尝试主要API (火币)
$data = $this->getHuobiData($period, $size, $symbol);
if ($data) {
$this->setCache($cache_key, $data);
return $this->success($data);
}
// 尝试备用API (币安)
$data = $this->getBinanceData($period, $size, $symbol);
if ($data) {
$this->setCache($cache_key, $data);
return $this->success($data);
}
throw new Exception('无法获取数据');
} catch (Exception $e) {
return $this->error($e->getMessage());
}
}
// 从火币获取数据
private function getHuobiData($period, $size, $symbol) {
$url = "https://api.huobi.pro/market/history/kline";
$params = [
'period' => $period,
'size' => $size,
'symbol' => $symbol
];
$response = $this->curlRequest($url, $params);
if (!$response) {
return false;
}
$data = json_decode($response, true);
if ($data['status'] !== 'ok' || empty($data['data'])) {
return false;
}
return $data;
}
// 从币安获取数据(备用)
private function getBinanceData($period, $size, $symbol) {
// 转换时间间隔格式
$interval_map = [
'1min' => '1m',
'5min' => '5m',
'15min' => '15m',
'30min' => '30m',
'60min' => '1h',
'1day' => '1d'
];
$interval = $interval_map[$period] ?? '1m';
$url = "https://api.binance.com/api/v3/klines";
$params = [
'symbol' => strtoupper($symbol),
'interval' => $interval,
'limit' => $size
];
$response = $this->curlRequest($url, $params);
if (!$response) {
return false;
}
$data = json_decode($response, true);
if (empty($data)) {
return false;
}
// 转换为火币格式
return [
'status' => 'ok',
'data' => array_map(function($item) {
return [
'id' => intval($item[0] / 1000),
'open' => $item[1],
'close' => $item[4],
'low' => $item[3],
'high' => $item[2]
];
}, $data)
];
}
// CURL请求
private function curlRequest($url, $params = []) {
$ch = curl_init();
if (!empty($params)) {
$url .= '?' . http_build_query($params);
}
curl_setopt_array($ch, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => $this->api_timeout,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => [
'User-Agent: Mozilla/5.0',
'Accept: application/json'
]
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($http_code === 200) ? $response : false;
}
// 缓存操作
private function getCache($key) {
$file = $this->cache_dir . md5($key) . '.cache';
if (file_exists($file) && (time() - filemtime($file) < $this->cache_time)) {
return json_decode(file_get_contents($file), true);
}
return false;
}
private function setCache($key, $data) {
$file = $this->cache_dir . md5($key) . '.cache';
file_put_contents($file, json_encode($data));
}
// 辅助方法
private function getParam($key, $default = null) {
return isset($_GET[$key]) ? trim($_GET[$key]) : $default;
}
private function validateParams($period, $size, $symbol) {
if (empty($period) || empty($size) || empty($symbol)) {
throw new Exception('参数不完整');
}
if (!is_numeric($size) || $size < 1 || $size > 2000) {
throw new Exception('size参数无效');
}
}
private function success($data) {
return json_encode([
'code' => 0,
'msg' => 'success',
'data' => $data
]);
}
private function error($msg) {
return json_encode([
'code' => 1,
'msg' => $msg,
'data' => null
]);
}
}
// 执行
$proxy = new KlineProxy();
echo $proxy->handle();
打赏
-
支付宝扫一扫
-
微信扫一扫