797 lines
28 KiB
Python
797 lines
28 KiB
Python
import threading
|
||
import time
|
||
import pyotp
|
||
import random
|
||
from concurrent.futures import ThreadPoolExecutor
|
||
|
||
from peewee import fn
|
||
from loguru import logger
|
||
from DrissionPage import ChromiumOptions, ChromiumPage
|
||
|
||
from bit_tools import openBrowser, createBrowser, get_group_lists, get_browser_lists_Browser
|
||
from db_init import ensure_tables, sync_xstart_from_bitbrowser
|
||
from models.ips import Ips
|
||
from models.xstart import Xstart
|
||
from models.xtoken import XToken
|
||
|
||
|
||
class Hub_Web:
|
||
def __init__(self, xstart_info, x_info=None):
|
||
self.xstart_info = xstart_info
|
||
self.x_info = x_info
|
||
|
||
self.page = None
|
||
self.x_tab = None
|
||
|
||
self.start() # 执行类时,就启动的方法
|
||
|
||
def start(self):
|
||
|
||
self.create_Browser() # 创建浏览器
|
||
|
||
if self.get_page():
|
||
logger.info(f",浏览器打开成功")
|
||
else:
|
||
logger.error(f",浏览器打开失败")
|
||
return
|
||
|
||
if self.login_x_main():
|
||
self.xstart_info.start = 1
|
||
self.xstart_info.save()
|
||
|
||
logger.success(f",登录x成功!!!")
|
||
|
||
# time.sleep(25)
|
||
#
|
||
# for i in self.x_tab.cookies():
|
||
# if i["name"] == "auth_token":
|
||
# self.xstart_info.cookie = i["value"]
|
||
# self.xstart_info.save()
|
||
|
||
else:
|
||
logger.error(f",登录x失败!!!")
|
||
self.xstart_info.start = 0
|
||
self.xstart_info.save()
|
||
|
||
def create_Browser(self):
|
||
if not self.xstart_info.bit_id:
|
||
|
||
if not self.xstart_info.ip_id:
|
||
self.ips_info = Ips.select().where(Ips.country == "法国").order_by(fn.Rand()).get()
|
||
|
||
self.xstart_info.ip_id = self.ips_info.id
|
||
self.xstart_info.save()
|
||
|
||
logger.info("没有浏览器,创建中。。。")
|
||
|
||
fz_datas = get_group_lists()
|
||
|
||
bit_id = createBrowser(
|
||
# name=self.x_info.user_name,
|
||
proxyType="http",
|
||
groupId=fz_datas['推特'],
|
||
host="104.168.59.92",
|
||
port=int(random.randint(20001, 25000)),
|
||
# proxyUserName=self.ips_info.username,
|
||
# proxyPassword=self.ips_info.password,
|
||
)
|
||
|
||
self.xstart_info.bit_id = bit_id
|
||
self.xstart_info.save()
|
||
|
||
def x_testing(self):
|
||
user_name = self.x_tab.ele(
|
||
'x://*[@id="react-root"]/div/div/div[2]/header/div/div/div/div[2]/div/button/div[2]/div/div[2]/div/div/div/span',
|
||
timeout=10,
|
||
)
|
||
|
||
if not user_name:
|
||
user_name = self.x_tab.ele(
|
||
'x://*[@id="react-root"]/div/div/div[2]/header/div/div/div/div[2]/div/button/div[2]/div/div/div/div[1]/span/span',
|
||
timeout=10,
|
||
)
|
||
return True
|
||
|
||
# if user_name and self.x_info.user_name.lower() == user_name.text.split("@")[-1].lower():
|
||
# return True
|
||
# else:
|
||
# return False
|
||
|
||
# self.x_tab.refresh()
|
||
# time.sleep(5)
|
||
#
|
||
# for i in self.x_tab.cookies():
|
||
# if i.get("name") == "auth_token":
|
||
# self.x_info.token = i.get("value")
|
||
# self.x_info.save()
|
||
#
|
||
# return True
|
||
# else:
|
||
# return False
|
||
|
||
def login_x(self):
|
||
try:
|
||
self.x_tab = self.page.new_tab('https://x.com/login')
|
||
time.sleep(5)
|
||
|
||
self.x_tab.ele('x://input[@autocomplete="username"]').input(self.x_info.user_name)
|
||
self.x_tab.ele('x:(//button[@role="button"])[3]').click()
|
||
self.x_tab.ele('x://input[@name="password"]').input(self.x_info.password)
|
||
self.x_tab.ele('x://button[@data-testid="LoginForm_Login_Button"]').click()
|
||
|
||
# 创建一个 TOTP 对象
|
||
totp = pyotp.TOTP(self.x_info.two_fa)
|
||
self.x_tab.ele('x://input[@data-testid="ocfEnterTextTextInput"]').input(totp.now())
|
||
self.x_tab.ele('x://button[@data-testid="ocfEnterTextNextButton"]').click()
|
||
|
||
time.sleep(5)
|
||
|
||
self.x_tab.ele('x://button[@data-testid="OAuth_Consent_Button"]').click()
|
||
|
||
if self.x_testing():
|
||
self.xstart_info.start = 1
|
||
self.xstart_info.save()
|
||
|
||
return True
|
||
else:
|
||
return False
|
||
except:
|
||
pass
|
||
|
||
return False
|
||
|
||
def get_page_tab(self, url):
|
||
for i in range(3):
|
||
try:
|
||
tab = self.page.get_tab(url=url)
|
||
return tab
|
||
except:
|
||
time.sleep(1)
|
||
|
||
def get_page(self, ):
|
||
|
||
try:
|
||
bit_port = openBrowser(id=self.xstart_info.bit_id)
|
||
co = ChromiumOptions()
|
||
co.set_local_port(port=bit_port)
|
||
|
||
self.page = ChromiumPage(addr_or_opts=co)
|
||
|
||
self.page.set.window.max()
|
||
|
||
time.sleep(5)
|
||
|
||
for _, i in enumerate(self.page.get_tabs()):
|
||
if _ == 0:
|
||
continue
|
||
|
||
i.close()
|
||
|
||
return True
|
||
except:
|
||
pass
|
||
return False
|
||
|
||
def get_x_start(self):
|
||
if self.login_x_main():
|
||
self.xstart_info.start = 1
|
||
self.xstart_info.save()
|
||
|
||
logger.success(f",登录x成功!!!")
|
||
|
||
# time.sleep(25)
|
||
#
|
||
# for i in self.x_tab.cookies():
|
||
# if i["name"] == "auth_token":
|
||
# self.xstart_info.cookie = i["value"]
|
||
# self.xstart_info.save()
|
||
|
||
else:
|
||
logger.error(f",登录x失败!!!")
|
||
self.xstart_info.start = 0
|
||
self.xstart_info.save()
|
||
|
||
def login_x_main(self):
|
||
self.x_tab = self.page.new_tab('https://x.com/login')
|
||
|
||
if self.x_testing():
|
||
return True
|
||
else:
|
||
logger.info(f",开始登录x。。。")
|
||
|
||
if self.login_x():
|
||
return True
|
||
else:
|
||
return False
|
||
|
||
def get_txt(self):
|
||
with open('推文.txt', 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
tasks = [] # 创建任务列表
|
||
lines = content.split('\n')
|
||
print(lines)
|
||
|
||
# 随机选择一个段落
|
||
random_paragraph = random.choice(lines)
|
||
|
||
return random_paragraph
|
||
|
||
def get_soon_txt(self):
|
||
with open('soon推文.txt', 'r', encoding='utf-8') as f:
|
||
content = f.read()
|
||
|
||
tasks = [] # 创建任务列表
|
||
lines = content.split('\n\n')
|
||
print(lines)
|
||
|
||
# 随机选择一个段落
|
||
random_paragraph = random.choice(lines)
|
||
|
||
return random_paragraph
|
||
|
||
def tweet_about_sui_chain(self):
|
||
self.x_tab.ele('x://div[@class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"]').input(
|
||
self.get_txt())
|
||
|
||
time.sleep(5)
|
||
|
||
self.x_tab.ele(
|
||
'x://span[@class="css-1jxf684 r-dnmrzs r-1udh08x r-1udbk01 r-3s2u2q r-bcqeeo r-1ttztb7 r-qvutc0 r-poiln3 r-a023e6 r-rjixqe"]//span[@class="css-1jxf684 r-bcqeeo r-1ttztb7 r-qvutc0 r-poiln3"]').click()
|
||
|
||
if self.hub_web_info.x_num:
|
||
self.hub_web_info.x_num += 1
|
||
else:
|
||
self.hub_web_info.x_num = 1
|
||
|
||
self.hub_web_info.save(only=[HubWeb.x_num])
|
||
|
||
def soon_action(self):
|
||
for i in range(3):
|
||
okx_tab = self.get_page_tab(url="mcohilncbfahbmgdjkbpemcciiolgcge")
|
||
if okx_tab:
|
||
okx_tab.close()
|
||
|
||
okx_wallet_tab = self.page.new_tab(
|
||
url="chrome-extension://mcohilncbfahbmgdjkbpemcciiolgcge/popup.html#/initialize")
|
||
|
||
time.sleep(5)
|
||
if "initialize" in okx_wallet_tab.url:
|
||
okx_wallet_tab.ele('x:(//button[@data-testid="okd-button"])[last()]').click()
|
||
|
||
okx_wallet_tab.ele(
|
||
'x://div[@class="_wallet-list__item_1kyzd_4 _wallet-list__item__hover_1kyzd_8 _wallet-list__cell_1kyzd_26 _listCell_q2vqq_29"]').click()
|
||
time.sleep(5)
|
||
okx_wallet_tab = self.get_page_tab(url="mcohilncbfahbmgdjkbpemcciiolgcge")
|
||
|
||
soon_wallet_info = CjjSoo.get_or_none(
|
||
CjjSoo.id == self.hub_web_info.soon_wallet_id
|
||
)
|
||
|
||
for ele, text in zip(okx_wallet_tab.eles('x://input[@class="mnemonic-words-inputs__container__input"]'),
|
||
soon_wallet_info.mnemonic.split(
|
||
" ")):
|
||
ele.input(text)
|
||
|
||
okx_wallet_tab.ele('x://button[@data-testid="okd-button"]').click()
|
||
okx_wallet_tab.ele('x:(//div[@class="_item-content_1cywj_42"])[last()]').click()
|
||
okx_wallet_tab.ele('x://span[@class="btn-content"]').click()
|
||
|
||
okx_wallet_tab.ele('x://input[@data-testid="okd-input"]').input("12345678")
|
||
okx_wallet_tab.ele('x:(//input[@data-testid="okd-input"])[last()]').input("12345678")
|
||
|
||
okx_wallet_tab.ele('x:(//span[@class="btn-content"])[last()]').click()
|
||
time.sleep(10)
|
||
okx_wallet_tab.ele('x:(//span[@class="btn-content"])[last()]').click()
|
||
|
||
if "unlock" in okx_wallet_tab.url:
|
||
okx_wallet_tab.ele('x://input[@data-testid="okd-input"]').input("12345678")
|
||
okx_wallet_tab.ele('x://button[@data-testid="okd-button"]').click()
|
||
|
||
time.sleep(5)
|
||
okx_wallet_tab.close()
|
||
|
||
soon_tab = self.page.new_tab(url="https://redpill.soo.network/ ")
|
||
|
||
sign_ele = soon_tab.ele('x://button[text()="Sign"]', timeout=5)
|
||
if sign_ele:
|
||
sign_ele.click()
|
||
|
||
time.sleep(5)
|
||
okx_wallet_tab = self.page.get_tab(url="mcohilncbfahbmgdjkbpemcciiolgcge")
|
||
okx_wallet_tab.ele('x:(//button[@data-testid="okd-button"])[last()]').click()
|
||
time.sleep(10)
|
||
|
||
sign_ele = soon_tab.ele('x://button[text()="Sign In"]', timeout=5)
|
||
if sign_ele:
|
||
sign_ele.click()
|
||
|
||
soon_tab.ele('x://button[contains(text(), "OKX")]').click()
|
||
|
||
time.sleep(5)
|
||
okx_wallet_tab = self.page.get_tab(url="mcohilncbfahbmgdjkbpemcciiolgcge")
|
||
okx_wallet_tab.ele('x:(//button[@data-testid="okd-button"])[last()]').click()
|
||
|
||
time.sleep(5)
|
||
|
||
sign_ele = soon_tab.ele('x://button[text()="Sign"]', timeout=5)
|
||
if sign_ele:
|
||
sign_ele.click()
|
||
|
||
time.sleep(5)
|
||
okx_wallet_tab = self.page.get_tab(url="mcohilncbfahbmgdjkbpemcciiolgcge")
|
||
okx_wallet_tab.ele('x:(//button[@data-testid="okd-button"])[last()]').click()
|
||
time.sleep(10)
|
||
|
||
soon_ele = soon_tab.ele('x://div[@class="group relative cursor-pointer"]', timeout=3)
|
||
if soon_ele:
|
||
soon_ele.click()
|
||
time.sleep(3)
|
||
soon_ele = soon_tab.ele('x://button[text()="Yes"]', timeout=3)
|
||
if soon_ele:
|
||
soon_ele.click()
|
||
time.sleep(3)
|
||
soon_ele = soon_tab.ele('x://button[text()="Confirm"]', timeout=3)
|
||
if soon_ele:
|
||
soon_ele.click()
|
||
time.sleep(3)
|
||
soon_ele = soon_tab.ele('x://button[text()="Connect X to Start My Journey"]', timeout=3)
|
||
if soon_ele:
|
||
soon_ele.click()
|
||
time.sleep(5)
|
||
soon_ele = soon_tab.ele('x://button[@data-testid="OAuth_Consent_Button"]', timeout=15)
|
||
if soon_ele:
|
||
soon_ele.click()
|
||
|
||
# -------------------------------------------------------------------------------------
|
||
x_tab = self.page.new_tab(url="https://x.com/intent/post?text=.%20%40soon_svm&hashtags=SOONISTHEREDPILL")
|
||
|
||
x_tab = self.page.get_tab(url="SOONISTHEREDPILL")
|
||
x_tab.ele('x://div[@class="false draftjs-styles_0 "]').input(self.get_soon_txt())
|
||
time.sleep(5)
|
||
x_tab.ele('x://button[@data-testid="tweetButton"]').click()
|
||
time.sleep(5)
|
||
x_tab.ele('x://button[@data-testid="tweetButton"]').click()
|
||
|
||
time.sleep(15)
|
||
|
||
def get_urls(self):
|
||
|
||
tab = self.page.new_tab()
|
||
tab.listen.start("https://x.com/i/api/graphql")
|
||
|
||
tab.get(url=f"https://x.com/{self.x_info.user_name}")
|
||
|
||
url_id = ""
|
||
|
||
try:
|
||
res = tab.listen.wait(timeout=25) # 等待并获取一个数据包
|
||
for i in res.response.body["data"]['user']['result']["timeline"]['timeline']["instructions"][1][
|
||
"entries"]:
|
||
if "tweet" in i["entryId"]:
|
||
new_string = i["entryId"].replace("tweet-", "")
|
||
url_id += new_string + ";"
|
||
|
||
except:
|
||
pass
|
||
|
||
self.xstart_info.url_id = url_id
|
||
self.xstart_info.save()
|
||
|
||
def to_li(self):
|
||
|
||
xtoken_info = XToken.select().where(XToken.start == 1).order_by(fn.Rand()).get()
|
||
xstart_info = Xstart.get_or_none(
|
||
x_id=xtoken_info.id,
|
||
)
|
||
|
||
result = xstart_info.url_id.split(';')
|
||
# 去除可能存在的空字符串元素
|
||
result = [item for item in result if item]
|
||
|
||
for i in result:
|
||
tab = self.page.new_tab(url=f"https://x.com/{xtoken_info.user_name}/status/{i}")
|
||
time.sleep(random.randint(1, 10))
|
||
|
||
if random.randint(1, 11) > 5:
|
||
# tab.ele(
|
||
# 'x:/html/body/div[1]/div/div/div[2]/main/div/div/div/div/div/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[2]/button').click()
|
||
|
||
tab.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[2]/main/div/div/div/div/div/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[2]/button')
|
||
time.sleep(random.randint(1, 5))
|
||
# tab.ele(
|
||
# 'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div[2]/div/div[3]/div/div/div/div').click()
|
||
tab.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div[2]/div/div[3]/div/div/div/div')
|
||
|
||
time.sleep(random.randint(1, 10))
|
||
|
||
if random.randint(1, 11) > 5:
|
||
# tab.ele(
|
||
# 'x:/html/body/div[1]/div/div/div[2]/main/div/div/div/div/div/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[3]/button').click()
|
||
tab.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[2]/main/div/div/div/div/div/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[3]/button')
|
||
time.sleep(random.randint(1, 10))
|
||
|
||
def account_nurturing(self):
|
||
# self.start()
|
||
|
||
titles = ["Bianca", "币安", "OKX", "bitget", "bybit", "mexc"]
|
||
random_element = random.choice(titles)
|
||
|
||
self.page.get(url=f"https://x.com/search?q={random_element}")
|
||
|
||
names = []
|
||
|
||
for i1 in range(random.randint(10, 20)):
|
||
eles = self.page.eles(
|
||
'x:/html/body/div[1]/div/div/div[2]/main/div/div/div/div[1]/div/div[3]/section/div/div/div', timeout=5)
|
||
i = random.choice(eles)
|
||
ele = i.ele(
|
||
'x:./div/div/article/div/div/div[2]/div[2]/div[1]/div/div[1]/div/div/div[1]/div/a/div/div[1]/span/span',
|
||
timeout=0.5)
|
||
if not ele:
|
||
continue
|
||
|
||
if ele.text in names:
|
||
continue
|
||
names.append(ele.text)
|
||
|
||
self.page.actions.scroll(on_ele=ele)
|
||
time.sleep(1)
|
||
self.page.actions.click(on_ele=ele)
|
||
|
||
# 关注
|
||
if random.randint(1, 11) > 5:
|
||
ele = self.page.ele('x://span[text()="Follow"]', timeout=0.5)
|
||
if ele:
|
||
self.page.actions.click(on_ele=ele)
|
||
|
||
for i in range(random.randint(1, 10)):
|
||
eles = self.page.eles(
|
||
'x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[3]/div/div/section/div/div/div',
|
||
timeout=5)
|
||
|
||
i = random.choice(eles)
|
||
|
||
ele = i.ele('x:.//div/div/article', timeout=5)
|
||
if ele:
|
||
self.page.actions.scroll(on_ele=ele)
|
||
time.sleep(1)
|
||
self.page.actions.click(on_ele=ele)
|
||
|
||
time.sleep(random.randint(1, 10))
|
||
|
||
self.page.actions.scroll(
|
||
on_ele='x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div[2]/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[3]/button/div/div[1]')
|
||
time.sleep(random.randint(1, 5))
|
||
|
||
if random.randint(1, 11) > 5:
|
||
self.page.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div[2]/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[2]/button')
|
||
time.sleep(random.randint(1, 5))
|
||
self.page.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[3]/div/div/div/div[2]/div/div[3]/div/div/div/div/div[2]/div')
|
||
|
||
time.sleep(random.randint(1, 10))
|
||
|
||
if random.randint(1, 11) > 5:
|
||
self.page.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div[2]/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[3]/button/div/div[1]')
|
||
time.sleep(random.randint(1, 10))
|
||
|
||
self.page.back()
|
||
|
||
time.sleep(random.randint(1, 10))
|
||
self.page.scroll(random.randint(500, 1000))
|
||
|
||
self.page.back()
|
||
|
||
time.sleep(random.randint(1, 10))
|
||
self.page.scroll(random.randint(500, 1000))
|
||
|
||
if random.randint(1, 11) > 5:
|
||
self.FollowTwitterAccount()
|
||
|
||
def get_name(self):
|
||
self.x_tab = self.page.new_tab('https://x.com/login')
|
||
|
||
user_name = self.x_tab.ele(
|
||
'x://*[@id="react-root"]/div/div/div[2]/header/div/div/div/div[2]/div/button/div[2]/div/div[2]/div/div/div/span',
|
||
timeout=10,
|
||
)
|
||
|
||
if not user_name:
|
||
user_name = self.x_tab.ele(
|
||
'x://*[@id="react-root"]/div/div/div[2]/header/div/div/div/div[2]/div/button/div[2]/div/div/div/div[1]/span/span',
|
||
timeout=10,
|
||
)
|
||
|
||
if user_name:
|
||
|
||
for i in XToken.select():
|
||
if i.user_name.lower() == user_name.text.split("@")[-1].lower():
|
||
self.xstart_info.x_id = i.id
|
||
self.xstart_info.save()
|
||
|
||
return True
|
||
else:
|
||
return False
|
||
|
||
def to_do_tui(self):
|
||
self.start()
|
||
|
||
# 发推
|
||
try:
|
||
# self.x_tab.get("https://x.com/home")
|
||
time.sleep(random.randint(3, 15))
|
||
|
||
# text = "Websea顶级渠道,注册就可享受websea合约85%返佣,量大可谈,欢迎代理咨询。 TG(飞机):http://t.me/webseadds"
|
||
text = self.get_txt()
|
||
text = """
|
||
💡 Websea Futures Insurance 2.0 FAQ
|
||
What is "Referral-Based Rate Reduction"?
|
||
|
||
🤝 For every friend you successfully invite, your insurance fee rate drops by 1%, up to a maximum of 5%!
|
||
|
||
A friend counts as a successful boost once they register and reach a total insurance premiums of ≥ 10 USDT within 7 days.
|
||
|
||
Your friend also receives 1 reward node after completing registration.
|
||
Win–win benefits — don’t miss out! 🚀
|
||
"""
|
||
|
||
self.xstart_info.url_id = text
|
||
self.xstart_info.save()
|
||
|
||
self.x_tab.actions.click(
|
||
'x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[2]/div[2]/div/div/nav/div/div[2]/div/div[1]/div/button').input(
|
||
[r"E:\新建文件夹\6194986263283174596.jpg"])
|
||
|
||
self.x_tab.actions.click(
|
||
'x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[1]/div/div/div/div/div/div/div/div/div/div/div/div[1]/div/div/div/div/div/div[2]/div/div/div/div').input(
|
||
text)
|
||
|
||
time.sleep(random.randint(3, 15))
|
||
for i in range(3):
|
||
self.x_tab.actions.click(
|
||
on_ele='x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[2]/div[2]/div/div/div/button')
|
||
time.sleep(1)
|
||
time.sleep(5)
|
||
except Exception as e:
|
||
print(e)
|
||
|
||
def end(self):
|
||
self.page.quit()
|
||
|
||
def __enter__(self):
|
||
return self
|
||
|
||
def __exit__(self, exc_type, exc_value, traceback):
|
||
self.end()
|
||
|
||
def FollowTwitterAccount(self):
|
||
|
||
# 点击关注
|
||
# tab = self.page.new_tab(url="https://x.com/CryptoStart_App")
|
||
tab = self.page.new_tab(url="https://x.com/Websea_MY")
|
||
time.sleep(10)
|
||
# ele = tab.ele('x://span[text()="Follow"]', timeout=0.5)
|
||
# if ele:
|
||
# tab.actions.click(on_ele=ele)
|
||
# time.sleep(10)
|
||
|
||
tab.actions.click(
|
||
on_ele='x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div[1]/div/div[3]/div/div/div[1]/div[1]/div[1]/div[2]/div/div[1]/button/div/span/span')
|
||
|
||
for i in range(random.randint(1, 10)):
|
||
tab.actions.scroll(delta_y=random.randint(400, 800))
|
||
time.sleep(random.randint(3, 10))
|
||
|
||
def 回复(self):
|
||
|
||
urls = [
|
||
"https://x.com/Websea_MY/status/2004081342364123146",
|
||
"https://x.com/Websea_MY/status/2003669526492405904",
|
||
"https://x.com/Websea_MY/status/2001119115575222779",
|
||
"https://x.com/Websea_MY/status/2001180999443734677"
|
||
]
|
||
tests = [
|
||
"O seguro de futuros da Websea ultrapassou oficialmente a marca de 400 rodadas de airdrops! 🚀 Contacte TG@webseatom 85% de reembolso",
|
||
"Websea #FuturesInsurance официально преодолела отметку в 400 раундов аирдропов! 🚀Свяжитесь с TG@webseatom 85% кэшбэк",
|
||
"¡Websea #FuturesInsurance ha superado oficialmente las 400 rondas de airdrops! 🚀Póngase en contacto con TG@webseatom 85 % de reembolso",
|
||
"Websea #FuturesInsurance has officially surpassed 400 rounds of airdrops! 🚀 Contact TG@webseatom 85% cashback",
|
||
"Websea #FuturesInsurance đã chính thức vượt qua 400 đợt airdrop! 🚀Liên hệ TG@webseatom 85% hoàn tiền",
|
||
]
|
||
|
||
tab = self.page.new_tab(random.choice(urls))
|
||
tab.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[2]/main/div/div/div/div[1]/div/section/div/div/div[1]/div/div/article/div/div/div[3]/div[5]/div/div/div[2]/button')
|
||
time.sleep(random.randint(1, 5))
|
||
tab.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div[2]/div/div[3]/div/div/div/a[1]')
|
||
time.sleep(random.randint(1, 5))
|
||
# tab.actions.type(random.choice(tests))
|
||
tab.ele(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div/div[3]/div[2]/div[1]/div/div/div/div[1]/div[2]/div/div/div/div/div/div/div/div/div/div/div[1]/div/div[1]/div/div/div/div/div/div[2]/div/div/div/div').input(
|
||
random.choice(tests))
|
||
time.sleep(random.randint(1, 5))
|
||
|
||
for i in range(3):
|
||
try:
|
||
tab.actions.click(
|
||
'x:/html/body/div[1]/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div/div[3]/div[2]/div[1]/div/div/div/div[2]/div[2]/div/div/div/button/div/span/span')
|
||
except:
|
||
pass
|
||
|
||
time.sleep(random.randint(1, 5))
|
||
|
||
time.sleep(random.randint(5, 15))
|
||
|
||
# def action(self):
|
||
|
||
|
||
# if not self.xstart_info.bit_id:
|
||
# self.xstart_info.ip_id = self.ips_info.id
|
||
# self.xstart_info.save()
|
||
#
|
||
# logger.info("没有浏览器,创建中。。。")
|
||
#
|
||
# fz_datas = get_group_lists()
|
||
#
|
||
# bit_id = createBrowser(
|
||
# name=self.x_info.user_name,
|
||
# groupId=fz_datas['推特'],
|
||
# host=self.ips_info.host,
|
||
# port=int(self.ips_info.port),
|
||
# proxyUserName=self.ips_info.username,
|
||
# proxyPassword=self.ips_info.password,
|
||
# )
|
||
#
|
||
# self.xstart_info.bit_id = bit_id
|
||
# self.xstart_info.save()
|
||
|
||
# self.get_page()
|
||
|
||
# if self.get_page():
|
||
# logger.info(f"推特名字:{self.x_info.user_name},浏览器打开成功")
|
||
# else:
|
||
# logger.error(f"推特名字:{self.x_info.user_name},浏览器打开失败")
|
||
# return
|
||
#
|
||
# time.sleep(5)
|
||
|
||
# for _, i in enumerate(self.page.get_tabs()):
|
||
# if _ == 0:
|
||
# continue
|
||
#
|
||
# i.close()
|
||
|
||
# self.get_name()
|
||
|
||
# if self.login_x_main():
|
||
# self.xstart_info.start = 1
|
||
# self.xstart_info.save()
|
||
#
|
||
# logger.success(f"推特名字:{self.x_info.user_name},登录x成功!!!")
|
||
#
|
||
# # time.sleep(25)
|
||
# #
|
||
# # for i in self.x_tab.cookies():
|
||
# # if i["name"] == "auth_token":
|
||
# # self.xstart_info.cookie = i["value"]
|
||
# # self.xstart_info.save()
|
||
#
|
||
# else:
|
||
# logger.error(f"推特名字:{self.x_info.user_name},登录x失败!!!")
|
||
# self.xstart_info.start = 0
|
||
# self.xstart_info.save()
|
||
|
||
# # 发推
|
||
# try:
|
||
# # self.x_tab.get("https://x.com/home")
|
||
# time.sleep(random.randint(3, 15))
|
||
#
|
||
# text = "Websea顶级渠道,注册就可享受websea合约85%返佣,量大可谈,欢迎代理咨询。 TG(飞机):http://t.me/webseadds"
|
||
#
|
||
# self.x_tab.actions.click(
|
||
# 'x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[1]/div/div/div/div/div/div/div/div/div/div/div/div[1]/div/div/div/div/div/div[2]/div/div/div/div').input(
|
||
# text)
|
||
#
|
||
# time.sleep(random.randint(3, 15))
|
||
# self.x_tab.actions.click(
|
||
# on_ele='x://*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[2]/div[2]/div/div/div/button')
|
||
# time.sleep(5)
|
||
# except:
|
||
# pass
|
||
|
||
# # 获取推文链接
|
||
# self.get_urls()
|
||
|
||
# # 浏览推文
|
||
# try:
|
||
# self.to_li()
|
||
# except:
|
||
# pass
|
||
|
||
# # 养号流程
|
||
# try:
|
||
# self.account_nurturing()
|
||
# except Exception as e:
|
||
# print(e)
|
||
|
||
# 点击关注
|
||
# tab = self.page.new_tab(url="https://x.com/CryptoStart_App")
|
||
# time.sleep(10)
|
||
# ele = tab.ele('x://span[text()="Follow"]', timeout=0.5)
|
||
# if ele:
|
||
# tab.actions.click(on_ele=ele)
|
||
# time.sleep(10)
|
||
#
|
||
# for i in range(random.randint(1, 10)):
|
||
# tab.actions.scroll(delta_y=random.randint(400, 800))
|
||
# time.sleep(random.randint(3, 10))
|
||
|
||
# self.page.quit()
|
||
|
||
|
||
def run_work(x_token_info, xstart_info):
|
||
# hun_web = Hub_Web(x_info=x_token_info, xstart_info=xstart_info)
|
||
# executor.submit(hun_web.to_do_tui)
|
||
|
||
with Hub_Web(x_info=None, xstart_info=xstart_info) as hub:
|
||
try:
|
||
hub.account_nurturing() # 养号
|
||
except:
|
||
pass
|
||
|
||
# hub.to_do_tui() # 发推
|
||
hub.回复() # 发推
|
||
|
||
# hub.FollowTwitterAccount() # 关注
|
||
|
||
|
||
if __name__ == '__main__':
|
||
# ensure_tables()
|
||
# sync_xstart_from_bitbrowser(group_name="推特", max_pages=10)
|
||
#
|
||
# fz_datas = get_group_lists()
|
||
#
|
||
# for bit_data in get_browser_lists_Browser(id=fz_datas['推特']):
|
||
# print(bit_data)
|
||
# xstart_info, start = Xstart.get_or_create(
|
||
# bit_id=bit_data["id"],
|
||
# )
|
||
# if xstart_info.x_id:
|
||
# # continue
|
||
#
|
||
# hun_web = Hub_Web(xstart_info=xstart_info)
|
||
#
|
||
# # hun_web.action()
|
||
#
|
||
# threading.Thread(target=hun_web.action).start()
|
||
# time.sleep(random.randint(15, 60))
|
||
|
||
# 同时运行
|
||
max_threads = 5
|
||
delay_between_start = 30 # 每次启动线程之间的延迟时间(秒)
|
||
|
||
with ThreadPoolExecutor(max_workers=max_threads) as executor:
|
||
|
||
# for x_token_info in XToken.select():
|
||
|
||
# 查询数据并转换为列表
|
||
random_x_infos = list(Xstart.select())
|
||
# 直接对原列表进行打乱操作
|
||
random.shuffle(random_x_infos)
|
||
|
||
# 遍历打乱顺序后的列表
|
||
for x_token_info in random_x_infos:
|
||
|
||
# if xstart_info.start:
|
||
# continue
|
||
|
||
executor.submit(run_work, x_token_info, x_token_info)
|
||
# time.sleep(random.randint(60, 150))
|
||
time.sleep(delay_between_start)
|