package top.lvzhiqiang.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.jsoup.Connection; import org.springframework.stereotype.Service; import top.lvzhiqiang.service.CoinService; import top.lvzhiqiang.util.CheckSign4Bitget; import top.lvzhiqiang.util.DateUtils; import top.lvzhiqiang.util.JsoupUtil; import java.io.UnsupportedEncodingException; import java.net.Proxy; import java.security.InvalidKeyException; import java.util.HashMap; import java.util.Map; /** * Coin ServiceImpl * * @author lvzhiqiang * 2023/9/5 15:23 */ @Service @Slf4j public class CoinServiceImpl implements CoinService { // 所有REST请求的header都必须包含以下key: private static final Map basicHeaderMap = new HashMap<>(); // 主域名 URL private static final String mainUrl = "https://api.bitget.com"; // 私钥,由系统随机生成,用于签名的生成。 private static final String secretKey = "1fdd0fc2976bea80189ba13710e12825ca3ef6c5e25a0d76fd03f8f6cd4a61d9"; static { // API KEY作为一个字符串。 basicHeaderMap.put("ACCESS-KEY", "bg_433d37306df0e8901c6d107c6d9e9111"); // 使用base64编码签名(请参阅签名消息)。 basicHeaderMap.put("ACCESS-SIGN", ""); // 您请求的时间戳。 basicHeaderMap.put("ACCESS-TIMESTAMP", ""); // 您在创建API KEY时设置的口令。 basicHeaderMap.put("ACCESS-PASSPHRASE", "7f934f62f2701bee932204580d115228"); // 统一设置为application/json。 basicHeaderMap.put("Content-Type", "application/json"); // 支持多语言, 如:中文(zh-CN),英语(en-US) basicHeaderMap.put("locale", "zh-CN"); } @Override public String monitorJob() { return null; } /** * 获取全部合约仓位信息V2 * * @author lvzhiqiang * 2023/9/5 15:23 */ @Override public String findAllPositionv2() { JSONObject result = handleAllPositionV2(); JSONArray data = result.getJSONArray("data"); StringBuffer sb = new StringBuffer("total:".concat(String.valueOf(data.size())).concat("
")); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); for (int i = 0; i < data.size(); i++) { JSONObject jsonObject = data.getJSONObject(i); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); sb.append(""); } sb.append("
币对名称保证金币种持仓方向当前委托待成交的数量保证金数量自动追加保证金仓位可用仓位冻结仓位总数量杠杆倍数已实现盈亏平均开仓价保证金模式持仓模式未实现盈亏预估强平价维持保证金率标记价格最近更新时间
").append(jsonObject.getString("symbol")).append("").append(jsonObject.getString("marginCoin")).append("").append(jsonObject.getString("holdSide")).append("").append(jsonObject.getString("openDelegateCount")).append("").append(jsonObject.getString("margin")).append("").append(jsonObject.getString("autoMargin")).append("").append(jsonObject.getString("available")).append("").append(jsonObject.getString("locked")).append("").append(jsonObject.getString("total")).append("").append(jsonObject.getString("leverage")).append("").append(jsonObject.getString("achievedProfits")).append("").append(jsonObject.getString("averageOpenPrice")).append("").append(jsonObject.getString("marginMode")).append("").append(jsonObject.getString("holdMode")).append("").append(jsonObject.getString("unrealizedPL")).append("").append(jsonObject.getString("liquidationPrice")).append("").append(jsonObject.getString("keepMarginRate")).append("").append(jsonObject.getString("marketPrice")).append("").append(DateUtils.timeToString(jsonObject.getLong("cTime"))).append("
"); return sb.toString(); } /** * 处理全部合约仓位信息V2 */ @Override public JSONObject handleAllPositionV2() { String requestPath = "/api/mix/v1/position/allPosition-v2"; String timestamp = String.valueOf(System.currentTimeMillis()); String queryString = "productType=umcbl"; Map headerMap = new HashMap<>(); headerMap.putAll(basicHeaderMap); try { String accessSign = CheckSign4Bitget.generate(timestamp, "GET", requestPath, queryString, null, secretKey); headerMap.put("ACCESS-TIMESTAMP", timestamp); headerMap.put("ACCESS-SIGN", accessSign); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } catch (InvalidKeyException e) { throw new RuntimeException(e); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } Map paramMap = new HashMap<>(); paramMap.put("productType", "umcbl"); try { String requestUrl = mainUrl + requestPath; //Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 7890)); Connection.Response response = JsoupUtil.requestBody(requestUrl, JsoupUtil.HTTP_GET, Proxy.NO_PROXY, headerMap, paramMap); return JSONObject.parseObject(response.body()); } catch (Exception e) { throw new RuntimeException(e); } } }