diff --git a/telegram/test.py b/telegram/test.py index 6f87865..6964b53 100644 --- a/telegram/test.py +++ b/telegram/test.py @@ -1,4 +1,4 @@ -from telethon import TelegramClient, sync +from telethon import TelegramClient from telethon.sessions import StringSession # ========== 配置区 ========== @@ -14,8 +14,9 @@ PROXY = { 'username': "SyNuejCtrQ", 'password': "MH8ioL7EXf" } -# Haxi@123456@ -client = TelegramClient(SESSION_FILE, API_ID, API_HASH,proxy=PROXY) + +client = TelegramClient(SESSION_FILE, API_ID, API_HASH, proxy=PROXY) + async def main(): await client.start() # 登录,如果第一次会要求输入手机号和验证码 @@ -34,6 +35,8 @@ async def main(): bot = await client.get_entity("ergggreef") await client.send_message(bot, "https://t.me/ergggreef") + if __name__ == "__main__": import asyncio + asyncio.run(main()) diff --git a/交易/1.json b/交易/1.json deleted file mode 100644 index ec3d7d1..0000000 --- a/交易/1.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - 'language': 'zh-CN', - 'sec-ch-ua-platform': '"Windows"', - 'Cache-Control': 'no-cache', - 'Referer': 'https://www.websea.com/', - 'Pragma': 'no-cache', - 'sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"', - 'sec-ch-ua-mobile': '?0', - 'IMEI': '0b8193313e8c44ad5451918059be26c8', - 'isNight': '1', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36', - 'Accept': 'application/json, text/plain, */*', - 'Content-Type': 'application/x-www-form-urlencoded', - 'token': '00c8b5e76864736bd3c719cb8eu70355376', - 'platform': 'pc', - 'accept-encoding': 'gzip, deflate, br, zstd', - 'accept-language': 'zh-TW,zh;q=0.9', - 'content-length': '1601', - 'cookie': 'EXUU=00c8b5e76864736bd3c719cb8eu70355376; shareToken=00c8b5e76864736bd3c719cb8eu70355376; __zlcmid=1UVo2zw0P69Xt8z; _ga=GA1.1.128879445.1762510705; _ga_8ZZTTHJR37=GS2.1.s1765437268$o11$g1$t1765439366$j56$l0$h0', - 'origin': 'https://www.websea.com', - 'priority': 'u=1, i', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site' -} diff --git a/交易/bitmart_交易.py b/交易/bitmart_交易.py index b1491de..4a26ea0 100644 --- a/交易/bitmart_交易.py +++ b/交易/bitmart_交易.py @@ -2,6 +2,7 @@ import re import time import datetime +from telethon import TelegramClient from tqdm import * from loguru import * from DrissionPage import * @@ -28,11 +29,6 @@ class WeexTransaction: "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:做多 @@ -45,25 +41,29 @@ class WeexTransaction: self.session = requests.Session() # 接口请求对象 - def send_dingtalk_message(self, message_content): + async def send_dingtalk_message(self, message_content): - pass + # ========== 配置区 ========== + API_ID = 2040 # 替换成你的 API ID + API_HASH = "b18441a1ff607e10a989891a5462e627" # 替换成你的 API HASH + SESSION_FILE = "8619211027341" # 登录会话保存文件 + # ============================ - # 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()) + PROXY = { + 'proxy_type': "socks5", + 'addr': "202.155.144.102", + 'port': 31102, + 'username': "SyNuejCtrQ", + 'password': "MH8ioL7EXf" + } + + try: + client = TelegramClient(SESSION_FILE, API_ID, API_HASH, proxy=PROXY) + bot = await client.get_entity("ergggreef") + await client.send_message(bot, message_content) + return True + except: + return False def openBrowser(self, ): # 直接指定ID打开窗口,也可以使用 createBrowser 方法返回的ID @@ -169,18 +169,7 @@ class WeexTransaction: return datas - 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) @@ -196,20 +185,17 @@ class WeexTransaction: 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) @@ -217,31 +203,13 @@ class WeexTransaction: 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() @@ -297,23 +265,35 @@ class WeexTransaction: def get_token(self): tab = self.page.new_tab() tab.listen.start("derivatives.bitmart.com/gw-api/contract-tiger/forward/v1/ifcontract/userPositions") - tab.get(url="https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") - res = tab.listen.wait() - self.headers = res.request.headers - self.cookies = {} - for i in res.request.cookies: - self.cookies[i["name"]] = i["value"] + for i in range(3): + tab.get(url="https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT") - if self.cookies.get('accessKey'): - self.session.cookies.update(self.cookies) - self.session.headers.update(self.headers) + res = tab.listen.wait() + self.headers = res.request.headers + self.cookies = {} + try: + for i in res.request.cookies: + self.cookies[i["name"]] = i["value"] - tab.close() - return True - else: - tab.close() - return False + if self.cookies.get('accessKey'): + self.session.cookies.update(self.cookies) + self.session.headers.update(self.headers) + + if self.cookies: + break + + except: + time.sleep(1) + + tab.close() + return True if self.cookies else False + + def get_now_time(self): + timestamp = time.time() + local_time = time.localtime(timestamp) + formatted_time = time.strftime("%Y-%m-%d %H:%M:%S", local_time) + return formatted_time def get_position_status(self): params = { @@ -330,9 +310,6 @@ class WeexTransaction: try: resp_data = response.json() - if not resp_data.get("success", False): - self.start = 0 - return positions = resp_data.get("data", {}).get("positions", []) @@ -344,15 +321,12 @@ class WeexTransaction: self.start = 1 elif pos_type == 2: self.start = -1 - else: - self.start = 0 # 或 raise/log 异常情况 + return True except (KeyError, IndexError, AttributeError, TypeError, ValueError) as e: # JSON 解析失败或结构异常 print(f"持仓数据解析错误: {e}") self.start = 0 - - return True except: time.sleep(1) @@ -395,36 +369,45 @@ class WeexTransaction: 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分钟了 + # 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: + if not new_price_datas: logger.info("获取最新价格有问题!!!") + + self.send_dingtalk_message(message_content=f"weex:{self.get_now_time()},获取最新价格有问题!!!") 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"]: + if self.get_now_time() == self.kline_3["id"]: + logger.success("获取最新交易价格成功!!!") + else: + continue + + if self.get_token(): # 获取token + logger.info("获取token成功!!!") + else: + logger.info("获取token失败!!!") + self.send_dingtalk_message(message_content=f"weex:{self.get_now_time()},获取token失败!!!") continue - self.get_token() if self.get_position_status(): logger.info("获取仓位信息成功!!!") else: logger.info("获取仓位信息失败!!!") + + self.send_dingtalk_message(message_content=f"weex:{self.get_now_time()},获取仓位信息失败!!!") continue 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() @@ -432,21 +415,19 @@ class WeexTransaction: 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) # 判断信号 + 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}") + message_content=f"weex:{self.get_now_time()},购买操作失败,{e}") self.pbar.reset() # 重置进度条 self.send_dingtalk_message( diff --git a/交易/test.py b/交易/test.py deleted file mode 100644 index 68a462e..0000000 --- a/交易/test.py +++ /dev/null @@ -1,63 +0,0 @@ -import requests - -cookies = { - 'EXUU': '00c8b5e76864736bd3c719cb8eu70355376', - 'shareToken': '00c8b5e76864736bd3c719cb8eu70355376', - '__zlcmid': '1UVo2zw0P69Xt8z', - '_ga': 'GA1.1.128879445.1762510705', - '_ga_8ZZTTHJR37': 'GS2.1.s1765437268$o11$g1$t1765439532$j58$l0$h0', -} - -headers = { - 'accept': 'application/json, text/plain, */*', - 'accept-language': 'zh-TW,zh;q=0.9', - 'cache-control': 'no-cache', - 'imei': '0b8193313e8c44ad5451918059be26c8', - 'isnight': '1', - 'language': 'zh-CN', - 'origin': 'https://www.websea.com', - 'platform': 'pc', - 'pragma': 'no-cache', - 'priority': 'u=1, i', - 'referer': 'https://www.websea.com/', - 'sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"', - 'sec-ch-ua-mobile': '?0', - 'sec-ch-ua-platform': '"Windows"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site', - 'token': '00c8b5e76864736bd3c719cb8eu70355376', - 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36', - # 'userid': '601313', - # 'cookie': 'EXUU=00c8b5e76864736bd3c719cb8eu70355376; shareToken=00c8b5e76864736bd3c719cb8eu70355376; __zlcmid=1UVo2zw0P69Xt8z; _ga=GA1.1.128879445.1762510705; _ga_8ZZTTHJR37=GS2.1.s1765437268$o11$g1$t1765439532$j58$l0$h0', -} - -headers = { - 'language': 'zh-CN', - 'sec-ch-ua-platform': '"Windows"', - 'Cache-Control': 'no-cache', - 'Referer': 'https://www.websea.com/', - 'Pragma': 'no-cache', - 'sec-ch-ua': '"Not;A=Brand";v="99", "Google Chrome";v="139", "Chromium";v="139"', - # 'sec-ch-ua-mobile': '?0',/ - # 'IMEI': '0b8193313e8c44ad5451918059be26c8', - 'isNight': '1', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36', - 'Accept': 'application/json, text/plain, */*', - 'Content-Type': 'application/x-www-form-urlencoded', - 'token': '00c8b5e76864736bd3c719cb8eu70355376', - 'platform': 'pc', - 'accept-encoding': 'gzip, deflate, br, zstd', - 'accept-language': 'zh-TW,zh;q=0.9', - # 'content-length': '1601', - # 'cookie': 'EXUU=00c8b5e76864736bd3c719cb8eu70355376; shareToken=00c8b5e76864736bd3c719cb8eu70355376; __zlcmid=1UVo2zw0P69Xt8z; _ga=GA1.1.128879445.1762510705; _ga_8ZZTTHJR37=GS2.1.s1765437268$o11$g1$t1765439366$j56$l0$h0', - 'origin': 'https://www.websea.com', - 'priority': 'u=1, i', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site' -} - -response = requests.get('https://capi.websea.com/webApi/entrust/holdPosition', cookies=cookies, headers=headers) - -print(response.json()) \ No newline at end of file