Air-ban / Air-ban.github.io

0 stars 0 forks source link

自动校园墙机器人开发记录——其之一 #7

Open Air-ban opened 1 month ago

Air-ban commented 1 month ago

前言

最近,发现各种奇怪的事件都发在校园墙上了,但是这些校园墙大多数都是个人运营,无法确保信息安全以及公平公正,这几天看到两个人在墙上撕逼,很明显墙主(运营校园墙账号的人)有明显的偏袒迹象,所以打算开发一个绝对公正且尽可能不会泄露隐私的校园墙机器人

开发历程

刚开始,我是很直接的面向Google编程,确实找到了合适的脚本,但是吧,总感觉差点意思,因为只可以发文字,而且代码似乎还有些过时,以下是修改好后可以直接用的代码,但是只可以用于发送文字

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 1. 打开网站,窗口最大化
driver = webdriver.Chrome()
driver.get('https://i.qq.com/')
driver.maximize_window()

# 点击登录
try:
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it('login_frame'))
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="img_out_此处填写QQ号"]'))).click()
    driver.switch_to.default_content()
except Exception as e:
    print(f"An error occurred while trying to log in: {e}")
    driver.quit()

# 点击说说
try:
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="menuContainer"]/div/ul/li[5]/a'))).click()
except Exception as e:
    print(f"An error occurred while trying to click on 'Shuoshuo': {e}")
    driver.quit()

# 切换框架
try:
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe.app_canvas_frame')))
    driver.switch_to.frame(element)
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, '$1_substitutor_content'))).click()
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, '$1_content_content'))).send_keys('自动化测试')
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, '发表'))).click()
except Exception as e:
    print(f"An error occurred while trying to post a status update: {e}")
    driver.quit()

# 检查一下
# Add any necessary checks here, or simply wait for a certain amount of time to see the result
time.sleep(10)

# Remember to close the driver after you're done
driver.quit()

但使用这个脚本,需要电脑上已经登陆QQ的前提下,而且需要确保网络畅通,有没有什么更好的办法呢?因为我需要发送图片,单纯的文字已经无法满足我啦,但QQ发送图片需要重定向到资源管理器中选择图片,难办,那就使用框架自动进行点击操作吧,简单写个python脚本,来获取鼠标的位置信息

from pynput import mouse

# 定义一个函数来处理鼠标点击事件
def on_click(x, y, button, pressed):
    if pressed:
        print(f"Mouse clicked at ({x}, {y}) with button {button}")

# 创建鼠标监听器
with mouse.Listener(on_click=on_click) as listener:
    listener.join()

这个脚本会实时记录你鼠标当前点击的位置坐标,并返回到控制台,本来打算写个log记录的,但是后来来想想,直接复制粘贴也不是不行,于是乎,通过断点,进行图片上传操作,并且记录坐标,在上面的自动发送文字说说脚本中加入了自动发送图片的点击程序,至此,完整的程序如下

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pyautogui
import time
from datetime import datetime

# 获取当前系统时间并格式化为字符串
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

qq_number = input("请输入您的QQ号:")

driver = webdriver.Chrome()
driver.get('https://i.qq.com/')
driver.maximize_window()

try:
    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it('login_frame'))
    qq_login_button_xpath = f'//*[@id="img_out_{qq_number}"]'
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, qq_login_button_xpath))).click()
    driver.switch_to.default_content()
except Exception as e:
    print(f"An error occurred while trying to log in: {e}")
    driver.quit()

try:
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="menuContainer"]/div/ul/li[5]/a'))).click()
except Exception as e:
    print(f"An error occurred while trying to click on 'Shuoshuo': {e}")
    driver.quit()

try:
    element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe.app_canvas_frame')))
    driver.switch_to.frame(element) #此句代码后进入编辑器
    time.sleep(2)
    pyautogui.click(1070, 597) #相册
    time.sleep(1)
    pyautogui.click(1066, 658) #本地
    time.sleep(2)
    pyautogui.click(902, 254)
    pyautogui.click(902, 254)
    time.sleep(1)
    pyautogui.click(893, 168)
    pyautogui.click(893, 168)
    time.sleep(2)
    pyautogui.click(225, 185)
    pyautogui.click(814, 501)
    time.sleep(2)
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, '$1_substitutor_content'))).click()
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, '$1_content_content'))).send_keys(current_time + '更新')
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, '发表'))).click()
except Exception as e:
    print(f"An error occurred while trying to post a status update: {e}")
    driver.quit()

time.sleep(3)
driver.quit()

为了确保定时发送,还写了个定时程序,和主程序是分开的,因为再写进去,感觉过于混乱了,定时程序如下:

import os
import time
# 指定时间
target_time = time.time() + 5  # 5秒后执行

# 无限循环,等待到达指定时间
while True:
    current_time = time.time()
    if current_time >= target_time:
        # 到达指定时间,执行任务
        print("到达指定时间,开始执行任务")
        os.startfile("release.exe")
        break
    else:
        # 等待到达指定时间
        time.sleep(1)

当然,感觉给这个东西最外面加个while True是个不错的选择,但是,我是懒狗,接下来,需要获得素材,并且做到定点上传,素材将以图片的形式直接放在我的电脑文件夹中,通过上文的鼠标模拟点击来实现,至此,差不多是完成了,接下来只需要架设到服务器上即可

一些小感想

本人对于各种校内外八卦并无多少兴趣,开发这个脚本也纯粹是一时兴起,我并不感觉这玩意有什么实质性价值,但是,开发出来确实是会给人以成就感,当然,我在3h内完成了这些的开发,并且在1h写完这篇blog

现在校内的各种事件层出不穷,尤其是在一些规模较大的学校,但很明显,这些校外的校园墙或者论坛不是老师可以干涉的地方,老师们通常只擅长教书育人,对于信息技术并没有过多的了解,但希望有朝一日,学生们可以摆脱由于校外环境导致的情绪异常,不被无意义的言论攻击

共勉

挖坑

你不是说要保障私密吗?怎么保障?

这里本人大致思想是使用PGP签名,让程序自己生成密钥,我不会获取密钥,让程序之间互相完成加解密,我作为开发者,服务器拥有者,无法查看具体内容,并且在完成对于指定投稿者的内容获取和加密后,自动删除原文,只保留加密后的副本,以减少信息泄露所带来的影响,不过那都是后话了,说不定会在一周内爆肝出来?我不知道,再说吧

Air-ban commented 1 month ago

清楚的知道自己的东西是服务于那群人,所以不会去写一个校园论坛,因为感觉属实是挺傻逼的,一天到晚一群人围着一个傻逼问题吵来吵去,没有什么新意,甚至连问题都没什么新意,无非就是故事主角换个名字,故事换汤不换药,做这个的目的,只是想让他们见识以下,校园墙的匿名性,安全性,准时性,也让他们自己看看做的是什么狗屎