123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- 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')
|