import json from pycoingecko import CoinGeckoAPI from rediscluster import RedisCluster # from redis import Redis import ast import requests import traceback # d_price = {} # d = {} # r = RedisCluster(host="101.37.79.39", port=6381, decode_responses=True) REDIS_ONLINE = 'denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com' r = RedisCluster(host=REDIS_ONLINE, port=6379, decode_responses=True, skip_full_coverage_check=True) TOKENPRICE = 'TOKENPRICE_' d_chain_name = {'bsc_mainnet':"BSC", 'czz':"CZZ"} KEY_SET_TOKEN_FIXED_PRICE = 'KEY_LIST_TOKEN_FIXED_PRICE' KEY_TOKEN_FIXED_PRICE = 'KEY_TOKEN_FIXED_PRICE_' KEY_SET_TOKEN_NOW_PRICE = 'KEY_LIST_TOKEN_NOW_PRICE' KEY_TOKEN_IDMAP = 'KEY_TOKEN_IDMAP_' KEY_TOKEN_IDMAPS = 'KEY_TOKEN_IDMAPS_' def load_file_data(): # Load the xlsx file excel_data = pd.read_excel('token_20220613.xlsx') # Read the values of the file in the dataframe data = pd.DataFrame(excel_data, columns=['token', 'tokenName', 'contract_address', 'chian', 'id'], dtype=str) global r default_address = '0x0000000000000000000000000000000000000000' for row in data.itertuples(): contract_address = getattr(row, 'contract_address') if len(str(contract_address).strip()) < 10: contract_address = str(default_address) chain = getattr(row, 'chian') chain = d_chain_name.get(chain, chain) chain = chain.upper() tid = getattr(row, 'id') if tid.isnumeric(): price = int(tid) if price == 0: price = 1 / 10 ** 11 #固定价格币的集合 r.sadd(KEY_SET_TOKEN_FIXED_PRICE, f'{chain}_{contract_address}') #固定价格的币 r.set(f'{KEY_TOKEN_FIXED_PRICE}{chain}_{contract_address}', price) else: #定时计算价格的币列表 r.sadd(KEY_SET_TOKEN_NOW_PRICE, f'{tid}') #币对应的属性 #TODO 改成列表形式,可能一个id对应多个合约地址 r.set(f'{KEY_TOKEN_IDMAP}{tid}', str({'contract':contract_address, 'chain':chain})) r.sadd(f'{KEY_TOKEN_IDMAPs}{tid}', str({'contract':contract_address, 'chain':chain})) # print(d_price) print(1) def parse_token(d, coin_info): coin_info = ast.literal_eval(coin_info) contract_address = coin_info['contract'] chain = coin_info['chain'] print(chain, contract_address, price) items = d.get(chain, []) items.append({'contract': contract_address, 'usdPrice': price}) d[chain] = items def get_pancakeswap_price(contract): url = f'https://api.pancakeswap.info/api/v2/tokens/{contract}' price = None try: ret = requests.get(url) price = round(float(ret.json()['data']['price']), 2) print(price) except: traceback.print_exc() return price def get_token_price(): global r # coins = r.scard(KEY_SET_TOKEN_NOW_PRICE) d = {} coins = r.smembers(KEY_SET_TOKEN_NOW_PRICE) print(coins) cg = CoinGeckoAPI() coin_prices = cg.get_price(ids=list(coins), vs_currencies='usd') print(coin_prices) for k, v in coin_prices.items(): if v.get('usd') is None: continue price = v['usd'] coin_info = r.get(f'{KEY_TOKEN_IDMAP}{k}') print(coin_info) if coin_info is None: continue coin_info = ast.literal_eval(coin_info) contract_address = coin_info['contract'] chain = coin_info['chain'] print(chain, contract_address, price) items = d.get(chain,[]) items.append({'contract':contract_address, 'usdPrice':price}) d[chain] = items fixed_price_coins = r.smembers(KEY_SET_TOKEN_FIXED_PRICE) for coin_id in fixed_price_coins: price = r.get(f'{KEY_TOKEN_FIXED_PRICE}{coin_id}') segs = coin_id.split('_') chain = segs[0] contract_address = segs[1] price_swap = get_pancakeswap_price(contract_address) if price_swap: price = price_swap print(chain, contract_address, price) items = d.get(chain, []) items.append({'contract': contract_address, 'usdPrice': price}) d[chain] = items return d def save_redis(d): for k, v in d.items(): r.set(f'{TOKENPRICE}{k}', json.dumps({'tokenPrice':v})) def get_redis(): print(r.get(f'{TOKENPRICE}BSC')) print(r.get(f'{TOKENPRICE}CZZ')) if __name__ == '__main__': # load_file_data() d = get_token_price() save_redis(d) get_redis() # get_pancakeswap_price('0x25102c5af2d4faa83ddbd36d9f6af5d9c2b84093')