[Python & Selenium & Nonebot]实现QQ机器人每日自动健康系统上报/打卡

  • 效果截图:
    [Python & Selenium & Nonebot]实现QQ机器人每日自动健康系统上报/打卡_第1张图片
  • 一次上报/打卡脚本源码:
from selenium import webdriver
from lxml import html
from PIL import Image
from selenium.webdriver.support.select import Select
import requests
import re
import urllib
import time
import cv2
import pytesseract
import socket



Image_Name = r'C:\Health_Infor\Img.png'
USER = ''
KEY  = ''
PHONE = ''

class STATIC_VAL(object):
    LOG_FLAG  = False
    SUCC_FLAG = True
    N = 0

def USER_WARNING():
    print('此程序宜在PC端联网不间断后台运行,以便达到每日自动填写的目的!有服务器的同学,也可以将它部署在服务器端。\n')
    print('此程序会在C:\Health_Infor\目录下创建Img.png文件夹用于储存验证码文件。无其他获取用户信息等行为,请放心使用!\n')
    print('以下信息请如实填写!一次填写终身受益!如无法登录请检查密码是否正确!\n')
    print('如身体有情况,请自觉关闭本软件,前往官网手动填报。由于个人填写的虚假信息造成损失作者不负任何责任!!!\n')
    print('如遇其他问题请QQ联系:[email protected] [注明来意!]\n')
    input('同意以上条件请按ENTER继续;如不同意,请尽快退出并删除此程序!!!\n')


def SATRT():
    driver = webdriver.Edge("C:\Program Files (x86)\Microsoft\Edge\Application\msedgedriver.exe")
    driver.get("")
    while(not STATIC_VAL.LOG_FLAG):
        #driver.find_element_by_id("StudentId").clear()
        #driver.find_element_by_id("Name").clear()
        #driver.find_element_by_id("codeInput").clear()
        #用户名密码
        driver.find_element_by_id("StudentId").send_keys(USER)
        driver.find_element_by_id("Name").send_keys(KEY)
        #设置浏览器界面大小
        driver.set_window_size(1280,720) 
        #图片处理
        driver.save_screenshot(Image_Name)
        im = Image.open(Image_Name)
        im = im.crop((930, 340, 1010, 367))
        im.save(Image_Name)   
        #处理验证码
        text = pytesseract.image_to_string(Image_Name,lang = 'eng')
        list = text.split() 
        text = "".join(list)
        driver.find_element_by_id("codeInput").send_keys(text)
        #登录
        driver.find_element_by_id("Submit").click()
        if re.search('ChooseSys',driver.current_url):
            STATIC_VAL.LOG_FLAG = True
        else:
            driver.refresh()
            STATIC_VAL.LOG_FLAG = False
        time.sleep(0.5)
    #进入
    driver.find_element_by_class_name('plat-title').click()
    time.sleep(0.5)
    #判断当前页面状态
    try:
        #提交成功
        driver.find_element_by_class_name("layui-m-layerbtn")
        STATIC_VAL.SUCC_FLAG = False
    except:
        STATIC_VAL.SUCC_FLAG = True 
    while (STATIC_VAL.SUCC_FLAG):
        #处理下拉菜单元素
        Select(driver.find_element_by_name('County')).select_by_value('210106')
        #我已阅读...
        driver.find_element_by_id("ckCLS").click()
        #提交按钮
        driver.find_element_by_class_name("save_form").click()
        time.sleep(0.5)
        #判断当前页面状态
        try:
            #提交成功
            driver.find_element_by_class_name("layui-m-layerbtn")
            STATIC_VAL.SUCC_FLAG = False
        except:
            STATIC_VAL.SUCC_FLAG = True    
    driver.quit()
    #清除标志位
    STATIC_VAL.LOG_FLAG = False

if __name__ == "__main__":
    SATRT()


代码讲解看:https://www.bilibili.com/video/BV1cv411B7CB
注:如需实用,代码有很多需要读者自行修改的地方(包括填报网址、个人信息、填报网页内部信息等等)。详情见上方视频链接。

  • 一次打卡看完,我们来看看怎么在机器人内部调用。

原理就是每天的凌晨一点(其他时间也行,自行修改),运行上述脚本,直到出现该有的界面”健康信息填写完成!“,则判断为打卡完成。否则一直重试运行脚本。
代码:

#定时任务-健康信息\清理垃圾
@nonebot.scheduler.scheduled_job('cron', hour = 0,minute = 14)
async def _3():
    bot = nonebot.get_bot()
    isOK = isNetOK(('www.baidu.com',443))
    #健康信息
    while(STATIC_VAL.HEALTHYFLAG):
        if isOK and os.system('H:\VS_Py\Proj_Boswer\Boswer\Boswer\Healthy.py') == 0:
            await bot.send_group_msg(group_id = 77*****838,message = '健康信息打卡已自动帮您填写完成![CQ:at,qq = 125*****091]')
            STATIC_VAL.HEALTHYFLAG = False
        else:
            await bot.send_group_msg(group_id = 77******838,message = '健康信息打卡有些问题,正在为您重试中...[CQ:at,qq = 125******91]')
            STATIC_VAL.HEALTHYFLAG = True
    #清理垃圾
    await bot.clean_data_dir(data_dir = 'image') 
    await bot.clean_data_dir(data_dir = 'record') 
    await bot.clean_data_dir(data_dir = 'show') 
    await bot.clean_data_dir(data_dir = 'bface') 
    await bot.clean_plugin_log()
    await bot.send_group_msg(group_id = 774261838,message = '定时清理缓存任务点已完成!')
    STATIC_VAL.HEALTHYFLAG = True

代码中包含部分清理QQ机器人内部缓存的代码,如不需要,忽略即可!
代码中,包含部分全局静态变量,在相关文件中定义即可!
代码中部分星号” * “为QQ群号及自己私人QQ号,读者在应用时改为自己的即可!

  • 如需了解更多内容,欢迎加入QQ群:774261838 和我一起交流!

你可能感兴趣的:(QQbot,python)