From 30105ce32d8ae65a8d44b11812d9b9fca0a03195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E6=96=87=E6=9D=B0?= <1139629972@qq.com> Date: Thu, 29 Feb 2024 16:13:45 +0800 Subject: [PATCH 1/2] =?UTF-8?q?del:=20=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/job/cmd/config.demo.yaml | 16 --- internal/job/config/config.go | 4 - internal/job/config/discord.go | 8 -- internal/job/config/scheduler.go | 6 - internal/job/dao/claim_badge_tweet.go | 92 --------------- internal/job/dao/discord.go | 92 --------------- internal/job/service/badge_v2.go | 2 - internal/job/service/quest_minter.go | 127 -------------------- internal/job/service/quest_minter_v2.go | 1 - internal/job/service/service.go | 9 -- internal/job/utils/twitter.go | 148 ------------------------ internal/job/utils/twitter_test.go | 19 --- 12 files changed, 524 deletions(-) delete mode 100644 internal/job/config/discord.go delete mode 100644 internal/job/config/scheduler.go delete mode 100644 internal/job/dao/claim_badge_tweet.go delete mode 100644 internal/job/dao/discord.go delete mode 100644 internal/job/service/quest_minter_v2.go delete mode 100644 internal/job/utils/twitter.go delete mode 100644 internal/job/utils/twitter_test.go diff --git a/internal/job/cmd/config.demo.yaml b/internal/job/cmd/config.demo.yaml index e851f81f..b599acf6 100644 --- a/internal/job/cmd/config.demo.yaml +++ b/internal/job/cmd/config.demo.yaml @@ -43,27 +43,11 @@ contract: badge: "0xaD1789A4cA2640a570a1268c84EA87e09A10A1f5" quest: "0xd1E50047cEbaD1d826c3F7961A35048B518652F2" quest-minter: "0xeb4E2EE6f165e7E1B9a4F1c4532C0433a6Ef397B" - -# twitter configuration -twitter: - bear-token: "" - -# scheduler configuration -scheduler: - active: true - airdrop-badge: "15 * * * *" # ipfs configuration ipfs: api: "https://ipfs.io/ipfs/" -# discord configuration -discord: - active: true - token: "TzATY3NA.G3oGb.VryUgxsBM" - success-channel: "1105777577794211840" - failed-channel: "1105777577794211840" - contract-v2: 137: badge: "0xaD1789A4cA2640a570a1268c84EA87e09A10A1f5" diff --git a/internal/job/config/config.go b/internal/job/config/config.go index 3d2a7066..745d02cf 100644 --- a/internal/job/config/config.go +++ b/internal/job/config/config.go @@ -9,10 +9,6 @@ type Config struct { Pgsql *Pgsql `mapstructure:"pgsql" json:"pgsql" yaml:"pgsql"` BlockChain *BlockChain `mapstructure:"blockchain" json:"blockchain" yaml:"blockchain"` Contract *Contract `mapstructure:"contract" json:"contract" yaml:"contract"` - Twitter *Twitter `mapstructure:"twitter" json:"twitter" yaml:"twitter"` - Scheduler *Scheduler `mapstructure:"scheduler" json:"scheduler" yaml:"scheduler"` IPFS *IPFS `mapstructure:"ipfs" json:"ipfs" yaml:"ipfs"` - Auth *Auth `mapstructure:"auth" json:"auth" yaml:"auth"` - Discord *Discord `mapstructure:"discord" json:"discord" yaml:"discord"` ContractV2 map[int64]ContractV2 `mapstructure:"contract-v2" json:"contract-v2" yaml:"contract-v2"` } diff --git a/internal/job/config/discord.go b/internal/job/config/discord.go deleted file mode 100644 index e10e4f59..00000000 --- a/internal/job/config/discord.go +++ /dev/null @@ -1,8 +0,0 @@ -package config - -type Discord struct { - Active bool `mapstructure:"active" json:"active" yaml:"active"` // 是否启用提醒功能 - Token string `mapstructure:"token" json:"token" yaml:"token"` // 机器人Token - SuccessChannel string `mapstructure:"success-channel" json:"success-channel" yaml:"success-channel"` // 成功提醒频道 - FailedChannel string `mapstructure:"failed-channel" json:"failed-channel" yaml:"failed-channel"` // 失败提醒频道 -} diff --git a/internal/job/config/scheduler.go b/internal/job/config/scheduler.go deleted file mode 100644 index 072ea664..00000000 --- a/internal/job/config/scheduler.go +++ /dev/null @@ -1,6 +0,0 @@ -package config - -type Scheduler struct { - Active bool `mapstructure:"active" json:"active" yaml:"active"` // 是否启用定时任务 - AirdropBadge string `mapstructure:"airdrop-badge" json:"airdrop-badge" yaml:"airdrop-badge"` // 定时空投 -} diff --git a/internal/job/dao/claim_badge_tweet.go b/internal/job/dao/claim_badge_tweet.go deleted file mode 100644 index c1e3c032..00000000 --- a/internal/job/dao/claim_badge_tweet.go +++ /dev/null @@ -1,92 +0,0 @@ -package dao - -import ( - "backend-go/internal/app/model" - "backend-go/internal/job/utils" - "errors" - "fmt" - "github.com/ethereum/go-ethereum/common" - "math/big" - "time" -) - -func (d *Dao) HasTweet(tweetId string) (bool, error) { - var total int64 - err := d.db.Model(&model.ClaimBadgeTweet{}). - Where("tweet_id", tweetId). - Count(&total).Error - return total != 0, err -} - -func (d *Dao) CreateClaimBadgeTweet(req *model.ClaimBadgeTweet) (err error) { - return d.db.Create(req).Error -} - -func (d *Dao) GetPendingAirdrop() (tokenId []*big.Int, listAddr []string, scores []*big.Int, err error) { - var pending []model.ClaimBadgeTweet - if err = d.db.Where("status", 0).Where("add_ts < ?", time.Now().Add(-60*time.Second).Unix()).Find(&pending).Error; err != nil { - return - } - for _, v := range pending { - tweet, err := utils.GetSpyderTweetById(d.c, v.TweetId) - if err != nil { - if err.Error() == "NETWORK_ERROR" { - continue - } - d.UpdateAirdroppedError(v.TokenId, v.Address, fmt.Sprintf("GetTweetById err:%s", err.Error())) - continue - } - // 验证推文内容 - if !utils.CheckIfMatchClaimTweet(d.c, v.TokenId, tweet) { - d.UpdateAirdroppedError(v.TokenId, v.Address, "InconsistentTweet") - continue - } - } - if len(tokenId) != len(listAddr) { - err = errors.New("token and address len error") - return - } - return tokenId, listAddr, scores, nil -} - -func (d *Dao) UpdateAirdropped(req *model.ClaimBadgeTweet) (err error) { - err = d.db.Model(&model.ClaimBadgeTweet{}). - Where("token_id = ? AND address = ?", req.TokenId, req.Address). - Update("status", 1).Error - return -} - -func (d *Dao) UpdateAirdroppedList(tokenIds []*big.Int, receivers []common.Address, hash string) (err error) { - tx := d.db.Model(&model.ClaimBadgeTweet{}).Begin() - for i, _ := range receivers { - tx.Where("token_id = ? AND address = ?", tokenIds[i], receivers[i].String()). - Updates(map[string]interface{}{"status": 1, "airdrop_hash": hash, "airdrop_ts": time.Now().Unix()}) - - } - - if err = tx.Commit().Error; err != nil { - return - } - for i, _ := range receivers { - if d.c.Discord.Active { - d.AirdropSuccessNotice(receivers[i].String(), tokenIds[i].String()) - } - } - return tx.Commit().Error -} - -func (d *Dao) UpdateAirdroppedError(tokenId string, address string, msg string) (err error) { - raw := d.db.Model(&model.ClaimBadgeTweet{}). - Where("token_id = ? AND address = ? AND status=0", tokenId, address). - Updates(map[string]interface{}{"msg": msg, "status": 2}) - if raw.Error != nil { - return err - } - if raw.RowsAffected == 0 { - return nil - } - if d.c.Discord.Active { - d.AirdropFailNotice(address, tokenId, msg) - } - return -} diff --git a/internal/job/dao/discord.go b/internal/job/dao/discord.go deleted file mode 100644 index 044281f7..00000000 --- a/internal/job/dao/discord.go +++ /dev/null @@ -1,92 +0,0 @@ -package dao - -import ( - "backend-go/internal/app/model" - "backend-go/pkg/log" - "fmt" - "github.com/bwmarrin/discordgo" - "github.com/tidwall/gjson" - "go.uber.org/zap" - "time" -) - -func (d *Dao) AirdropSuccessNotice(address string, tokenID string) { - // 查询用户信息 - var user model.Users - err := d.db.Model(&model.Users{}).Select("socials").Where("address = ?", address).First(&user).Error - if err != nil { - log.Errorv("查询用户失败", zap.String("address", address), zap.Error(err)) - return - } - Token := d.c.Discord.Token - // Create a new Discord session using the provided bot token. - dg, err := discordgo.New("Bot " + Token) - if err != nil { - log.Errorv("error creating Discord session", zap.Error(err)) - return - } - // Cleanly close down the Discord session. - defer dg.Close() - // In this example, we only care about receiving message events. - dg.Identify.Intents = discordgo.IntentsGuildMessages - // Open a websocket connection to Discord and begin listening. - err = dg.Open() - if err != nil { - log.Errorv("error opening connection", zap.Error(err)) - return - } - // 拼接信息 - link := fmt.Sprintf("https://polygonscan.com/token/%s?a=%s", d.c.Contract.Badge, tokenID) - description := fmt.Sprintf("Address: %s \n TokenID: %s \n %s \n <@%s>", address, tokenID, link, gjson.Get(string(user.Socials), "discord.id")) - footer := discordgo.MessageEmbedFooter{Text: "decertme-bot"} - embeds := []*discordgo.MessageEmbed{ - {Color: 0x0099FF, Title: "SBT 空投", - Description: description, - URL: fmt.Sprintf("https://decert.me/quests/%s", tokenID), - Footer: &footer, - Timestamp: time.Now().Format(time.RFC3339), - }, - } - msg := discordgo.MessageSend{Embeds: embeds} - _, err = dg.ChannelMessageSendComplex(d.c.Discord.SuccessChannel, &msg) - if err != nil { - log.Errorv("ChannelMessageSendComplex error", zap.Error(err)) - } -} - -func (d *Dao) AirdropFailNotice(address string, tokenID string, reason string) { - Token := d.c.Discord.Token - // Create a new Discord session using the provided bot token. - dg, err := discordgo.New("Bot " + Token) - if err != nil { - log.Errorv("error creating Discord session", zap.Error(err)) - return - } - // Cleanly close down the Discord session. - defer dg.Close() - // In this example, we only care about receiving message events. - dg.Identify.Intents = discordgo.IntentsGuildMessages - - // Open a websocket connection to Discord and begin listening. - err = dg.Open() - if err != nil { - log.Errorv("error opening connection", zap.Error(err)) - return - } - // 拼接信息 - description := fmt.Sprintf("Address: %s \n TokenID: %d \n Reason: %s", address, tokenID, reason) - footer := discordgo.MessageEmbedFooter{Text: "decertme-bot"} - embeds := []*discordgo.MessageEmbed{ - {Color: 0x0099FF, Title: "SBT 空投失败", - Description: description, - URL: fmt.Sprintf("https://decert.me/quests/%d", tokenID), - Footer: &footer, - Timestamp: time.Now().Format(time.RFC3339), - }, - } - msg := discordgo.MessageSend{Embeds: embeds} - _, err = dg.ChannelMessageSendComplex(d.c.Discord.FailedChannel, &msg) - if err != nil { - log.Errorv("ChannelMessageSendComplex error", zap.Error(err)) - } -} diff --git a/internal/job/service/badge_v2.go b/internal/job/service/badge_v2.go index db7ddfea..4b979a30 100644 --- a/internal/job/service/badge_v2.go +++ b/internal/job/service/badge_v2.go @@ -59,8 +59,6 @@ func (s *Service) handleClaimedV2(hash string, vLog *types.Log, chainID int64) ( log.Errorv("CreateChallenges error", zap.Any("challenges", challenges), zap.Error(err)) return err } - // 如果有空投记录则删除 - s.dao.UpdateAirdroppedError(tokenId, common.HexToAddress(vLog.Topics[2].Hex()).String(), "already claimed") s.handleTraverseStatus(hash, 1, "") return } diff --git a/internal/job/service/quest_minter.go b/internal/job/service/quest_minter.go index 56013d79..fc880e4a 100644 --- a/internal/job/service/quest_minter.go +++ b/internal/job/service/quest_minter.go @@ -3,16 +3,12 @@ package service import ( ABI "backend-go/abi" "backend-go/internal/app/model" - "backend-go/internal/app/utils" "backend-go/pkg/log" "errors" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - solsha3 "github.com/liangjies/go-solidity-sha3" "go.uber.org/zap" "math/big" "strings" @@ -70,129 +66,6 @@ func (s *Service) handleClaimed(client *ethclient.Client, hash string, vLog *typ log.Errorv("CreateChallenges error", zap.Any("challenges", challenges), zap.Error(err)) return err } - // 如果有空投记录则删除 - s.dao.UpdateAirdroppedError(tokenId, common.HexToAddress(vLog.Topics[2].Hex()).String(), "already claimed") s.handleTraverseStatus(hash, 1, "") return } - -func (s *Service) AirdropBadge() error { - provider := s.rpcV2[0].Next() - defer func() { - if err := recover(); err != nil { - provider.OnInvokeFault() - log.Errorv("AirdropBadge error", zap.Any("error", err), zap.Any("provider", provider)) - } - }() - client, err := ethclient.Dial(provider.Item) - if err != nil { - log.Error("ethclient dial error") - return errors.New("ethclient dial error") - } - tokenIds, listAddr, scores, err := s.dao.GetPendingAirdrop() - if err != nil { - log.Error("GetPendingAirdrop error") - return err - } - if len(tokenIds) == 0 { // no task return - return nil - } - tokenIdRes, receivers, scores := s.receiverNotClaimList(client, tokenIds, listAddr, scores) - log.Warn("AirdropBadge Run") - hash, err := s._airdropBadge(client, tokenIdRes, receivers, scores) - if err != nil { - log.Errorv("_airdropBadge", zap.Any("error", err)) - return nil - } - if err := s.dao.UpdateAirdroppedList(tokenIdRes, receivers, hash.String()); err != nil { - log.Errorv("updateAirdropStatus", zap.Any("error", err)) - } - if err := s.dao.CreateChallengesList(tokenIdRes, receivers, scores); err != nil { - log.Errorv("updateAirdropStatus", zap.Any("error", err)) - } - provider.OnInvokeSuccess() - return nil -} - -func (s *Service) _airdropBadge(client *ethclient.Client, tokenIDs []*big.Int, receivers []common.Address, scores []*big.Int) (txHash common.Hash, err error) { - signPrivateKey, err := crypto.HexToECDSA(s.c.BlockChain.SignPrivateKey) - if err != nil { - return - } - airdropPrivateKey, err := crypto.HexToECDSA(s.c.BlockChain.AirdropPrivateKey) - if err != nil { - return - } - airdropAddress, err := utils.PrivateKeyToAddress(airdropPrivateKey) - if err != nil { - return - } - hash := solsha3.SoliditySHA3( - // types - []string{"string", "uint256[]", "address", "address"}, - // values - []interface{}{ - "airdropBadge", tokenIDs, s.c.Contract.Badge, airdropAddress, - }, - ) - prefixedHash := solsha3.SoliditySHA3WithPrefix(hash) - signature, err := crypto.Sign(prefixedHash, signPrivateKey) - signature[64] += 27 - - questMinter, err := ABI.NewQuestMinter(common.HexToAddress(s.c.Contract.QuestMinter), client) - if err != nil { - return - } - auth, err := bind.NewKeyedTransactorWithChainID(airdropPrivateKey, big.NewInt(s.c.BlockChain.ChainID)) - if err != nil { - return - } - transactOpts := &bind.TransactOpts{ - From: airdropAddress, - Nonce: auth.Nonce, - Signer: auth.Signer, - Value: big.NewInt(0), - GasPrice: auth.GasPrice, - GasLimit: auth.GasLimit, - Context: auth.Context, - NoSend: false, - } - tx, err := questMinter.AirdropBadge(transactOpts, tokenIDs, receivers, scores, signature) - if err != nil { - log.Errorv("questMinter.AirdropBadge error", zap.Any("tokenIDs", tokenIDs), zap.Any("receivers", receivers), zap.Any("signature", signature), zap.Error(err)) - return - } - log.Infov("Airdrop tx sent :", zap.String("hash: ", tx.Hash().Hex())) - return tx.Hash(), nil -} - -func (s *Service) receiverNotClaimList(client *ethclient.Client, tokenId []*big.Int, receivers []string, scores []*big.Int) (tokenIdRes []*big.Int, receiversNotClaim []common.Address, scoresRes []*big.Int) { - badge, err := ABI.NewBadge(common.HexToAddress(s.c.Contract.Badge), client) - if err != nil { - return - } - for i, _ := range receivers { - if !utils.IsValidAddress(receivers[i]) { - continue - } - res, err := badge.BalanceOf(nil, common.HexToAddress(receivers[i]), tokenId[i]) - if err != nil { - continue - } - if res.Cmp(big.NewInt(0)) != 0 { - // already claimed update status - if err = s.dao.UpdateAirdroppedError(tokenId[i].String(), receivers[i], "already claimed"); err != nil { - log.Errorv("UpdateAirdropped error", zap.Error(err)) - } - continue - } - tokenIdRes = append(tokenIdRes, tokenId[i]) - receiversNotClaim = append(receiversNotClaim, common.HexToAddress(receivers[i])) - scoresRes = append(scoresRes, scores[i]) - } - if len(tokenIdRes) != len(receiversNotClaim) { - err = errors.New("token and address len error") - return - } - return -} diff --git a/internal/job/service/quest_minter_v2.go b/internal/job/service/quest_minter_v2.go deleted file mode 100644 index 6d43c336..00000000 --- a/internal/job/service/quest_minter_v2.go +++ /dev/null @@ -1 +0,0 @@ -package service diff --git a/internal/job/service/service.go b/internal/job/service/service.go index a067b7d0..18c06b2a 100644 --- a/internal/job/service/service.go +++ b/internal/job/service/service.go @@ -5,11 +5,9 @@ import ( "backend-go/internal/job/dao" "backend-go/internal/job/initialize" "backend-go/pkg/balancer" - "backend-go/pkg/log" "context" "github.com/ethereum/go-ethereum/common" "github.com/robfig/cron/v3" - "go.uber.org/zap" ) // Service struct @@ -35,13 +33,6 @@ func New(c *config.Config) (s *Service) { s.rpcV2 = initialize.InitProviderV2(c) go s.consumeTransaction() // 消费 go s.StartTransaction() // 任务 - if s.c.Scheduler.Active { - s.cron = cron.New() - if _, err := s.cron.AddFunc(c.Scheduler.AirdropBadge, func() { s.AirdropBadge() }); err != nil { - log.Errorv("AirdropBadge cron init error", zap.Error(err)) - } - s.cron.Start() - } return } diff --git a/internal/job/utils/twitter.go b/internal/job/utils/twitter.go deleted file mode 100644 index 1a765a88..00000000 --- a/internal/job/utils/twitter.go +++ /dev/null @@ -1,148 +0,0 @@ -package utils - -import ( - "backend-go/internal/job/config" - "backend-go/pkg/log" - "context" - "errors" - "fmt" - "github.com/PuerkitoBio/goquery" - "github.com/chromedp/chromedp" - "github.com/imroc/req/v3" - "github.com/tidwall/gjson" - "go.uber.org/zap" - "regexp" - "strings" - "sync" - "time" -) - -var onceTwitter sync.Once - -type configReqTwitter struct { - clientTwitter *req.Client - clientReq *req.Client -} - -var clientTwitter *configReqTwitter - -func GetTwitterClient(c *config.Config) *configReqTwitter { - onceTwitter.Do(func() { - clientTwitter = new(configReqTwitter) - clientTwitter.clientTwitter = req.C(). - SetTimeout(30 * time.Second). - SetCommonRetryCount(2). - SetUserAgent("v2TweetLookupJS"). - SetCommonBearerAuthToken(c.Twitter.BearToken) - - clientTwitter.clientReq = req.C().SetTimeout(30 * time.Second). - SetCommonRetryCount(2).SetRedirectPolicy(req.NoRedirectPolicy()) - }) - return clientTwitter -} - -// GetTweetById -// @description: 获取推特帖子内容 -// @param: tweetId string -// @return: string, error -func GetTweetById(c *config.Config, tweetId string) (string, error) { - client := GetTwitterClient(c) - url := "https://api.twitter.com/2/tweets?ids=" + tweetId - req, err := client.clientTwitter.R().Get(url) - return gjson.Get(req.String(), "data.0.text").String(), err -} - -// GetSpyderTweetById -// @description: 获取推特帖子内容 -// @param: tweetId string -// @return: string, error -func GetSpyderTweetById(c *config.Config, tweetId string) (string, error) { - // 参数设置 - options := []chromedp.ExecAllocatorOption{ - //chromedp.UserDataDir(""), - //chromedp.ExecPath("G:\\Program Files\\Chrome\\App\\Chrome.exe"), - //启动chrome的时候不检查默认浏览器 - chromedp.Flag("no-default-browser-check", true), - //启动chrome 不适用沙盒, 性能优先 - chromedp.Flag("no-sandbox", true), - chromedp.Flag("headless", true), - //chromedp.UserAgent(`Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36`), - } - options = append(chromedp.DefaultExecAllocatorOptions[:], options...) - allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), options...) - defer cancel() - - // 创建chrome示例 - ctx, cancel := chromedp.NewContext(allocCtx) - defer cancel() - ctx, cancel = context.WithTimeout(ctx, 150*time.Hour) - defer cancel() - //var textBox bool - //cookies := strings.Split(s.c.Spyder.Cookie, ";") - var html string - err := chromedp.Run(ctx, - chromedp.Tasks{ - // 打开导航 - chromedp.Navigate(fmt.Sprintf("https://twitter.com/EmberCN/status/%s", tweetId)), - // 等待元素加载完成 - chromedp.WaitVisible("body", chromedp.ByQuery), - // 等待5秒 - chromedp.Sleep(15 * time.Second), - //获取需要的数据 - chromedp.OuterHTML(`html`, &html, chromedp.ByQuery), - }, - ) - if err != nil { - log.Errorv("err", zap.Error(err)) - return "", errors.New("NETWORK_ERROR") - } - // 将字符串转换为io.Reader - reader := strings.NewReader(html) - // 解析HTML文档 - doc, err := goquery.NewDocumentFromReader(reader) - if err != nil { - log.Errorv("NewDocumentFromReader err", zap.Error(err)) - return "", err - } - - // 匹配标签的内容 - meta := doc.Find("meta[property='og:description']") - content, exists := meta.Attr("content") - if exists { - fmt.Println(content) - return content, err - } - //.Each(func(index int, meta *goquery.Selection) { - // content, exists := meta.Attr("content") - // if exists { - // return content - // } - //}) - return "", err -} - -// CheckIfMatchClaimTweet -// @description: 检查推特帖子内容相符 -// @param: tokenId uint64, tweet string -// @return: bool -func CheckIfMatchClaimTweet(c *config.Config, tokenId string, tweet string) bool { - const twitter = "@decertme" - const twitterLink = "https://decert.me/quests/" - // 推文包含有「@DecertMe」 - if !strings.Contains(strings.ToLower(tweet), twitter) { - return false - } - // 包含挑战链接 - pattern := regexp.MustCompile(`((https?|http)://[^\s/$.?#].[^\s]*)`) - matches := strings.Replace(pattern.FindString(tweet), "\\n", "", -1) - expectURL := strings.TrimSpace(twitterLink) + tokenId - client := GetTwitterClient(c) - res, err := client.clientReq.R().Get(strings.TrimSpace(matches)) - if err != nil { - return false - } - if len(res.Header["Location"]) == 0 || res.Header["Location"][0] != expectURL { - return false - } - return true -} diff --git a/internal/job/utils/twitter_test.go b/internal/job/utils/twitter_test.go deleted file mode 100644 index 7ec7cdaf..00000000 --- a/internal/job/utils/twitter_test.go +++ /dev/null @@ -1,19 +0,0 @@ -package utils - -import ( - "backend-go/internal/job/config" - "backend-go/internal/job/initialize" - "testing" -) - -var c *config.Config - -func TestMain(m *testing.M) { - c = initialize.Viper("../cmd/config.yaml") - m.Run() -} - -func TestGetSpyderTweetById(t *testing.T) { - GetSpyderTweetById(c, "1664476729812094977") - -} From 7a812137a511b62c81374e472ecfb6a4fc979219 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=81=E6=96=87=E6=9D=B0?= <1139629972@qq.com> Date: Thu, 29 Feb 2024 16:14:39 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E6=8E=A8=E8=8D=90=E6=95=99=E7=A8=8B?= =?UTF-8?q?=E5=8F=8D=E5=BA=8F=E5=88=97=E5=8C=96=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/job/service/quest.go | 2 +- internal/job/service/quest_v2.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/job/service/quest.go b/internal/job/service/quest.go index aa1cfddb..2d329019 100644 --- a/internal/job/service/quest.go +++ b/internal/job/service/quest.go @@ -130,7 +130,7 @@ func (s *Service) handleModifyQuest(hash string, resJson []byte) (err error) { Type: 0, // TODO MetaData: []byte(metadata), ExtraData: extraData, - Recommend: gjson.Get(tr.Params.String(), "recommend").Raw, + Recommend: gjson.Get(tr.Params.String(), "recommend").String(), QuestData: []byte(questDataDetail), } if err = s.dao.UpdateQuest(&quest); err != nil { diff --git a/internal/job/service/quest_v2.go b/internal/job/service/quest_v2.go index ef2fe770..0d17516d 100644 --- a/internal/job/service/quest_v2.go +++ b/internal/job/service/quest_v2.go @@ -81,7 +81,7 @@ func (s *Service) handleQuestCreatedV2(hash string, vLog *types.Log) (err error) Version: "2", ChainID: tr.ChainID, } - fmt.Println(quest) + // 区分合辑和Quest if collectionID == 0 { if err = s.dao.CreateQuest(&quest); err != nil { @@ -131,7 +131,7 @@ func (s *Service) handleModifyQuestV2(hash string, vLog *types.Log) (err error) Type: 0, // TODO MetaData: []byte(metadata), ExtraData: extraData, - Recommend: gjson.Get(tr.Params.String(), "recommend").Raw, + Recommend: gjson.Get(tr.Params.String(), "recommend").String(), QuestData: []byte(questDataDetail), Version: "2", }