From 069a9cee0b4609bd42c2728be3e325dd27e797e4 Mon Sep 17 00:00:00 2001 From: 27942 Date: Thu, 11 Dec 2025 11:05:02 +0800 Subject: [PATCH] rgfewfger --- telegram/12366183874.session | Bin 36864 -> 0 bytes telegram/8619211027341.session | Bin 45056 -> 45056 bytes telegram/bot_session.session | Bin 36864 -> 36864 bytes telegram/sign.db | Bin 32768 -> 32768 bytes telegram/test.py | 5 +- test.py | 4 +- test1.py | 18 +- 交易/bitmart_交易.py | 415 +++++++++++++++++++++++++++++++++ 8 files changed, 437 insertions(+), 5 deletions(-) delete mode 100644 telegram/12366183874.session create mode 100644 交易/bitmart_交易.py diff --git a/telegram/12366183874.session b/telegram/12366183874.session deleted file mode 100644 index b513e6155eaf8bfa8760ff2ed1b984946e88781a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 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 X)J&J2kD+-}sd?VK)f?-^gZ=*iLg+zm diff --git a/telegram/8619211027341.session b/telegram/8619211027341.session index 27e6d5c245026592bde479f2451d7978ef3fcd0d..1efa7ef9c40d3e14089767239976aa62801caba6 100644 GIT binary patch delta 21 bcmZp8z|`=7X@V3J6U#&yCm^{oVZnL;O)Lh^ delta 21 bcmZp8z|`=7X@V3Jf0DvLVXJT_HUR+gPiQj9Y; z7ZrrDF&0lgX_lX=I<2$mi@xdH#GC2A_NAm0mFK6VmSiU8C1+$Rq$lQQ zS{b(({Qv*|xj>y8 zH_t6!!p?4GvW5Q)L)c{LPL;_y^|8!WCS{Y))LSq+vKCEdZzyJBE!tew@Qp=5YR;~& z`(=Q3Ffd57OnFvxa_i4nW#7!?jKtKOOv?tt&68T=n3;jbPF`-RGFiN{3T)CnYu(KU HJMGy3EmUvZ delta 263 zcmZozz|^pSX@V4!dDcW3Cm^{oK{;P4((#s`r|@BcI6($B21XVZCVB0NcepYwmE$JQ z&G%LK?0CzQDQ?f1N(Kf7ULb}5UKSw+6UG^=?D3Pi3W6pF7_bPiPGwPNo5!Zg%F42n zNs4jC98I|G{`gEmXb$>eFt{ECI;sY%7D ziShYqX_?8Hi8;B6#o=HP1>eM+#LD8#M4(&ZH_t6!!p?4~;?IAEA#AdAr^@7<`dDTa z&f3Xm>MfWZSSL+pZz$ee)9{UD;smA5lUn1LnJpE{CNDQtnJnH}#jL8)H2I#j?&gD? G_G|!ij#mQ! diff --git a/telegram/sign.db b/telegram/sign.db index 1c9d06afd96a31bc08f066820832c34ccc821642..96b384fab609bb29968d1338ee359bedc9a13576 100644 GIT binary patch delta 72 zcmV-O0Jr~ufC7Mk0+1U4%#j>J0nD*rqz?oi3~maO2oN#?4{ftL5Hbw2ZXC-30qm1H eA2SmToVxYD90mXz2mlC8X=7+%Wo)y6AAn#mQWmWM delta 69 zcmZo@U}|V!njp=1dZLUo 4000: + # tu_wx1() + except Exception as e: + print(f"错误: {e}") + + time.sleep(0.3) # 控制查询频率,避免被限流 \ No newline at end of file diff --git a/交易/bitmart_交易.py b/交易/bitmart_交易.py new file mode 100644 index 0000000..7c68b70 --- /dev/null +++ b/交易/bitmart_交易.py @@ -0,0 +1,415 @@ +import re +import hmac +import time +import base64 +import hashlib +import datetime +import requests + +from tqdm import * +from loguru import * +from DrissionPage import * +from bs4 import BeautifulSoup + + +def is_bullish(c): # 阳线 + return float(c['close']) > float(c['open']) + + +def is_bearish(c): # 阴线 + return float(c['close']) < float(c['open']) + + +class WeexTransaction: + def __init__(self, tge_id): + self.tge_port = None # tge浏览器使用端口 + self.tge_id = tge_id # tge id + self.tge_url = "http://127.0.0.1:50326" # tge本地服务url + self.tge_headers = { + "Authorization": f"Bearer asp_174003986c9b0799677c5b2c1adb76e402735d753bc91a91", + "Content-Type": "application/json" + } + + # 替换为你自己的钉钉机器人 Webhook 地址 + self.webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=e2fafb3f46866d50fe52cbb29650ba9ef1cbc97915dde238192f04c906fe4125" + # 替换为你自己的钉钉机器人秘钥 + self.secret = "SEC5f320e72d7a4eaca540c66c3d09edff2f74936517390dee99ece6dd1b3611998" + + self.page = None # 浏览器对象 + + self.start = 0 # 持仓状态 -1:做空,0:维持仓,1:做多 + self.kline_1 = None # 0:跌,1:涨 + self.kline_2 = None # 0:跌,1:涨 + + self.direction = None # 信号类型 + + self.pbar = None # 进度条对象 + + def get_signature(self, timestamp): + # 将时间戳和密钥拼接 + string_to_sign = f'{timestamp}\n{self.secret}' + string_to_sign = string_to_sign.encode('utf-8') + # 使用 HMAC-SHA256 算法进行签名 + hmac_code = hmac.new(self.secret.encode('utf-8'), string_to_sign, digestmod=hashlib.sha256).digest() + # 对签名结果进行 Base64 编码 + sign = base64.b64encode(hmac_code).decode('utf-8') + return sign + + # def send_dingtalk_message(self, message_content): + # # 获取当前时间戳(毫秒) + # timestamp = str(round(time.time() * 1000)) + # # 生成签名 + # sign = self.get_signature(timestamp, ) + # # 拼接带有签名信息的完整 Webhook URL + # full_url = f"{self.webhook_url}×tamp={timestamp}&sign={sign}" + # + # # 定义消息内容 + # message = { + # "msgtype": "text", + # "text": { + # "content": message_content + # } + # } + # + # # 设置请求头 + # headers = { + # "Content-Type": "application/json" + # } + # + # try: + # # 发送 POST 请求 + # response = requests.post(full_url, headers=headers, data=json.dumps(message)) + # + # except requests.RequestException as e: + # print(f"请求发生错误: {e}") + + def send_dingtalk_message(self, message_content): + + pass + + # url = "http://8.137.99.82:9005/api/send_click?token=fegergauiernguie&phone=8613661496481" + # + # res = requests.post( + # url=url, + # json={ + # "phone": "8613661496481", + # "bot_name": "ergggreef", + # "datas": [ + # {"send_message": [message_content], "click_button": [""], }, + # ] + # + # } + # ) + # + # print(res.json()) + + def openBrowser(self, ): # 直接指定ID打开窗口,也可以使用 createBrowser 方法返回的ID + + try: + + response = requests.post( + f"{self.tge_url}/api/browser/start", + json={"envId": self.tge_id}, + headers=self.tge_headers + ) + + self.tge_port = response.json()["data"]["port"] + + return True + except: + return False + + def take_over_browser(self): + try: + co = ChromiumOptions() + co.set_local_port(self.tge_port) + + self.page = ChromiumPage(addr_or_opts=co) + + self.page.set.window.max() + + return True + except: + return False + + def is_bullish(self, c): # 阳线 + return float(c['close']) > float(c['open']) + + def is_bearish(self, c): # 阴线 + return float(c['close']) < float(c['open']) + + def check_signal(self, prev, curr): + """ + 包住形态信号判定(仅15分钟K线): + - 前跌后涨包住 -> 做多 + - 前涨后跌包住 -> 做空 + """ + p_open, p_close = float(prev['open']), float(prev['close']) + c_open, c_close = float(curr['open']), float(curr['close']) + + # 前跌后涨包住 -> 做多 + if is_bullish(curr) and is_bearish(prev) and int(c_open) <= int(p_close) and int(c_close) >= int(p_open): + return "long", "bear_bull_engulf" + + # 前涨后跌包住 -> 做空 + if is_bearish(curr) and is_bullish(prev) and int(c_open) >= int(p_close) and int(c_close) <= int(p_open): + return "short", "bull_bear_engulf" + + return None, None + + def get_price(self): + + for i in range(3): + try: + logger.info(f"获取最新数据:{i + 1}次。。。") + self.mn_tab.get(url="https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") + res = self.mn_tab.listen.wait(timeout=25) # 等待并获取一个数据包 + + datas = [] + if res: + + for data in res.response.body["data"]: + insert_data = { + 'id': int(data["timestamp"]) - 1, + 'open': float(data["open"]), + 'high': float(data["high"]), + 'low': float(data["low"]), + 'close': float(data["close"]) + } + + datas.append(insert_data) + + return datas + except: + pass + + return False + + def remove_tags_and_spaces(self, html): + # 创建 BeautifulSoup 对象 + soup = BeautifulSoup(html, 'html.parser') + # 获取去除标签后的文本 + text = soup.get_text() + # 去除所有空格 + text = text.replace(" ", "") + return text + + def to_do_page(self): + # self.page.get("https://www.weeaxs.site/zh-CN/futures/demo-trading/ETH-SUSDT") + + self.mn_tab.ele('x:(//button[normalize-space(text()) = "市价"])').click() + time.sleep(1) + + self.mn_tab.ele('x://*[@id="size_0"]').input(float(self.get_num()) / 100) + time.sleep(1) + + if self.direction == "long" and not self.start: + logger.success(f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},开多") + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},开多") + self.mn_tab.ele('x://span[normalize-space(text()) = "买入/做多"]').click() + self.start = 1 + elif self.direction == "short" and not self.start: + logger.success(f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},开空") + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},开空") + self.mn_tab.ele('x://span[normalize-space(text()) = "卖出/做空"]').click() + self.start = -1 + elif self.direction == "long" and self.start == -1: + logger.success(f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},反手平空做多") + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},反手平空做多") + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').scroll.to_see(center=True) + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').click() + time.sleep(3) + self.mn_tab.ele('x:(//span[normalize-space(text()) = "买入/做多"])').click() + self.start = 1 + elif self.direction == "short" and self.start == 1: + logger.success(f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},反手平多做空") + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},反手平多做空") + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').scroll.to_see(center=True) + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').click() + time.sleep(3) + self.mn_tab.ele('x://span[normalize-space(text()) = "卖出/做空"]').click() + self.start = -1 + + def get_text(self, target_text): + # 去除目标文本中的空白字符 + cleaned_target_text = re.sub(r'\s', '', target_text) + + # 创建 BeautifulSoup 对象 + soup = BeautifulSoup(self.mn_tab.html, 'html.parser') + + # 遍历所有标签的文本内容 + for tag in soup.find_all(): + tag_text = tag.get_text() + # 去除标签文本中的空白字符 + cleaned_tag_text = re.sub(r'\s', '', tag_text) + if cleaned_target_text in cleaned_tag_text: + return True + else: + return False + + def get_now_time(self): + # 获取当前时间戳 + current_timestamp = time.time() + # 将当前时间戳转换为 datetime 对象 + current_datetime = datetime.datetime.fromtimestamp(current_timestamp) + + # 计算距离当前时间最近的整点或 30 分时刻 + if current_datetime.minute < 30: + target_datetime = current_datetime.replace(minute=0, second=0, microsecond=0) + else: + target_datetime = current_datetime.replace(minute=30, second=0, microsecond=0) + + # 将目标 datetime 对象转换为时间戳 + target_timestamp = target_datetime.timestamp() + + return int(target_timestamp) + + def close_extra_tabs_in_browser(self): + + try: + for _, i in enumerate(self.page.get_tabs()): + if _ == 0: + continue + + i.close() + + return True + except: + pass + + return False + + def get_num(self): + + num_tab = self.page.new_tab() + num_tab.listen.start("derivatives.bitmart.com/gw-api/contract-tiger/forward/v1/ifcontract/accounts") + + for i in range(3): + try: + logger.info(f"获取最新数据:{i + 1}次。。。") + num_tab.get(url="https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") + res = num_tab.listen.wait(timeout=15) # 等待并获取一个数据包 + + if res: + num_tab.close() + return res.response.body["data"]["accounts"][0]["available_balance"] + except: + pass + + num_tab.close() + + return False + + def action(self): + # 获取比特端口 + if self.openBrowser(): + logger.info("获取打开比特成功,成功获取端口!!!") + else: + logger.error("打开比特失败!!!") + return + + # 接管浏览器 + if self.take_over_browser(): + logger.info("接管比特浏览器成功!!!") + else: + logger.error("接管浏览器失败!!!") + return + + if self.close_extra_tabs_in_browser(): + logger.info('关闭多余标签页成功!!!') + else: + logger.info('关闭多余标签页失败!!!') + + self.mn_tab = self.page.new_tab() + self.mn_tab.listen.start("contract-v2.bitmart.com/v1/ifcontract/quote/kline") + logger.success("浏览器开启抓包模式。。。") + + self.mn_tab.get(url="https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") # 打开网页 + + self.pbar = tqdm(total=30, desc="等待时间中", ncols=80) # desc:进度条说明,ncols:长度 + + while True: + # 获取当前时间 + current_time = time.localtime() + current_minute = current_time.tm_min + + if current_minute < 30: + self.pbar.n = current_minute + self.pbar.refresh() + else: + self.pbar.n = current_minute - 30 + self.pbar.refresh() + + if current_minute not in [0, 1, 2, 3, 4, 5, 30, 31, 32, 33, 34, ]: # 判断是否是 新的30分钟了 + # if current_minute not in range(60): # 判断是否是 新的30分钟了 + time.sleep(10) + continue + + new_price_datas = self.get_price() + if new_price_datas: + logger.success("获取最新交易价格成功!!!") + else: + logger.info("获取最新价格有问题!!!") + continue + + new_price_datas1 = sorted(new_price_datas, key=lambda x: x["id"]) + self.kline_1, self.kline_2, self.kline_3 = new_price_datas1[-3:] + + # 判断抓取的数据是否正确 + if self.get_now_time() != self.kline_3["id"]: + continue + + time.sleep(15) + + if self.get_text(target_text="全仓做多100X永续持仓"): + self.start = 1 + elif self.get_text(target_text="全仓做空100X永续持仓"): + self.start = -1 + else: + self.start = 0 + + if self.start == 1: + if is_bearish(self.kline_1) and is_bearish(self.kline_2): + logger.success(f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},平多") + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},平多") + + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').scroll.to_see(center=True) + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').click() + self.start = 0 + elif self.start == -1: + if is_bullish(self.kline_1) and is_bullish(self.kline_2): + logger.success(f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},平空") + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},第一根信号:{self.kline_1},{self.kline_2},平空") + + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').scroll.to_see(center=True) + self.mn_tab.ele('x:(//span[normalize-space(text()) = "市价"])').click() + self.start = 0 + + self.direction, signal_key = self.check_signal(prev=self.kline_1, curr=self.kline_2) # 判断信号 + + if self.direction: + try: + self.to_do_page() + except Exception as e: + self.send_dingtalk_message( + message_content=f"{datetime.datetime.now()},{e}") + + self.pbar.reset() # 重置进度条 + self.send_dingtalk_message( + message_content= + f"{datetime.datetime.now()}," + f"目前有持仓:{"无" if self.start == 0 else ("多" if self.start == 1 else "空")}," + f"当前信号:{"无" if not self.direction else ("多" if self.direction == "long" else "空")}" + ) + + +if __name__ == '__main__': + WeexTransaction( + tge_id=196495, + ).action()