coingecko_price.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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. # d_price = {}
  8. # d = {}
  9. # r = RedisCluster(host="101.37.79.39", port=6381, decode_responses=True)
  10. REDIS_ONLINE = 'denet-chain-prod.y2slbl.clustercfg.memorydb.us-east-1.amazonaws.com'
  11. r = RedisCluster(host=REDIS_ONLINE, port=6379, decode_responses=True, skip_full_coverage_check=True)
  12. TOKENPRICE = 'TOKENPRICE_'
  13. d_chain_name = {'bsc_mainnet':"BSC", 'czz':"CZZ"}
  14. KEY_SET_TOKEN_FIXED_PRICE = 'KEY_LIST_TOKEN_FIXED_PRICE'
  15. KEY_TOKEN_FIXED_PRICE = 'KEY_TOKEN_FIXED_PRICE_'
  16. KEY_SET_TOKEN_NOW_PRICE = 'KEY_LIST_TOKEN_NOW_PRICE'
  17. KEY_TOKEN_IDMAP = 'KEY_TOKEN_IDMAP_'
  18. def load_file_data():
  19. # Load the xlsx file
  20. excel_data = pd.read_excel('token_20220613.xlsx')
  21. # Read the values of the file in the dataframe
  22. data = pd.DataFrame(excel_data, columns=['token', 'tokenName', 'contract_address', 'chian', 'id'], dtype=str)
  23. global r
  24. default_address = '0x0000000000000000000000000000000000000000'
  25. for row in data.itertuples():
  26. contract_address = getattr(row, 'contract_address')
  27. if len(str(contract_address).strip()) < 10:
  28. contract_address = str(default_address)
  29. chain = getattr(row, 'chian')
  30. chain = d_chain_name.get(chain, chain)
  31. chain = chain.upper()
  32. tid = getattr(row, 'id')
  33. if tid.isnumeric():
  34. price = int(tid)
  35. if price == 0:
  36. price = 1 / 10 ** 11
  37. #固定价格币的集合
  38. r.sadd(KEY_SET_TOKEN_FIXED_PRICE, f'{chain}_{contract_address}')
  39. #固定价格的币
  40. r.set(f'{KEY_TOKEN_FIXED_PRICE}{chain}_{contract_address}', price)
  41. else:
  42. #定时计算价格的币列表
  43. r.sadd(KEY_SET_TOKEN_NOW_PRICE, f'{tid}')
  44. #币对应的属性
  45. r.set(f'{KEY_TOKEN_IDMAP}{tid}', str({'contract':contract_address, 'chain':chain}))
  46. # print(d_price)
  47. print(1)
  48. def get_token_price():
  49. global r
  50. # coins = r.scard(KEY_SET_TOKEN_NOW_PRICE)
  51. d = {}
  52. coins = r.smembers(KEY_SET_TOKEN_NOW_PRICE)
  53. print(coins)
  54. cg = CoinGeckoAPI()
  55. coin_prices = cg.get_price(ids=list(coins), vs_currencies='usd')
  56. # print(coin_prices)
  57. for k, v in coin_prices.items():
  58. price = v['usd']
  59. coin_info = r.get(f'{KEY_TOKEN_IDMAP}{k}')
  60. coin_info = ast.literal_eval(coin_info)
  61. contract_address = coin_info['contract']
  62. chain = coin_info['chain']
  63. print(chain, contract_address, price)
  64. items = d.get(chain,[])
  65. items.append({'contract':contract_address, 'usdPrice':price})
  66. d[chain] = items
  67. fixed_price_coins = r.smembers(KEY_SET_TOKEN_FIXED_PRICE)
  68. for coin_id in fixed_price_coins:
  69. price = r.get(f'{KEY_TOKEN_FIXED_PRICE}{coin_id}')
  70. segs = coin_id.split('_')
  71. chain = segs[0]
  72. contract_address = segs[1]
  73. print(chain, contract_address, price)
  74. items = d.get(chain, [])
  75. items.append({'contract': contract_address, 'usdPrice': price})
  76. d[chain] = items
  77. return d
  78. def save_redis(d):
  79. for k, v in d.items():
  80. r.set(f'{TOKENPRICE}{k}', json.dumps({'tokenPrice':v}))
  81. def get_redis():
  82. print(r.get(f'{TOKENPRICE}BSC'))
  83. print(r.get(f'{TOKENPRICE}CZZ'))
  84. if __name__ == '__main__':
  85. # load_file_data()
  86. d = get_token_price()
  87. save_redis(d)
  88. get_redis()