“ 区块链数据都在链上大家都可以看到,前阵子发现一些币圈科学家卖NFT pass卡的,其实就是跟踪以太坊的钱包地址,发现几个大V都去免费mint NFT的时候就去跟着mint, 他实现第一步就是必须监控这些钱包的地址。”
01
—
监控区块链地址实现方案
个人分析,实现方式有两种,第一种是监听以太坊区块内容,监听最新区块内的数据,解析出地址和方法等方式和监控的地址对比,这个方式更快,但是更底层,实现起来难一些;第二种方式就是用爬虫的方式,比如以太坊链都是有以太坊浏览器的,这样就可以方便的用爬虫的方式监控某地址页面的变化,来判断账户中的变化,进行监控。。
02
—
具体实现
我是以golang语言编写,定时对某个地址的以太坊浏览器的内容进行监控,如果有操作就进行分析
具体实现逻辑,就是监控最新“账单”时间,小于一定的时间,通过钉钉通知自己

package mainimport ("bytes""fmt""github.com/gocolly/colly""io/ioutil""net/http""strings""time")func sendDDingMsg(msg string){//钉钉机器人自己获取自己的apipostUrl := "https://oapi.dingtalk.com/robot/send?access_token=xxxxxmsgjson := `{"text":{"content":"free mint报警, 赶快去查看\r\n` + msg +`"},"msgtype":"text"}`req, err := http.NewRequest("POST", postUrl, bytes.NewBuffer([]byte(msgjson)))req.Header.Set("Content-Type", "application/json")client := &http.Client{}resp, err := client.Do(req)if err != nil {panic(err)}defer resp.Body.Close()fmt.Println("response Status:", resp.Status)fmt.Println("response Headers:", resp.Header)body, _ := ioutil.ReadAll(resp.Body)fmt.Println("response Body:", string(body))fmt.Println("发送钉钉消息成功")}func startTimer(f func(), duration time.Duration) {go func() {for {fmt.Println("start search")f()now := time.Now()// 计算下一个零点next := now.Add(duration)next = time.Date(next.Year(), next.Month(), next.Day(), next.Hour(), next.Minute(), next.Second(), 0, next.Location())t := time.NewTimer(next.Sub(now))<-t.C}}()}func startM(){c := colly.NewCollector()c.OnHTML("tr", func(e *colly.HTMLElement) {/*mint_time := e.ChildAttr("td","showAge")fmt.Println("mint time is ", mint_time)*/mint_time := e.ChildText("td.showAge")if mint_time == "" {return}fmt.Println("mint time is ", mint_time)if strings.Contains(mint_time, "hrs") || strings.Contains(mint_time, "day") || strings.Contains(mint_time, "hr") {return}var time_s int = 6if strings.Contains(mint_time, "mins") {fmt.Sscanf(mint_time, "%d mins ago", &time_s)}if strings.Contains(mint_time, "min") {fmt.Sscanf(mint_time, "%d min ago", &time_s)}if time_s <= 2 {mint_contract := e.ChildText("td:nth-child(9)")if mint_contract != "" {mint_contract = "https://etherscan.io/address/" + mint_contractfmt.Println("mint contract is ", mint_contract)mint_hash := e.ChildText("td:nth-child(2)")mint_hash = "https://etherscan.io/tx/" + mint_hashfmt.Println("mint hash is ", mint_hash)mint_method := e.ChildText("td:nth-child(3)")fmt.Println("mint Method is ", mint_method)sendDDingMsg("监控地址为:https://etherscan.io/address/0x111111111111111\r\n 交易页为:" + mint_hash + "\r\n 调用函数为:" + mint_method + "\r\n 交易合同页为:"+ mint_contract)}}})c.OnRequest(func(r *colly.Request) {fmt.Println("Visiting", r.URL)})//这里写需要监控页的地址c.Visit("https://etherscan.io/address/0x1111111111111111")}func main() {startTimer(startM, time.Duration(1)*time.Minute)for {fmt.Println(time.Now().Format("2006-01-02 15:04:05"))fmt.Println("wait .....")time.Sleep(30 * time.Second)}}
总结,以上只是个简单的例子,用到了golang的一个爬虫框架colly,其实只是一个抛砖引玉的作用,我这里只做了钉钉提醒,其实可以在这个基础上做你想做的事情。

文章评论