all_token_price_bak.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. #const
  9. DEFAULT_PRICE = 0.00000000000000001
  10. #redis keys
  11. TOKENPRICE = 'TOKENPRICE_TO_FETCH'
  12. def get_swap_price(tokens):
  13. ret_d = {}
  14. for t in tokens:
  15. segs = t.split('_')
  16. chain = segs[0]
  17. contract = segs[1]
  18. if chain.strip().upper() == 'bsc':
  19. price = get_pancakeswap_price(contract)
  20. if price is not None:
  21. ret_d[t] = price
  22. return ret_d
  23. def get_pancakeswap_price(contract):
  24. url = f'https://api.pancakeswap.info/api/v2/tokens/{contract}'
  25. try:
  26. ret = requests.get(url)
  27. price = float(ret.json()['data']['price'])
  28. print(price)
  29. return price
  30. except:
  31. traceback.print_exc()
  32. return None
  33. def get_coingecko_price(tokens):
  34. exceptions = set()
  35. ret_d = {}
  36. try:
  37. cg = CoinGeckoAPI()
  38. coin_prices = cg.get_price(ids=list(tokens), vs_currencies='usd')
  39. print(coin_prices)
  40. for k, v in coin_prices.items():
  41. if v.get('usd') is None:
  42. exceptions.add(k)
  43. continue
  44. price = v['usd']
  45. ret_d[k] = price
  46. except:
  47. traceback.print_exc()
  48. print('get_coingecko_price exception tokens', exceptions)
  49. return ret_d
  50. def get_tokens():
  51. tokens = r.smembers(TOKENPRICE)
  52. tokens = [ast.literal_eval(t) for t in tokens]
  53. realtime_price_token = set()
  54. fixed_or_swap_price_token = set()
  55. for t in tokens:
  56. if t.get('fixed_price') is None:
  57. realtime_price_token.add(t.get('coingecko_id'))
  58. else:
  59. fixed_or_swap_price_token.add(f"{t.get('chain')}_{t.get('contract')}")
  60. realtime_price = get_coingecko_price(realtime_price_token) #{'coingecko_id':price}
  61. swap_price_token = get_swap_price(fixed_or_swap_price_token) #{'chain_contract': price}
  62. return tokens, realtime_price, swap_price_token
  63. def merge_price(tokens, realtime_price, swap_price_token):
  64. ret_d = {}
  65. exceptions = set()
  66. for t in tokens:
  67. chain = t.get('chain')
  68. contract = t.get('contract')
  69. coingecko_id = t.get('coingecko_id')
  70. fixed_price = t.get('fixed_price')
  71. now_price = realtime_price.get(coingecko_id)
  72. if now_price is None:
  73. now_price = swap_price_token.get(f'{chain}_{contract}')
  74. if now_price is None:
  75. now_price = fixed_price
  76. if now_price is None:
  77. exceptions.add(t)
  78. else:
  79. l = ret_d.get(chain, [])
  80. l.append({'contract': contract_address, 'usdPrice': price})
  81. ret_d[chain] = l
  82. print('merge_price exceptions', exceptions)
  83. return ret_d
  84. def save_price(prices):
  85. for chain, token_dict in prices.items():
  86. r.set(f'{TOKENPRICE}{chain.upper()}', json.dumps({'tokenPrice':token_dict}))
  87. def _recover_history_data():
  88. #TODO
  89. #1. 读取历史数据,修改数据格式,并重新导入
  90. #2. 对比历史token记录表,筛选是否有丢失数据的情况
  91. #3. 修改api server接口,以新数据结构存储
  92. pass
  93. if __name__ == '__main__':
  94. tokens, realtime_price, swap_price_token = get_tokens()
  95. prices = merge_price(tokens, realtime_price, swap_price_token)
  96. save_price(prices)