|  | @@ -5,6 +5,8 @@ from pycoingecko import CoinGeckoAPI
 | 
	
		
			
				|  |  |  from rediscluster import RedisCluster
 | 
	
		
			
				|  |  |  # from redis import Redis
 | 
	
		
			
				|  |  |  import ast
 | 
	
		
			
				|  |  | +import requests
 | 
	
		
			
				|  |  | +import traceback
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # d_price = {}
 | 
	
		
			
				|  |  |  # d = {}
 | 
	
	
		
			
				|  | @@ -19,6 +21,7 @@ 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():
 | 
	
	
		
			
				|  | @@ -49,11 +52,32 @@ def load_file_data():
 | 
	
		
			
				|  |  |              #定时计算价格的币列表
 | 
	
		
			
				|  |  |              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_exec()
 | 
	
		
			
				|  |  | +    return price
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  def get_token_price():
 | 
	
		
			
				|  |  |      global r
 | 
	
	
		
			
				|  | @@ -63,10 +87,16 @@ def get_token_price():
 | 
	
		
			
				|  |  |      print(coins)
 | 
	
		
			
				|  |  |      cg = CoinGeckoAPI()
 | 
	
		
			
				|  |  |      coin_prices = cg.get_price(ids=list(coins), vs_currencies='usd')
 | 
	
		
			
				|  |  | -    # print(coin_prices)
 | 
	
		
			
				|  |  | +    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']
 | 
	
	
		
			
				|  | @@ -81,6 +111,10 @@ def get_token_price():
 | 
	
		
			
				|  |  |          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})
 | 
	
	
		
			
				|  | @@ -88,6 +122,7 @@ def get_token_price():
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      return d
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  def save_redis(d):
 | 
	
		
			
				|  |  |      for k, v in d.items():
 | 
	
		
			
				|  |  |          r.set(f'{TOKENPRICE}{k}', json.dumps({'tokenPrice':v}))
 | 
	
	
		
			
				|  | @@ -100,6 +135,9 @@ def get_redis():
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  if __name__ == '__main__':
 | 
	
		
			
				|  |  |      # load_file_data()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      d = get_token_price()
 | 
	
		
			
				|  |  |      save_redis(d)
 | 
	
		
			
				|  |  |      get_redis()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # get_pancakeswap_price('0x25102c5af2d4faa83ddbd36d9f6af5d9c2b84093')
 |