更改任务为队列+并发的格式, 登录,获取账号配置, 更新账号配置功能为单独的锁能并发两次. 更改账号被检测到自动化时自动进行解锁账号

This commit is contained in:
work
2025-07-08 15:52:44 +08:00
parent fb1acc6502
commit 4ae0502243
2 changed files with 80 additions and 43 deletions

50
main.py
View File

@@ -1,5 +1,10 @@
from spider.task import * from spider.task import *
from loguru import logger from loguru import logger
from concurrent.futures import ThreadPoolExecutor
from queue import Queue
import threading
import time
import requests
logger.add("./log/logging.log", rotation="50 MB") logger.add("./log/logging.log", rotation="50 MB")
@@ -18,8 +23,6 @@ HOST = "http://118.193.40.152:8002"
def get_task(): def get_task():
if lock._block.locked():
return
url = f'{HOST}/queue/get-data' url = f'{HOST}/queue/get-data'
header = { header = {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
@@ -28,10 +31,16 @@ def get_task():
"include_task_type": [], "include_task_type": [],
"exclude_task_type": [] "exclude_task_type": []
} }
try:
response = requests.post(url, headers=header, json=data, proxies=None) response = requests.post(url, headers=header, json=data, proxies=None)
if response.status_code == 200: if response.status_code == 200:
result = response.json() return response.json()
return result else:
# logger.error(f"Failed to get task. Status code: {response.status_code}, Response: {response.text}")
return None
except Exception as e:
logger.error(f"Error occurred while getting task: {str(e)}")
return None
def task_callback(tid, data, status='success', msg='success'): def task_callback(tid, data, status='success', msg='success'):
@@ -65,17 +74,36 @@ def execute_task(tid, task_type, **kwargs):
def main(): def main():
# 创建任务队列最大容量为3
task_queue = Queue(maxsize=2)
# 存储正在运行的任务
running_tasks = set()
# 创建线程池执行任务3个工作线程
with ThreadPoolExecutor(max_workers=3) as executor:
while True: while True:
try: try:
# 清理已完成的任务
running_tasks = {task for task in running_tasks if not task.done()}
# 如果队列未满,尝试获取新任务
if len(running_tasks) < 3:
task = get_task() task = get_task()
if task is None: if task:
logger.info("无任务") logger.info(f"收到任务: {task['id']} - {task['task_type']}")
task_data = task['data']
task_data['tid'] = task['id']
task_data['task_type'] = task['task_type']
# 提交任务到线程池并保存future对象
future = executor.submit(execute_task, **task_data)
running_tasks.add(future)
else:
logger.info("无更多任务")
time.sleep(10) time.sleep(10)
continue else:
logger.info(f"收到任务{task}") # 达到最大并发数时等待
task['data']['tid'] = task['id'] time.sleep(1)
task['data']['task_type'] = task['task_type']
execute_task(**task['data'])
except Exception as e: except Exception as e:
logger.error(f'Main Error: {e}') logger.error(f'Main Error: {e}')
time.sleep(10) time.sleep(10)

View File

@@ -17,6 +17,7 @@ from PIL import ImageGrab
from loguru import logger from loguru import logger
from playwright._impl._page import Page from playwright._impl._page import Page
from playwright.sync_api import sync_playwright, Error, TimeoutError from playwright.sync_api import sync_playwright, Error, TimeoutError
from concurrent.futures import ThreadPoolExecutor
from const import BUCKET, BASE_PATH from const import BUCKET, BASE_PATH
from exceptions import AuthException, OperationFailed from exceptions import AuthException, OperationFailed
@@ -826,9 +827,19 @@ def check_account_status(page, cookies):
# 校验Cookies 是否失效 # 校验Cookies 是否失效
# 登录页面判断 # 登录页面判断
retry_goto(page, 'https://www.facebook.com')
time.sleep(3)
login_btn = page.query_selector_all('//button[@name="login"]') login_btn = page.query_selector_all('//button[@name="login"]')
if login_btn: if login_btn:
raise AuthException('该账户登录状态失效', 'invalid') raise AuthException('该账户登录状态失效', 'invalid')
# 判断是否被检测到自动化,这种情况只需要点击按钮就可以继续
if page.query_selector('//span[text()="We suspect automated behavior on your account"]') is not None:
page.click('//span[text()="Dismiss"]')
time.sleep(3)
retry_goto(page, 'https://www.facebook.com')
# 判断是否为英文 # 判断是否为英文
lang = page.locator('html').get_attribute('lang') lang = page.locator('html').get_attribute('lang')
if lang != "en": if lang != "en":
@@ -843,6 +854,7 @@ class RLock(threading._RLock):
lock = RLock() lock = RLock()
login_semaphore = threading.Semaphore(2)
def playwright_like(cookies, target_url): def playwright_like(cookies, target_url):
@@ -856,12 +868,14 @@ def playwright_like(cookies, target_url):
context = browser.new_context(no_viewport=True) context = browser.new_context(no_viewport=True)
context.add_cookies(parse_cookies(cookies)) context.add_cookies(parse_cookies(cookies))
page = context.new_page() page = context.new_page()
url = 'https://facebook.com'
try:
page.goto(url)
time.sleep(random.randint(3, 10))
check_account_status(page, parse_cookies(cookies)) check_account_status(page, parse_cookies(cookies))
url = 'https://facebook.com'
try:
page.goto(url)
time.sleep(random.randint(3, 10))
if 'permalink.php?story_fbid' in target_url or '/posts/' in target_url: if 'permalink.php?story_fbid' in target_url or '/posts/' in target_url:
# 文字或图片类型 # 文字或图片类型
button_xpath = '//div[@class="__fb-light-mode x1n2onr6 x1vjfegm"]//span[@data-ad-rendering-role="like_button"]' button_xpath = '//div[@class="__fb-light-mode x1n2onr6 x1vjfegm"]//span[@data-ad-rendering-role="like_button"]'
@@ -917,11 +931,13 @@ def playwright_post(cookies, content, image_key=None):
context = browser.new_context(no_viewport=True) context = browser.new_context(no_viewport=True)
context.add_cookies(parse_cookies(cookies)) context.add_cookies(parse_cookies(cookies))
page = context.new_page() page = context.new_page()
check_account_status(page, parse_cookies(cookies))
url = 'https://facebook.com' url = 'https://facebook.com'
try: try:
page.goto(url) page.goto(url)
time.sleep(random.randint(3, 10)) time.sleep(random.randint(3, 10))
check_account_status(page, parse_cookies(cookies))
time.sleep(5) time.sleep(5)
if image_key: if image_key:
@@ -973,14 +989,11 @@ def playwright_comment(cookies, target_url, content, image_key=None):
context = browser.new_context(no_viewport=True) context = browser.new_context(no_viewport=True)
context.add_cookies(parse_cookies(cookies)) context.add_cookies(parse_cookies(cookies))
page = context.new_page() page = context.new_page()
url = 'https://facebook.com'
try:
retry_goto(page, url)
time.sleep(random.randint(3, 10))
check_account_status(page, parse_cookies(cookies))
time.sleep(5)
page.goto(target_url) check_account_status(page, parse_cookies(cookies))
try:
retry_goto(page, target_url)
sleep(1, 2) sleep(1, 2)
if 'permalink.php?story_fbid' in target_url or '/posts/' in target_url or "/permalink/" in target_url: if 'permalink.php?story_fbid' in target_url or '/posts/' in target_url or "/permalink/" in target_url:
@@ -1038,7 +1051,7 @@ def playwright_comment(cookies, target_url, content, image_key=None):
def playwright_get_user_profile(cookies, username=None): def playwright_get_user_profile(cookies, username=None):
path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe') path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe')
with lock: with login_semaphore:
with sync_playwright() as playwright: with sync_playwright() as playwright:
update_windows_distinguish() update_windows_distinguish()
browser = playwright.chromium.launch( browser = playwright.chromium.launch(
@@ -1047,13 +1060,14 @@ def playwright_get_user_profile(cookies, username=None):
context = browser.new_context(no_viewport=True) context = browser.new_context(no_viewport=True)
context.add_cookies(parse_cookies(cookies)) context.add_cookies(parse_cookies(cookies))
page = context.new_page() page = context.new_page()
url = 'https://facebook.com'
try:
page.goto(url)
time.sleep(random.randint(3, 10))
check_account_status(page, parse_cookies(cookies)) check_account_status(page, parse_cookies(cookies))
url = 'https://facebook.com'
try:
retry_goto(page, url)
time.sleep(random.randint(3, 10))
profile_pic_url = page.locator( profile_pic_url = page.locator(
'//div[@aria-label="Shortcuts"]//li[1]//*[@preserveAspectRatio="xMidYMid slice"]').get_attribute( '//div[@aria-label="Shortcuts"]//li[1]//*[@preserveAspectRatio="xMidYMid slice"]').get_attribute(
'xlink:href') 'xlink:href')
@@ -1094,13 +1108,10 @@ def playwright_set_user_profile(cookies, username=None, first_name=None, last_na
context = browser.new_context(no_viewport=True) context = browser.new_context(no_viewport=True)
context.add_cookies(parse_cookies(cookies)) context.add_cookies(parse_cookies(cookies))
page = context.new_page() page = context.new_page()
url = 'https://www.facebook.com'
try:
page.goto(url)
check_account_status(page, parse_cookies(cookies)) check_account_status(page, parse_cookies(cookies))
try:
url = 'https://accountscenter.facebook.com/?entry_point=app_settings' url = 'https://accountscenter.facebook.com/?entry_point=app_settings'
page.goto(url) retry_goto(page, url)
page.locator('//div[@role="list"]/div').first.click() page.locator('//div[@role="list"]/div').first.click()
if username: if username:
@@ -1148,7 +1159,7 @@ def playwright_set_user_profile(cookies, username=None, first_name=None, last_na
def playwright_check_account_cookies(cookies): def playwright_check_account_cookies(cookies):
path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe') path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe')
with lock: with login_semaphore:
with sync_playwright() as playwright: with sync_playwright() as playwright:
update_windows_distinguish() update_windows_distinguish()
browser = playwright.chromium.launch( browser = playwright.chromium.launch(
@@ -1157,10 +1168,8 @@ def playwright_check_account_cookies(cookies):
context = browser.new_context(no_viewport=True) context = browser.new_context(no_viewport=True)
context.add_cookies(parse_cookies(cookies)) context.add_cookies(parse_cookies(cookies))
page = context.new_page() page = context.new_page()
url = 'https://www.facebook.com'
page.goto(url)
time.sleep(3)
check_account_status(page, parse_cookies(cookies)) check_account_status(page, parse_cookies(cookies))
context.close() context.close()
browser.close() browser.close()
return {} return {}
@@ -1224,7 +1233,7 @@ def playwright_login(username, password, code_2fa=None):
check_freeze_account(username) check_freeze_account(username)
path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe') path = os.path.join(BASE_PATH, 'chrome', '130-0008', 'chrome.exe')
with lock: with login_semaphore:
with sync_playwright() as playwright: with sync_playwright() as playwright:
update_windows_distinguish() update_windows_distinguish()
browser = playwright.chromium.launch( browser = playwright.chromium.launch(