rgfewfger
This commit is contained in:
@@ -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())
|
||||
|
||||
25
交易/1.json
25
交易/1.json
@@ -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'
|
||||
}
|
||||
163
交易/bitmart_交易.py
163
交易/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(
|
||||
|
||||
63
交易/test.py
63
交易/test.py
@@ -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())
|
||||
Reference in New Issue
Block a user