coingecko_price.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import json
  2. from pycoingecko import CoinGeckoAPI
  3. from rediscluster import RedisCluster
  4. # from redis import Redis
  5. import ast
  6. import requests
  7. import traceback
  8. # d_price = {}
  9. # d = {}
  10. # r = RedisCluster(host="101.37.79.39", port=6381, decode_responses=True)
  11. REDIS_ONLINE = 'denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com'
  12. r = RedisCluster(host=REDIS_ONLINE, port=6379, decode_responses=True, skip_full_coverage_check=True)
  13. TOKENPRICE = 'TOKENPRICE_'
  14. d_chain_name = {'bsc_mainnet':"BSC", 'czz':"CZZ"}
  15. KEY_SET_TOKEN_FIXED_PRICE = 'KEY_LIST_TOKEN_FIXED_PRICE'
  16. KEY_TOKEN_FIXED_PRICE = 'KEY_TOKEN_FIXED_PRICE_'
  17. KEY_SET_TOKEN_NOW_PRICE = 'KEY_LIST_TOKEN_NOW_PRICE'
  18. KEY_TOKEN_IDMAP = 'KEY_TOKEN_IDMAP_'
  19. KEY_TOKEN_IDMAPS = 'KEY_TOKEN_IDMAPS_'
  20. def load_file_data():
  21. # Load the xlsx file
  22. excel_data = pd.read_excel('token_20220613.xlsx')
  23. # Read the values of the file in the dataframe
  24. data = pd.DataFrame(excel_data, columns=['token', 'tokenName', 'contract_address', 'chian', 'id'], dtype=str)
  25. global r
  26. default_address = '0x0000000000000000000000000000000000000000'
  27. for row in data.itertuples():
  28. contract_address = getattr(row, 'contract_address')
  29. if len(str(contract_address).strip()) < 10:
  30. contract_address = str(default_address)
  31. chain = getattr(row, 'chian')
  32. chain = d_chain_name.get(chain, chain)
  33. chain = chain.upper()
  34. tid = getattr(row, 'id')
  35. if tid.isnumeric():
  36. price = int(tid)
  37. if price == 0:
  38. price = 1 / 10 ** 11
  39. #固定价格币的集合
  40. r.sadd(KEY_SET_TOKEN_FIXED_PRICE, f'{chain}_{contract_address}')
  41. #固定价格的币
  42. r.set(f'{KEY_TOKEN_FIXED_PRICE}{chain}_{contract_address}', price)
  43. else:
  44. #定时计算价格的币列表
  45. r.sadd(KEY_SET_TOKEN_NOW_PRICE, f'{tid}')
  46. #币对应的属性
  47. #TODO 改成列表形式,可能一个id对应多个合约地址
  48. r.set(f'{KEY_TOKEN_IDMAP}{tid}', str({'contract':contract_address, 'chain':chain}))
  49. r.sadd(f'{KEY_TOKEN_IDMAPs}{tid}', str({'contract':contract_address, 'chain':chain}))
  50. # print(d_price)
  51. print(1)
  52. def parse_token(d, coin_info):
  53. coin_info = ast.literal_eval(coin_info)
  54. contract_address = coin_info['contract']
  55. chain = coin_info['chain']
  56. print(chain, contract_address, price)
  57. items = d.get(chain, [])
  58. items.append({'contract': contract_address, 'usdPrice': price})
  59. d[chain] = items
  60. def get_pancakeswap_price(contract):
  61. url = f'https://api.pancakeswap.info/api/v2/tokens/{contract}'
  62. price = None
  63. try:
  64. ret = requests.get(url)
  65. price = round(float(ret.json()['data']['price']), 2)
  66. print(price)
  67. except:
  68. traceback.print_exc()
  69. return price
  70. def get_token_price():
  71. global r
  72. # coins = r.scard(KEY_SET_TOKEN_NOW_PRICE)
  73. d = {}
  74. coins = r.smembers(KEY_SET_TOKEN_NOW_PRICE)
  75. print(coins)
  76. cg = CoinGeckoAPI()
  77. coin_prices = cg.get_price(ids=list(coins), vs_currencies='usd')
  78. print(coin_prices)
  79. for k, v in coin_prices.items():
  80. if v.get('usd') is None:
  81. continue
  82. price = v['usd']
  83. coin_info = r.get(f'{KEY_TOKEN_IDMAP}{k}')
  84. print(coin_info)
  85. if coin_info is None:
  86. continue
  87. coin_info = ast.literal_eval(coin_info)
  88. contract_address = coin_info['contract']
  89. chain = coin_info['chain']
  90. print(chain, contract_address, price)
  91. items = d.get(chain,[])
  92. items.append({'contract':contract_address, 'usdPrice':price})
  93. d[chain] = items
  94. fixed_price_coins = r.smembers(KEY_SET_TOKEN_FIXED_PRICE)
  95. for coin_id in fixed_price_coins:
  96. price = r.get(f'{KEY_TOKEN_FIXED_PRICE}{coin_id}')
  97. segs = coin_id.split('_')
  98. chain = segs[0]
  99. contract_address = segs[1]
  100. price_swap = get_pancakeswap_price(contract_address)
  101. if price_swap:
  102. price = price_swap
  103. print(chain, contract_address, price)
  104. items = d.get(chain, [])
  105. items.append({'contract': contract_address, 'usdPrice': price})
  106. d[chain] = items
  107. return d
  108. def save_redis(d):
  109. for k, v in d.items():
  110. r.set(f'{TOKENPRICE}{k}', json.dumps({'tokenPrice':v}))
  111. def get_redis():
  112. print(r.get(f'{TOKENPRICE}BSC'))
  113. print(r.get(f'{TOKENPRICE}CZZ'))
  114. if __name__ == '__main__':
  115. # load_file_data()
  116. d = get_token_price()
  117. save_redis(d)
  118. get_redis()
  119. # get_pancakeswap_price('0x25102c5af2d4faa83ddbd36d9f6af5d9c2b84093')