WechatMoments/helper/auto_scroll_single.py
2024-03-28 23:04:06 +08:00

200 lines
6.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import math
import threading
import time
import traceback
import pyautogui
import pyperclip
import win32con
import win32gui
from retry import retry
from win32api import GetSystemMetrics
import log
class AutoScrollSingle(threading.Thread):
def __init__(self, gui, search_hwnd, friend_name):
self.gui = gui
self.search_hwnd = search_hwnd
self.friend_name = friend_name
self.scrolling = False
self.resolutions = ['', '1920', '1600', '2560_125', '2560_175', '2560_100', '1366']
super().__init__()
@retry(tries=5, delay=2)
def find_moments_tab(self):
result = None
for resolution in self.resolutions:
try:
result = pyautogui.locateCenterOnScreen(f'resource/auto_gui/{resolution}/moments_tab.png',
grayscale=True, confidence=0.8)
break
except Exception as e:
log.LOG.warn("Can't find_moments_tab in resolution: " + resolution)
pass
if result is None:
raise Exception("Can 't find_moments_tab")
return result
@retry(tries=5, delay=2)
def find_search_button(self):
element = None
for resolution in self.resolutions:
try:
element = pyautogui.locateOnScreen(f'resource/auto_gui/{resolution}/search_button.png',
grayscale=True, confidence=0.8)
break
except Exception as e:
log.LOG.warn("Can't find_moments_tab in resolution: " + resolution)
pass
if element is None:
raise Exception("Can 't search_button")
return element
@retry(tries=5, delay=2)
def find_friends(self):
result = None
for resolution in self.resolutions:
try:
result = pyautogui.locateCenterOnScreen(f'resource/auto_gui/{resolution}/friends.png',
grayscale=True, confidence=0.8)
break
except Exception as e:
log.LOG.warn("Can't find_friends in resolution: " + resolution)
pass
if result is None:
raise Exception("Can 't find_friends")
return result
@retry(tries=5, delay=2)
def find_complete(self):
result = None
for resolution in self.resolutions:
try:
result = pyautogui.locateCenterOnScreen(f'resource/auto_gui/{resolution}/complete.png',
grayscale=True, confidence=0.8)
break
except Exception as e:
log.LOG.warn("Can't find_complete in resolution: " + resolution)
pass
if result is None:
raise Exception("Can 't find_complete")
return result
def run(self) -> None:
self.scrolling = True
try:
search_hwnd = win32gui.FindWindow('Chrome_WidgetWin_0', '微信')
wechat_hwnd = win32gui.FindWindow('WeChatMainWndForPC', '微信')
# 先把微信主窗口放置前台
win32gui.SetForegroundWindow(wechat_hwnd)
win32gui.ShowWindow(wechat_hwnd, win32con.SW_SHOWNORMAL)
win32gui.SetWindowPos(wechat_hwnd, None, 100, 100, 0, 0, win32con.SWP_NOSIZE)
time.sleep(0.3)
# 先把搜一搜窗口放前台
win32gui.SetForegroundWindow(search_hwnd)
win32gui.ShowWindow(search_hwnd, win32con.SW_SHOWNORMAL)
win32gui.SetWindowPos(search_hwnd, None, 50, 50, 0, 0, win32con.SWP_NOSIZE)
# 点击朋友圈三个字
x, y = self.find_moments_tab()
pyautogui.click(x, y)
time.sleep(0.1)
# 点击搜索按钮左侧
element = self.find_search_button()
pyautogui.click(element.left - 100, element.top + element.height / 2)
time.sleep(0.25)
# 输入字符
pyautogui.write('1')
time.sleep(0.25)
# 搜索
pyautogui.click(element.left + element.width / 2, element.top + element.height / 2)
time.sleep(1.5)
# 展开朋友
x, y = self.find_friends()
pyautogui.click(x, y)
time.sleep(0.5)
# 搜索好友
pyperclip.copy(self.friend_name)
time.sleep(0.25)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.5)
# 回车
pyautogui.press('enter')
time.sleep(0.5)
# 点击完成
x, y = self.find_complete()
pyautogui.click(x, y)
time.sleep(0.25)
# 点击搜索按钮左侧
element = self.find_search_button()
pyautogui.click(element.left - 100, element.top + element.height / 2)
time.sleep(0.25)
pyautogui.press('backspace')
time.sleep(0.1)
pyautogui.press('backspace')
time.sleep(0.25)
pyperclip.copy('')
time.sleep(0.25)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.25)
element = self.find_search_button()
pyautogui.click(element.left + element.width / 2, element.top + element.height / 2)
time.sleep(1.0)
while self.scrolling:
element = self.find_search_button()
right_bottom = (element.left + element.width, element.top + element.height + 300)
pyautogui.scroll(-120)
pyautogui.click(right_bottom)
time.sleep(0.2)
search_hwnd = win32gui.FindWindow('Chrome_WidgetWin_0', '微信')
moments_hwnd = win32gui.FindWindow('SnsWnd', '朋友圈')
if search_hwnd and moments_hwnd:
# 调整位置朋友圈不要遮挡
width = GetSystemMetrics(0)
win32gui.SetWindowPos(moments_hwnd, None, 50, 50, 0, 0, win32con.SWP_NOSIZE)
win32gui.SetWindowPos(search_hwnd, None, 50, 50, 0, 0, win32con.SWP_NOSIZE)
except Exception:
traceback.print_exc()
def set_scrolling(self, scrolling: bool) -> None:
self.scrolling = scrolling
if not self.scrolling:
self.gui.working_note.pack_forget()
if self.scrolling and self.gui.working_note:
self.gui.working_note.pack()