【完整代码】科研通自动签到脚本(Python)

思路是调用Chrome浏览器自动打开科研通的网址,整个流程包括:自动点击登录摁钮、自动填写邮箱密码完成登录、自动点击签到。脚本建议在电脑后台常驻,每天早上8点会自动触发登录+签到。

1. 查看Chrome浏览器版本、下载对应版本的chromedriver

浏览器地址栏输入 chrome://version/,可以看到Chrome浏览器的版本,比如131.0.6778.86 (正式版本) (64 位) (cohort: Stable) 表示版本是131

版本号大于145的进入chromedriver下载网址下载对应型号Stable版本的chromedriver。更早版本的看这个网址下载对应版本的chromedriver。

复制下载链接URL,可以浏览器打开网址进行下载,或者借助百度网盘等工具下载。下载后将zip压缩包解压

在这里插入图片描述

2. Copy代码并本地运行

Python第三方依赖包安装命令:pip install tkinter selenium schedule

脚本一开始需要你填写你的邮箱和密码,点击“一键自动签到”摁钮,或者后台一直挂着即可。

话不多说,上代码!


有帮助的话麻烦点个赞👍或收藏☆☆☆,感谢!


import tkinter as tk
from tkinter import messagebox
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
import schedule
import time
import threading
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import datetime


# 配置 Selenium WebDriver
def setup_driver(email, password):
    chrome_options = Options()
    # chrome_options.add_argument("--headless")  # 后台运行
    chrome_options.add_argument("--disable-gpu")
    chrome_options.add_argument("--no-sandbox")
    service = Service(r"chromedriver-win64\chromedriver.exe")  # 替换为你的 chromedriver 路径
    driver = webdriver.Chrome(service=service, options=chrome_options)
    
    return driver, email, password


# 自动签到功能
def auto_sign_in(email, password):
    try:
        driver, _, _ = setup_driver(email, password)
        driver.get("https://www.ablesci.com/")

        # 显式等待页面加载完成
        wait = WebDriverWait(driver, 10)

        # 检查页面中是否存在 "登入后的状态" 标识字符串
        page_source = driver.page_source
        if "<!-- 登入后的状态 -->" not in page_source:
            # 如果未登录,执行登录流程
            login_button = wait.until(
                EC.presence_of_element_located((By.XPATH, '//li[@class="layui-nav-item layui-hide-xs"]/a'))
            )
            login_button.click()  # 点击登录按钮

            # 等待邮箱输入框加载
            email_input = wait.until(
                EC.presence_of_element_located((By.ID, "LAY-user-login-email"))
            )
            email_input.send_keys(email)  # 输入邮箱

            # 等待密码输入框加载
            password_input = driver.find_element(By.ID, "LAY-user-login-password")
            password_input.send_keys(password)  # 输入密码

            # 点击登录按钮
            login_submit_button = driver.find_element(
                By.XPATH, '//button[@class="layui-btn layui-btn-fluid"]'
            )
            login_submit_button.click()

            # 等待页面刷新,确认是否登录成功
            wait.until(lambda d: "<!-- 登入后的状态 -->" in d.page_source)

        # 登录后,查找签到按钮
        try:
            # 使用 WebDriverWait 等待签到按钮,最多等待 10 秒
            sign_button = wait.until(
                EC.presence_of_element_located((By.CLASS_NAME, "btn-sign"))
            )
            sign_button.click()  # 点击签到按钮
            messagebox.showinfo("签到成功", "今日打卡签到成功!")
        except Exception:
            # 如果找不到签到按钮,则弹出“已签到”提示
            messagebox.showinfo("提示", "没有找到签到按钮,可能您已经签到过了!")
    except Exception as e:
        messagebox.showerror("错误", f"签到失败:{str(e)}")
    finally:
        driver.quit()


# 每日定时任务
def daily_task(email, password):
    try:
        auto_sign_in(email, password)
    except Exception as e:
        print(f"每日签到失败:{e}")


# 设置定时任务
def schedule_daily_sign_in(email, password):
    schedule.every().day.at("08:00").do(daily_task, email, password)
    while True:
        schedule.run_pending()
        time.sleep(1)


# 创建主界面
def create_gui(email, password):
    # 创建 tkinter 窗口
    root = tk.Tk()
    root.title("科研通自动签到助手")

    # 显示时间的标签
    time_label = tk.Label(root, text="", font=("Arial", 14))
    time_label.pack(pady=10)

    # 更新时间
    def update_time():
        current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        time_label.config(text=f"当前时间:{current_time}")
        root.after(1000, update_time)

    update_time()

    # 创建按钮
    sign_in_button = tk.Button(root, text="手动签到", font=("Arial", 14), command=lambda: auto_sign_in(email, password))
    sign_in_button.pack(pady=10)

    root.mainloop()


# 登录界面:获取用户的邮箱和密码
def show_login_window():
    def on_submit():
        email = email_entry.get()
        password = password_entry.get()
        if email and password:
            login_window.destroy()  # 关闭登录窗口
            create_gui(email, password)  # 传递邮箱和密码到主界面
            # 启动后台定时任务
            threading.Thread(target=schedule_daily_sign_in, args=(email, password), daemon=True).start()
        else:
            messagebox.showerror("错误", "请输入邮箱和密码!")

    login_window = tk.Tk()
    login_window.title("登录界面")

    tk.Label(login_window, text="请输入邮箱:").pack(pady=5)
    email_entry = tk.Entry(login_window, font=("Arial", 14))
    email_entry.pack(pady=5)

    tk.Label(login_window, text="请输入密码:").pack(pady=5)
    password_entry = tk.Entry(login_window, font=("Arial", 14), show="*")
    password_entry.pack(pady=5)

    submit_button = tk.Button(login_window, text="提交", font=("Arial", 14), command=on_submit)
    submit_button.pack(pady=20)

    login_window.mainloop()


if __name__ == "__main__":
    # 启动登录窗口
    show_login_window()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值