92 lines
2.9 KiB
Python
92 lines
2.9 KiB
Python
|
|
import redis
|
||
|
|
import requests
|
||
|
|
import pymysql
|
||
|
|
from datetime import datetime, timedelta
|
||
|
|
|
||
|
|
# ---------------- Redis 配置 ----------------
|
||
|
|
r = redis.Redis(host='127.0.0.1', port=6379, db=7, decode_responses=True)
|
||
|
|
|
||
|
|
# ---------------- MySQL 配置 ----------------
|
||
|
|
conn = pymysql.connect(
|
||
|
|
host='127.0.0.1',
|
||
|
|
user='root',
|
||
|
|
password='123456',
|
||
|
|
database='pool',
|
||
|
|
port=25600,
|
||
|
|
charset='utf8mb4'
|
||
|
|
)
|
||
|
|
cursor = conn.cursor()
|
||
|
|
|
||
|
|
# ---------------- API 配置 ----------------
|
||
|
|
API_URLS = {
|
||
|
|
"NEXA": "https://nexa.2miners.com/api/accounts/{wallet}",
|
||
|
|
"XNA": "https://xna.2miners.com/api/accounts/{wallet}",
|
||
|
|
"CLORE": "https://clore.2miners.com/api/accounts/{wallet}",
|
||
|
|
"RVN": "https://rvn.2miners.com/api/accounts/{wallet}",
|
||
|
|
"ERG": "https://erg.2miners.com/api/accounts/{wallet}"
|
||
|
|
}
|
||
|
|
|
||
|
|
# ---------------- 工具函数 ----------------
|
||
|
|
def to_mhs(value):
|
||
|
|
"""算力转换为 MH/s"""
|
||
|
|
return float(value) / 1_000_000 if value else 0.0
|
||
|
|
|
||
|
|
def get_half_hour_time(now):
|
||
|
|
"""取最近半点整时间"""
|
||
|
|
minute = 0 if now.minute < 30 else 30
|
||
|
|
return now.replace(minute=minute, second=0, microsecond=0)
|
||
|
|
|
||
|
|
# ---------------- 主逻辑(单次执行) ----------------
|
||
|
|
def run_once():
|
||
|
|
keys = r.keys("*")
|
||
|
|
half_time = get_half_hour_time(datetime.now())
|
||
|
|
|
||
|
|
for key in keys:
|
||
|
|
try:
|
||
|
|
parts = key.split(":")
|
||
|
|
if len(parts) != 4:
|
||
|
|
continue
|
||
|
|
|
||
|
|
pool_name, wallet, coin, algo = parts
|
||
|
|
if pool_name.lower() != "2miners":
|
||
|
|
continue # 只处理2miners
|
||
|
|
|
||
|
|
coin_upper = coin.upper()
|
||
|
|
if coin_upper not in API_URLS:
|
||
|
|
print(f"[跳过] 不支持币种 {coin_upper}")
|
||
|
|
continue
|
||
|
|
|
||
|
|
# NEXA 需要补全前缀
|
||
|
|
wallet_api = f"nexa:{wallet}" if coin_upper=="NEXA" and not wallet.startswith("nexa:") else wallet
|
||
|
|
|
||
|
|
url = API_URLS[coin_upper].format(wallet=wallet_api)
|
||
|
|
resp = requests.get(url, timeout=10)
|
||
|
|
resp.raise_for_status()
|
||
|
|
data = resp.json()
|
||
|
|
|
||
|
|
workers = data.get("workers", {})
|
||
|
|
if not workers:
|
||
|
|
print(f"[无矿机] {coin_upper} {wallet}")
|
||
|
|
continue
|
||
|
|
|
||
|
|
for miner, info in workers.items():
|
||
|
|
hashrate = to_mhs(info.get("hr"))
|
||
|
|
print(f"写入 → {coin_upper} | {miner} | {hashrate:.2f} MH/s")
|
||
|
|
|
||
|
|
sql = """
|
||
|
|
INSERT INTO `2miners`
|
||
|
|
(datetime,pool_name,wallet,miner,hashrate,coin,algorithm)
|
||
|
|
VALUES (%s,%s,%s,%s,%s,%s,%s)
|
||
|
|
"""
|
||
|
|
cursor.execute(sql,(half_time,pool_name,wallet,miner,hashrate,coin_upper,algo))
|
||
|
|
conn.commit()
|
||
|
|
|
||
|
|
except Exception as e:
|
||
|
|
print(f"[错误] {key} ->", e)
|
||
|
|
|
||
|
|
# ---------------- 执行一次后退出 ----------------
|
||
|
|
if __name__ == "__main__":
|
||
|
|
run_once()
|
||
|
|
cursor.close()
|
||
|
|
conn.close()
|
||
|
|
print("✔ 本次采集结束")
|