如何用Selenium实现Telegram群组最新消息自动选择与跳转?
解决方案
问题分析
你之前用By.CLASS_NAME定位失败,核心原因是"text-content with-meta"是两个类名,By.CLASS_NAME仅支持传入单个类名,多类名场景需要用CSS选择器(.text-content.with-meta)或XPATH定位。
关于通过递增message ID定位最新消息的方法,完全可行,但要注意Telegram消息ID可能存在不连续情况(比如删除消息后),因此更稳妥的思路是结合两种方案:要么基于当前最大ID递增查找,要么直接定位消息列表的最后一个元素(最新消息)。
方法一:通过递增message ID定位最新消息
实现步骤
- 首次运行时,提取当前所有消息的ID数字,取最大值作为初始ID。
- 每次循环递增ID,尝试定位新消息,捕获
NoSuchElementException避免因ID不连续报错。 - 找到新消息后,跳转目标页面再返回Telegram群组继续检测。
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException import time driver = webdriver.Chrome() driver.get("你的Telegram群组页面URL") time.sleep(5) # 等待页面加载完成 # 获取当前最大消息ID def get_last_message_id(): message_elements = driver.find_elements(By.XPATH, '//*[starts-with(@id, "message")]') if not message_elements: return 0 ids = [int(el.get_attribute("id").replace("message", "")) for el in message_elements] return max(ids) last_id = get_last_message_id() while True: current_id = last_id + 1 try: # 构造新消息的XPATH message_xpath = f'//*[@id="message{current_id}"]/div[3]/div/div[1]/div' message = driver.find_element(By.XPATH, message_xpath) message_text = message.text.strip() # 跳转目标页面 driver.get(f"https://key-drop.com/en/?code={message_text}") time.sleep(5) # 返回Telegram群组页面 driver.back() time.sleep(3) # 更新最新消息ID last_id = current_id except NoSuchElementException: # 未找到新消息,等待后重试 time.sleep(2) continue
方法二:直接定位最新消息(更可靠)
不依赖消息ID,直接通过消息列表顺序定位最后一个元素(最新消息),这种方法不受ID不连续影响,稳定性更高。
代码示例
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get("你的Telegram群组页面URL") time.sleep(5) # 记录上一次处理的消息内容,避免重复跳转 last_processed_text = "" while True: # 获取所有消息文本元素(根据你的HTML结构调整选择器) message_elements = driver.find_elements(By.CSS_SELECTOR, '.text-content.with-meta') if not message_elements: time.sleep(2) continue # 取最后一个元素即为最新消息 latest_message = message_elements[-1] current_text = latest_message.text.strip() # 仅处理未见过的非空消息 if current_text != last_processed_text and current_text: last_processed_text = current_text driver.get(f"https://key-drop.com/en/?code={current_text}") time.sleep(5) driver.back() time.sleep(3) else: time.sleep(2)
注意事项
- 确保Telegram页面处于登录状态,且群组消息已完全加载。
- Telegram页面元素结构可能随版本更新变化,需定期验证选择器有效性。
- 频繁操作可能触发反机器人机制,建议适当延长等待时间,避免账号受限。
内容的提问来源于stack exchange,提问作者JakobReal
相关产品推荐
相关产品推荐

