监控以太坊gas突增并发送钉钉通知

import logging
from loguru import logger
import time
import hmac
import hashlib
import base64
import urllib.parse
import requests, json


def send_ding(access_token, text):
    timestamp = str(round(time.time() * 1000))
    # 注册钉钉开发者平台获取私钥
    secret = ''
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, secret)
    string_to_sign_enc = string_to_sign.encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))

    headers = {'Content-Type': 'application/json'}
    webhook = f'https://oapi.dingtalk.com/robot/send?access_token={access_token}' + '&timestamp=' + timestamp + "&sign=" + sign

    data = {
        "text": {
            "content": "[course]" + text
        },
        "msgtype": "text"
    }

    res = requests.post(webhook, data=json.dumps(data), headers=headers)


def get_gas():
    while True:
        try:
            url = "https://ultrasound.money/api/v2/fees/base-fee-over-time"
            response = requests.get(url)

            if response.status_code == 200:
                data = response.json()
                return data
        except Exception as e:
            logging.error('ultrasoud get gas error', e)


def get_gas_burn():
    while True:
        try:
            url = "https://ultrasound.money/api/fees/grouped-analysis-1"
            response = requests.get(url)

            if response.status_code == 200:
                data = response.json()
                return data
                # print(data)
        except Exception as e:
            logging.error('ultrasoud get gas burn error', e)


if __name__ == '__main__':
    # 钉钉新建群聊,拉自定义机器人进去,设置自定义关键词course,将Webhookaccess_token=后面一串复制到bot_tokenbot_token = ''
    # 这是uniswapL2xen相关的地址,不需要监控,如有特殊需要可以自己加回去
    unalert_address = ['0x3db52ce065f728011ac6732222270b3f2360d919',
                       '0xfd14567eaf9ba941cb8c8a94eec14831ca7fd1b4',
                       '0x2f848984984d6c3c036174ce627703edaf780479',
                       '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',
                       '0x0de8bf93da2f7eecb3d9169422413a9bef4ef628',
                       '0x7a250d5630b4cf539739df2c5dacb4c659f2488d',
                       '0x0a252663dbcc0b073063d6420a40319e438cfa59',
                       '0x55032650b14df07b85bf18a3a3ec8e0af2e028d5',
                       '0x0000000000771a79d0fc7f3b7fe270eb4498f20b',
                       '0x881d4032abe4188e2237efcd27ab435e81fc6bb1']
    while True:
        try:
            gas = get_gas()
            data = gas['m5']
            gas_0 = data[0]['wei']
            gas_last = data[len(data) - 1]['wei']
            gas_10 = data[10]['wei']
            difference_1 = gas_last / gas_0 - 1
            difference_2 = gas_last / gas_10 - 1
            logger.info(f"差异百分比(第一个元素和最后一个元素):{difference_1} ; gas_last : {round(gas_last / 1000000000, 2)}")
            precent = 0.3
            if difference_1 >= precent:
                gas_burn = get_gas_burn()
                m5_burn = gas_burn['leaderboards']['leaderboard5m']
                m5_burn_first = m5_burn[0]
                m5_burn_first_address = 'null'
                m5_burn_first_name = 'null'
                m5_burn_first_category = 'null'
                m5_burn_first_detail = 'null'
                if m5_burn_first['address'] is not None:
                    m5_burn_first_address = m5_burn_first['address']
                if m5_burn_first_address is not None:
                    m5_burn_first_name = m5_burn_first['name']
                if m5_burn_first['category'] is not None:
                    m5_burn_first_category = m5_burn_first['category']
                if m5_burn_first['detail'] is not None:
                    m5_burn_first_detail = m5_burn_first['detail']
                m5_burn_second = m5_burn[1]
                m5_burn_third = m5_burn[2]
                text = f'主网gas短时间增长{precent * 100}%+,当前gas{round(gas_last / 1000000000, 2)} \n' \
                       f'gas消耗合约top1:\n' \
                       f'\taddress : {m5_burn_first_address}\n' \
                       f'\tname : {m5_burn_first_name}\n' \
                       f'\tcategory : {m5_burn_first_category}\n' \
                       f'\tdetail : {m5_burn_first_detail}'

                if m5_burn_first_address not in unalert_address:
                    logger.info(text)
                    send_ding(bot_token, text)
                else:
                    logger.info(text)

            time.sleep(30)
        except Exception as e:
            logging.error(f'monitor gas burn error:{e}')