code
This commit is contained in:
173
app/jobs/jobs.go
173
app/jobs/jobs.go
@ -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) {
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user