coingecko_price.py 4.6 KB

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