diff --git a/v1/kryptex_halfhour_monitor.py b/v1/kryptex_halfhour_monitor.py new file mode 100644 index 0000000..b9b8208 --- /dev/null +++ b/v1/kryptex_halfhour_monitor.py @@ -0,0 +1,113 @@ +import redis +import requests +from bs4 import BeautifulSoup +import pymysql +from datetime import datetime, timedelta +import time + +# 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() + +# URL 模板 +BASE_URL = "https://pool.kryptex.com/zh-cn/{coin}/miner/stats/{wallet}" +HEADERS = {"User-Agent": "Mozilla/5.0"} + + +def to_mhs(value: str): + """自动把算力字符串转换成 MH/s 纯数字""" + value = value.strip().lower() + if "gh/s" in value: + return float(value.replace("gh/s", "").strip()) * 1000 + if "mh/s" in value: + return float(value.replace("mh/s", "").strip()) + if "kh/s" in value: + return float(value.replace("kh/s", "").strip()) / 1000 + if "h/s" in value: + return float(value.replace("h/s", "").strip()) / 1_000_000 + return 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 query_and_insert(): + keys = r.keys("*") # 遍历所有 key + half_hour_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 + coin_lower = coin.lower() + # xtm 特殊处理 + coin_for_url = "xtm-c29" if coin_lower == "xtm" else coin_lower + url = BASE_URL.format(coin=coin_for_url, wallet=wallet.lower()) + + resp = requests.get(url, headers=HEADERS, timeout=10) + resp.raise_for_status() + soup = BeautifulSoup(resp.text, "html.parser") + tbody = soup.find("tbody") + if not tbody: + print(f"池:{pool_name} 币种:{coin} 钱包:{wallet} 没有矿工数据") + continue + rows = tbody.find_all("tr") + if not rows: + print(f"池:{pool_name} 币种:{coin} 钱包:{wallet} 没有矿工数据") + continue + + for row in rows: + try: + worker = row.find("th").find("a").text.strip() + tds = row.find_all("td") + # 10 分钟算力列 + hashrate_raw = tds[5].text.strip() + mhs = to_mhs(hashrate_raw) + + # 输出日志 + print(f"池:{pool_name} 币种:{coin} 钱包:{wallet} 矿工:{worker} -> {mhs:.2f} MH/s") + + # 写入数据库 + sql = """ + INSERT INTO `pool.kryptex` + (datetime, pool_name, wallet, miner, hashrate, coin, algorithm) + VALUES (%s,%s,%s,%s,%s,%s,%s) + """ + cursor.execute(sql, (half_hour_time, pool_name, wallet, worker, mhs, coin.upper(), algo)) + conn.commit() + except Exception as e: + print("解析矿工数据失败:", e) + except Exception as e: + print("请求或解析失败:", e) + + +if __name__ == "__main__": + try: + while True: + now = datetime.now() + next_minute = 30 if now.minute < 30 else 60 + wait_seconds = (next_minute - now.minute) * 60 - now.second + if wait_seconds > 0: + print(f"等待 {wait_seconds} 秒到下一个半点...") + time.sleep(wait_seconds) + query_and_insert() + except KeyboardInterrupt: + print("程序结束") + finally: + cursor.close() + conn.close() \ No newline at end of file