This commit is contained in:
daichao
2025-02-19 09:41:05 +08:00
parent 935fc36b5a
commit 747d8de9b5
4 changed files with 783 additions and 1 deletions

View File

@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"github.com/bytedance/sonic"
"go-admin/app/admin/models"
"go-admin/app/admin/service"
"go-admin/app/admin/service/dto"
@ -14,6 +15,12 @@ import (
"go-admin/pkg/utility/snowflakehelper"
"go-admin/services/binanceservice"
"go-admin/services/fileservice"
"io"
"net/http"
"os"
"os/exec"
"path/filepath"
"slices"
"strconv"
"strings"
"time"
@ -41,6 +48,9 @@ type AutoPlaceOrder struct {
type LimitOrderTimeoutDuration struct {
}
type ListenSymbol struct {
}
// 初始化合约交易对
func (t InitFuturesSymbol) Exec(arg interface{}) error {
str := time.Now().Format(timeFormat) + " [INFO] JobCore InitFuturesSymbol exec success"
@ -319,3 +329,166 @@ func (t LimitOrderTimeoutDuration) ReFutOrderPlace(db *gorm.DB, order models.Lin
}
return err
}
func (l ListenSymbol) Exec(arg interface{}) error {
str := time.Now().Format(timeFormat) + " [INFO] JobCore ClearLogJob exec success"
defer logger.Info(str)
var db *gorm.DB
for _, item := range sdk.Runtime.GetDb() {
db = item
break
}
set, err := helper.DefaultRedis.GetAllSortSet(rediskey.ListenAveLastSymbol)
if err != nil {
logger.Error("获取监听交易对失败")
return err
}
fmt.Println(set)
//if len(set) == 0 {
// return nil
//}
aveToken, _ := helper.DefaultRedis.GetString(rediskey.AveRequestToken)
if aveToken == "" {
aveToken, err = l.GetAveRequestId()
if err != nil {
logger.Error("获取请求id失败err:", err)
return err
}
}
chainSlice := []string{"solana", "bsc", "eth"}
for _, chain := range chainSlice {
symbols, err := l.GetAveLastSymbol(chain, aveToken)
if err != nil {
continue
}
for _, symbol := range symbols.Data.Data {
if slices.Contains(set, symbol.Token0Symbol+symbol.Token1Symbol) {
// 清除数据
//发送邮箱
l.SendEmailNotice(db, symbol.Pair, symbol.Token0Symbol+symbol.Token1Symbol, chain)
continue
}
}
}
return nil
}
// GetAveRequestId 获取请求id
func (l ListenSymbol) GetAveRequestId() (aveToken string, err error) {
execPath, err := os.Getwd()
// 获取可执行文件所在的目录
execDir := fmt.Sprintf("%s/config/ave.js", filepath.Dir(filepath.Dir(execPath)))
_, err = os.Stat(execDir)
if err != nil {
logger.Error("可执行的js 文件不存在")
return aveToken, err
}
command := exec.Command("node", execDir)
output, err := command.CombinedOutput()
if err != nil {
logger.Error("执行出错:err", err)
return aveToken, err
}
client := &http.Client{}
m := map[string]string{
"request_id": string(output),
}
marshal, _ := sonic.Marshal(m)
var data = strings.NewReader(string(marshal))
req, err := http.NewRequest("POST", "https://febweb002.com/v1api/v1/captcha/requestToken", data)
if err != nil {
return aveToken, err
}
req.Header.Set("accept", "*/*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
req.Header.Set("ave-platform", "web")
req.Header.Set("content-type", "application/json")
req.Header.Set("origin", "https://ave.ai")
req.Header.Set("priority", "u=1, i")
req.Header.Set("referer", "https://ave.ai/")
req.Header.Set("sec-ch-ua", `"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36")
resp, err := client.Do(req)
if err != nil {
logger.Error("请求失败err:", err)
return aveToken, err
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
logger.Error("读取响应失败err:", err)
return aveToken, err
}
var res RequestId
sonic.Unmarshal(bodyText, &res)
if res.Status == 1 {
aveToken = res.Data.Id
helper.DefaultRedis.SetStringExpire(rediskey.AveRequestToken, res.Data.Id, time.Duration(60*time.Second))
}
return aveToken, err
}
func (l ListenSymbol) GetAveLastSymbol(chain, token string) (aveLastSymbolResp AveLastSymbolResp, err error) {
client := &http.Client{}
url := fmt.Sprintf("https://api.agacve.com/v1api/v4/tokens/treasure/list?chain=%s&sort=created_at&sort_dir=desc&pageNO=1&pageSize=50&category=new&refresh_total=0", chain)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
logger.Error("获取最新交易对列表出错err:", err)
return AveLastSymbolResp{}, err
}
req.Header.Set("accept", "application/json, text/plain, */*")
req.Header.Set("accept-language", "zh-CN,zh;q=0.9")
req.Header.Set("ave-udid", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36--1739784205001--97086a46-bce0-4ca9-8e0e-78f5075be306")
req.Header.Set("cache-control", "no-cache")
req.Header.Set("lang", "en")
req.Header.Set("origin", "https://ave.ai")
req.Header.Set("pragma", "no-cache")
req.Header.Set("priority", "u=1, i")
req.Header.Set("referer", "https://ave.ai/")
req.Header.Set("sec-ch-ua", `"Not A(Brand";v="8", "Chromium";v="132", "Google Chrome";v="132"`)
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", `"Windows"`)
req.Header.Set("sec-fetch-dest", "empty")
req.Header.Set("sec-fetch-mode", "cors")
req.Header.Set("sec-fetch-site", "cross-site")
req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36")
req.Header.Set("x-auth", token)
resp, err := client.Do(req)
if err != nil {
logger.Error("获取最新交易对列表出错1err:", err)
return AveLastSymbolResp{}, err
}
defer resp.Body.Close()
bodyText, err := io.ReadAll(resp.Body)
if err != nil {
logger.Error("获取最新交易对列表出错2err:", err)
return AveLastSymbolResp{}, err
}
var res AveLastSymbolResp
sonic.Unmarshal(bodyText, &res)
return res, nil
}
// SendEmailNotice 发送邮箱通知
// pair 合约地址
// symbol 完整交易对
// chain 链
func (l ListenSymbol) SendEmailNotice(db *gorm.DB, pair string, symbol string, chain string) {
}