Files
m2pool_docs/v1/vipor_collector.py

105 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()