105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
import redis
|
||
import requests
|
||
import pymysql
|
||
from datetime import datetime
|
||
|
||
# ---------------- Redis 配置 ----------------
|
||
REDIS_HOST = "127.0.0.1"
|
||
REDIS_PORT = 6379
|
||
REDIS_DB = 7
|
||
|
||
# ---------------- MySQL 配置 ----------------
|
||
MYSQL_HOST = "127.0.0.1"
|
||
MYSQL_PORT = 25600
|
||
MYSQL_USER = "root"
|
||
MYSQL_PASS = "123456"
|
||
MYSQL_DB = "pool"
|
||
TABLE_NAME = "`vipor.net`"
|
||
|
||
# ---------------- 连接 Redis ----------------
|
||
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, decode_responses=True)
|
||
|
||
# ---------------- 连接 MySQL ----------------
|
||
conn = pymysql.connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER,
|
||
password=MYSQL_PASS, database=MYSQL_DB, charset='utf8mb4')
|
||
cursor = conn.cursor()
|
||
|
||
# ---------------- 从 Redis 获取矿池配置 ----------------
|
||
# 格式: pool_name:wallet:COIN:ALGORITHM
|
||
keys = r.keys("vipor.net:*")
|
||
|
||
def get_half_hour_time():
|
||
"""返回最近半点时间"""
|
||
now = datetime.now()
|
||
minute = 30 if now.minute >= 30 else 0
|
||
return now.replace(minute=minute, second=0, microsecond=0)
|
||
|
||
def fetch_vipor_data(pool_name, coin, wallet, algorithm, api_pool):
|
||
url = f"https://restapi.vipor.net/api/pools/{api_pool}/miners/{wallet}"
|
||
try:
|
||
resp = requests.get(url, timeout=10)
|
||
resp.raise_for_status()
|
||
data = resp.json()
|
||
|
||
# 优先 performance.workers
|
||
workers = data.get("performance", {}).get("workers")
|
||
if not workers:
|
||
workers = data.get("workers") or data.get("miners") or {}
|
||
|
||
if not workers:
|
||
print(f"{coin} | {api_pool} | {wallet} ⚠ 当前没有任何在线矿机")
|
||
return
|
||
|
||
for miner, info in workers.items():
|
||
hashrate = info.get("hashrate", 0) or 0
|
||
hashrate_mhs = hashrate / 1_000_000 # 转为 MH/s
|
||
|
||
# 插入 MySQL
|
||
sql = f"""INSERT INTO {TABLE_NAME}
|
||
(datetime, pool_name, wallet, miner, hashrate, coin, algorithm)
|
||
VALUES (%s, %s, %s, %s, %s, %s, %s)"""
|
||
cursor.execute(sql, (
|
||
get_half_hour_time(),
|
||
pool_name, # 这里使用 Redis key 的第一部分
|
||
wallet,
|
||
miner,
|
||
hashrate_mhs,
|
||
coin,
|
||
algorithm
|
||
))
|
||
conn.commit()
|
||
|
||
print(f"{coin} | {api_pool} | {miner}: {hashrate_mhs:.2f} MH/s 写入成功")
|
||
|
||
except requests.exceptions.HTTPError as e:
|
||
print(f"{coin} | {api_pool} | {wallet} 请求失败 HTTP 错误:", e)
|
||
except Exception as e:
|
||
print(f"{coin} | {api_pool} | {wallet} 请求失败:", e)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
for key in keys:
|
||
parts = key.split(":")
|
||
if len(parts) != 4:
|
||
continue
|
||
pool_name, wallet, coin, algorithm = parts
|
||
|
||
# 构造普通和 solo pool 名(用于请求 API,不影响存入数据库的 pool_name)
|
||
api_pools = []
|
||
if coin == "NEXA":
|
||
api_pools = ["nexa", "nexa_solo"]
|
||
elif coin == "XEL":
|
||
api_pools = ["xelis", "xelis_solo"]
|
||
elif coin == "XNA":
|
||
api_pools = ["neurai", "neurai_solo"]
|
||
elif coin == "CLORE":
|
||
api_pools = ["clore", "clore_solo"]
|
||
else:
|
||
api_pools = ["default", "default_solo"]
|
||
|
||
for api_pool in api_pools:
|
||
fetch_vipor_data(pool_name, coin, wallet, algorithm, api_pool)
|
||
|
||
# 关闭连接
|
||
cursor.close()
|
||
conn.close() |