import time
from threading import Thread
import pygame
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# --------------------本次思路是-------------------------------
# 1.先寻找新的消息数量找到就报警
# 2.找到后鼠标移动过去
# 3.在出现的聊天框里面再次寻找出现的新的消息数量,并点击
# 4.找到文本框元素并输入文本,最后点击发送
# 此项pass--不可使用留待以后学习更多知识之后看下能否完善
# --------------------------------------------------------------
# 设置浏览器的用户数据目录
chrome_options = Options()
chrome_options.add_argument(
"--user-data-dir=C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default")
# 初始化 Chrome 浏览器
# 创建全局变量 driver
driver = webdriver.Chrome(options=chrome_options)
def wait_for_inputs():
while not entry1.get() or not entry2.get():
root.update_idletasks() # 更新界面
# 用于等待的函数
def wait_for_element(driver0, xpath, timeout=30):
try:
element = WebDriverWait(driver, timeout).until(
ec.presence_of_element_located((By.XPATH, xpath))
)
return element
except TimeoutException:
return None
def open_chrome():
wait_for_inputs() # 等待用户输入
driver.get("https://www.douyin.com/user/self?showTab=post") # 请将此处的网址替换为你要跳转的实际网址
# time.sleep(40)
def run_code():
"""
执行具体的操作
"""
current_cycle = 0 # 初始化当前循环次数为 0
for _ in range(int(entry2.get())):
# 在循环中使用
current_cycle += 1 # 在每次循环开始前增加循环次数
root.title(f"抖音监控私信 - 第 {current_cycle} 次循环") # 更新标题
if current_cycle == int(entry2.get()):
root.title("当前循环结束")
try:
# element = wait_for_element(driver,
# "/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
# "2]/div/pace-island/div/ul[2]/div/li/div/div/div[3]/div/div/div[1]/div/div["
# "2]/div/div[1]/div/div/div[3]/div")
# 登录成功后的页面直接查询等待是否有新的信息出现
element = wait_for_element(driver,
"/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
"2]/div/pace-island/div/ul[2]/div/li/div/div/div[2]/div")
if element: # 如果出现新的信息
# 元素找到,执行操作
value = element.text
print("元素的值:", value)
# 在窗口上显示信息
print("出现新的信息,开始执行警报")
# 初始化 pygame 的混音器
pygame.mixer.init()
# 加载声音文件
sound = pygame.mixer.Sound("D:/mp3/XX.wav")
# 播放声音
sound.play()
pygame.time.wait(2000) # 等待 2 秒
# 停止音乐
pygame.mixer.music.stop()
tk_label.config(text="注意有新的信息出现,请及时查看")
tk_label.after(10000, lambda: tk_label.config(text=""))
# 将鼠标移动到元素位置并点击
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
# 查找点击信息后在聊天框出现的信息,这个是一定会找到的
element = wait_for_element(driver,
"/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
"2]/div/pace-island/div/ul[2]/div/li/div/div/div[3]/div/div/div[1]/div/div["
"2]/div/div[1]/div/div/div[3]/div")
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
# 找到文本框 进行输入 文本后面+\n 这个功能不好,容易发送失败
text_block = driver.find_element(By.CLASS_NAME, "public-DraftStyleDefault-block")
text_block.send_keys(
"你好,世界")
element0 = driver.find_element(By.CLASS_NAME, "sCp7KhBv.e2e-send-msg-btn")
print("准备进行点击发送按钮")
# 执行鼠标点击操作
element0.click()
# 点击退出会话
element2 = driver.find_element(By.CLASS_NAME, "F2qAlnLO")
element2.click()
# # 等待用户输入的间隔时间
time.sleep(int(entry1.get()))
else:
# 元素未找到,处理情况
print("暂时没有新的消息,跳过")
tk_label.config(text="暂时没有新的消息,跳过")
tk_label.after(5000, lambda: tk_label.config(text=""))
except NoSuchElementException as e:
print(f"找不到元素:{e}")
def thread_runner():
"""
在新线程中运行 run_code 函数
"""
Thread(target=run_code).start()
root = Tk()
root.title("抖音监控私信")
root.geometry("250x110") # 设置窗口大小为 300x100
tk_label = Label(root, text="结果展示", width=30, bd=10, bg="yellow")
tk_label.pack(pady=3)
# 创建第一个输入框和其上方的文字标签
label1 = Label(root, text="间隔时间:")
label1.pack()
label1.place(x=0, y=50)
entry1 = Entry(root, width=8)
entry1.pack()
entry1.place(x=60, y=50)
# 创建第二个输入框和其上方的文字标签
label2 = Label(root, text="循环次数:")
label2.pack()
label2.place(x=0, y=80)
entry2 = Entry(root, width=8)
entry2.pack()
entry2.place(x=60, y=80)
# 设置按钮的函数
def set_buttons():
button2 = Button(root, text="登录", width=5, command=open_chrome)
button2.pack(pady=10)
button2.place(x=135, y=60)
button = Button(root, text="运行", width=5, command=thread_runner)
button.pack(pady=10)
button.place(x=195, y=60)
set_buttons()
root.mainloop()
[color=]2024-4-16 更新处理陌生人消息并回关陌生人,有不足的地方欢迎各位大佬指点
[Python] 纯文本查看 复制代码from tkinter import Tk, Label, Entry, Button
import time
from threading import Thread
import pygame
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# --------------------本次思路是针对陌生人消息不显示私信数量的问题进行改进-------------------------------
# 1.先寻找私信图标,
# 2.找到后鼠标移动过去
# 方法一:
# 1.在出现的聊天框里面先寻找出现的新的消息数量,并点击
# 2.找到文本框元素并输入文本,最后点击发送
# 3.再下一轮寻找中如果没有新的私信信息 那就找陌生人消息
# 4.找到就点击一下 然后再发送文本
# 5.回关好友,再返回到聊天框
# 此项pass--不可使用留待以后学习更多知识之后看下能否完善
# --------------------------------------------------------------
# 设置浏览器的用户数据目录
chrome_options = Options()
chrome_options.add_argument(
"--user-data-dir=C:\\Users\\Administrator\\AppData\\Local\\Google\\Chrome\\User Data\\Default")
# 初始化 Chrome 浏览器
# 创建全局变量 driver
driver = webdriver.Chrome(options=chrome_options)
def wait_for_inputs():
while not entry1.get() or not entry2.get():
root.update_idletasks() # 更新界面
# 用于等待的函数
def wait_for_element(driver0, xpath, timeout=10):
try:
element = WebDriverWait(driver, timeout).until(
ec.presence_of_element_located((By.XPATH, xpath))
)
return element
except TimeoutException:
return None
def open_chrome():
wait_for_inputs() # 等待用户输入
driver.get("https://www.douyin.com/user/self?showTab=post") # 请将此处的网址替换为你要跳转的实际网址
# time.sleep(40)
def run_code():
"""
执行具体的操作
"""
current_cycle = 0 # 初始化当前循环次数为 0
for _ in range(int(entry2.get())):
# 在循环中使用
current_cycle += 1 # 在每次循环开始前增加循环次数
root.title(f"抖音监控私信 - 第 {current_cycle} 次循环") # 更新标题
if current_cycle == int(entry2.get()):
root.title("当前循环结束")
try:
# 登录成功后的页面直接查询等待是否有新的信息出现
element = wait_for_element(driver,
"/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
"2]/div/pace-island/div/ul[2]/div/li/div/div/div[2]/div")
if element: # 如果出现新的信息 元素找到,执行操作
value = element.text
print("元素的值:", value)
# 在窗口上显示信息
print("出现新的信息,开始执行警报")
# 初始化 pygame 的混音器
pygame.mixer.init()
# 加载声音文件
sound = pygame.mixer.Sound("D:/mp3/XX.wav")
# 播放声音
sound.play()
pygame.time.wait(2000) # 等待 2 秒
# 停止音乐
pygame.mixer.music.stop()
tk_label.config(text="注意有新的信息出现,请及时查看")
tk_label.after(10000, lambda: tk_label.config(text=""))
# 将鼠标移动到元素位置并点击
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
# 查找点击信息后在聊天框出现的信息,这个是一定会找到的
element = wait_for_element(driver,
"/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
"2]/div/pace-island/div/ul[2]/div/li/div/div/div[3]/div/div/div[1]/div/div["
"2]/div/div[1]/div/div/div[3]/div")
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
# 找到文本框 进行输入 文本后面+\n 这个功能不好,容易发送失败
text_block = driver.find_element(By.CLASS_NAME, "public-DraftStyleDefault-block")
text_block.send_keys(
"你好,详看个人资料")
element0 = driver.find_element(By.CLASS_NAME, "sCp7KhBv.e2e-send-msg-btn")
print("准备进行点击发送按钮")
# 执行鼠标点击操作
element0.click()
# 点击退出会话
element2 = driver.find_element(By.CLASS_NAME, "F2qAlnLO")
element2.click()
# # 等待用户输入的间隔时间
time.sleep(int(entry1.get()))
else:
# 元素未找到,处理情况
print("暂时没有新的私信数量消息,开始执行查找是否有新的陌生人消息")
element = wait_for_element(driver,
"//p[contains(text(), '私信')]")
if element: # 如果找到私信图标
# 元素找到,执行操作
print("找到私信图片,鼠标即将移动点击")
# 将鼠标移动到元素位置并点击
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
time.sleep(2)
# 查看是否有陌生人新的消息
# element = wait_for_element(driver,
# "/html/body/div[2]/div/div[3]/div[1]/div[1]/header/div/div/div["
# "2]/div/pace-island/div/ul[2]/div/li/div/div/div[3]/div/div/div["
# "1]/div/div[2]/div/div[4]/div/div/div[1]/div")
element = driver.find_element(By.CLASS_NAME, "TQyd2bgK") # TQyd2bgK陌生人图标元素
if element:
print("找到陌生人图标,开始点击")
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
time.sleep(5)
# tJjNB1rt ge6Vyp_V 陌生人消息数量元素
# //*[@id="island_b69f5"]/div/ul[2]/div/li/div/div/div[3]/div/div/div[1]/div/div[1]/div[1]
# JkInzlFQ 这个是陌生人返回按钮元素 上面的也是
element = driver.find_element(By.CLASS_NAME, "tJjNB1rt.ge6Vyp_V") # tJjNB1rt ge6Vyp_V 陌生人消息数量元素
if element:
print("出现新的陌生人信息,开始执行警报")
# 初始化 pygame 的混音器
pygame.mixer.init()
# 加载声音文件
sound = pygame.mixer.Sound("D:/mp3/XX.wav")
# 播放声音
sound.play()
pygame.time.wait(2000) # 等待 2 秒
# 停止音乐
pygame.mixer.music.stop()
tk_label.config(text="注意有新的陌生人信息出现,请及时查看")
tk_label.after(10000, lambda: tk_label.config(text=""))
# 将鼠标移动到元素位置并点击
print("开始点击陌生人消息")
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
# 找到文本框 进行输入 文本后面+\n 这个功能不好,容易发送失败
text_block = driver.find_element(By.CLASS_NAME, "public-DraftStyleDefault-block")
text_block.send_keys(
"你好,详看个人资料")
element0 = driver.find_element(By.CLASS_NAME, "sCp7KhBv.e2e-send-msg-btn")
print("准备进行点击发送按钮")
# 执行鼠标点击操作
element0.click()
# SHV6n6VV 回关元素
print("准备点击回关钮")
element = driver.find_element(By.CLASS_NAME, "SHV6n6VV") # SHV6n6VV 这个是陌生人回关按钮元素
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
time.sleep(5)
print("操作完成,开始返回到正常聊天列表")
element = driver.find_element(By.CLASS_NAME, 'JkInzlFQ') # JkInzlFQ 这个是陌生人返回按钮元素
print("开始点击返回按钮")
action = webdriver.ActionChains(driver)
action.move_to_element(element).click().perform()
else:
print("暂时没有陌生人的消息,跳过")
tk_label.config(text="暂时没有陌生人的消息,跳过")
tk_label.after(5000, lambda: tk_label.config(text=""))
except NoSuchElementException as e:
print(f"找不到元素:{e}")
def thread_runner():
"""
在新线程中运行 run_code 函数
"""
Thread(target=run_code).start()
root = Tk()
root.title("抖音监控私信")
root.geometry("250x110") # 设置窗口大小为 300x100
tk_label = Label(root, text="结果展示", width=30, bd=10, bg="yellow")
tk_label.pack(pady=3)
# 创建第一个输入框和其上方的文字标签
label1 = Label(root, text="间隔时间:")
label1.pack()
label1.place(x=0, y=50)
entry1 = Entry(root, width=8)
entry1.pack()
entry1.place(x=60, y=50)
# 创建第二个输入框和其上方的文字标签
label2 = Label(root, text="循环次数:")
label2.pack()
label2.place(x=0, y=80)
entry2 = Entry(root, width=8)
entry2.pack()
entry2.place(x=60, y=80)
# 设置按钮的函数
def set_buttons():
button2 = Button(root, text="登录", width=5, command=open_chrome)
button2.pack(pady=10)
button2.place(x=135, y=60)
button = Button(root, text="运行", width=5, command=thread_runner)
button.pack(pady=10)
button.place(x=195, y=60)
set_buttons()
root.mainloop()