吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2088|回复: 18
收起左侧

[Python 原创] 图形化对分易自动签到

  [复制链接]
k452b 发表于 2024-5-17 11:11

如果有帮我优化的麻烦把源码直接贴到github或者直接回帖,谢谢。

对分易自动签到

针对一款叫对分易的软件写的签到程序,打开后按要求登录就可以监控签到了,大学生的福利。
支持两种登录方式。
支持两种签到方式。

演示图

下载链接

打包成了exe大家可以上github下载exe文件。
https://github.com/liuzhijie443/duifene_auto_sign/releases/tag/v1.0.0

源码

import re
from datetime import datetime
import tkinter as tk
from tkinter import messagebox, ttk
import requests
import urllib3
from bs4 import BeautifulSoup

host = "https://www.duifene.com"
UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.40(0x1800282a) NetType/WIFI Language/zh_CN'
course_id = None
class_id = None
class_json = []
seconds = 5
job_id = ""
username = ""
password = ""
stu_id = ""

urllib3.disable_warnings()
x = requests.Session()
x.headers['User-Agent'] = UA
# x.proxies = {"https": "127.0.0.1:8888"}
x.verify = False
r = x.get(url=host)

def get_user_id():
    global stu_id
    r1 = x.get(url=host + "/_UserCenter/MB/index.aspx")
    if r1.status_code == 200:
        soup = BeautifulSoup(r1.text, "lxml")
        code = soup.find(id="hidUID").get("value")
        stu_id = code

def sign(code):
    status = False
    if len(code) == 4:
        headers = {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Referer": "https://www.duifene.com/_CheckIn/MB/CheckInStudent.aspx?moduleid=16&pasd="
        }
        params = f"action=studentcheckin&studentid={stu_id}&checkincode={code}"
        r1 = x.post(
            url=host + "/_CheckIn/CheckIn.ashx", data=params, headers=headers)
        if r1.status_code == 200:
            msg = r1.json()["msgbox"]
            text_box.insert(tk.END, f"\n\n{msg}\n")
            if msg == "签到成功!":
                text_box.insert(tk.END, f"\n")
                text_box.insert(tk.END, f"\n")
                text_box.insert(tk.END, f"\n")
                status = True
    else:
        r1 = x.get(url=host + "/_CheckIn/MB/QrCodeCheckOK.aspx?state=" + code)
        if r1.status_code == 200:
            soup = BeautifulSoup(r1.text, "lxml")
            msg = soup.find(id="DivOK").get_text()
            if "签到成功" in msg:
                text_box.insert(tk.END, f"\n\n{msg}\n")
                text_box.insert(tk.END, f"\n")
                text_box.insert(tk.END, f"\n")
                text_box.insert(tk.END, f"\n")
                status = True
            else:
                text_box.insert(tk.END, f"非微信链接登录,二维码无法签到")
    return status

def get_code():
    global job_id
    sign_status = False

    current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    text_box.insert(tk.END, f"\n\n持续监控:{current_time}")  # 插入当前时间
    text_box.see(tk.END)  # 滚动到最后一行

    r1 = x.get(
        url=host + f"/_CheckIn/MB/TeachCheckIn.aspx?classid={class_id}&temps=0&checktype=1&isrefresh=0&timeinterval=0&roomid=0&match=")
    if r1.status_code == 200:
        if "HFCheckCodeKey" in r1.text:
            soup = BeautifulSoup(r1.text, "lxml")
            code = soup.find(id="HFCheckCodeKey").get("value")
            HFSeconds = soup.find(id="HFSeconds").get("value")
            HFChecktype = soup.find(id="HFChecktype").get("value")
            HFCheckInID = soup.find(id="HFCheckInID").get("value")
            # 数字签到
            if HFChecktype == '1':
                text_box.insert(tk.END, f"\t未到签到时间\t倒计时:{HFSeconds}秒\t签到码:{code}")
                if code is not None and int(HFSeconds) <= int(seconds):
                    text_box.insert(tk.END, f"\n\n开始签到\t签到码:{code}")
                    get_user_id()
                    sign_status = sign(code)
            # 二维码签到
            elif HFChecktype == '2':
                if HFCheckInID is not None:
                    text_box.insert(tk.END, f"\n\n开始签到\t二维码签到")
                    get_user_id()
                    sign_status = sign(HFCheckInID)
    if sign_status is False:
        job_id = root.after(1000, get_code)
    else:
        text_box.insert(tk.END, f"\n")
        messagebox.showinfo("签到状态", "签到成功")

def enter():
    if course_id is None:
        messagebox.showerror("", "请先登录")
        return
    headers = {
        "Referer": "https://www.duifene.com/_UserCenter/MB/index.aspx"
    }
    r1 = x.get(url=host + "/_UserCenter/MB/Module.aspx?data=" + course_id, headers=headers)
    if r1.status_code == 200:
        if course_id in r1.text:
            soup = BeautifulSoup(r1.text, "lxml")
            CourseName = soup.find(id="CourseName").text
            text_box.insert(tk.END, f"\n开始监听【{CourseName}】签到活动")
            get_code()

def get_class_json():
    global class_json, course_id,class_id
    headers = {
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Referer": "https://www.duifene.com/_UserCenter/PC/CenterStudent.aspx"
    }
    params = "action=getstudentcourse&classtypeid=2"
    r1 = x.post(
        url=host + "/_UserCenter/CourseInfo.ashx", data=params, headers=headers)
    if r1.status_code == 200:
        j = r1.json()
        if j is not None:
            try:
                msg = j["msgbox"]
                messagebox.showerror("", f"{msg} 可能是登录链接有误,请重新复制。")
            except Exception as e:
                messagebox.showinfo("提示", "登录成功")
                class_list = []
                class_json = j
                for i in j:
                    class_list.append(i["CourseName"])
                combo['values'] = tuple(class_list)
                combo.set(class_list[0])
                course_id = 0
                class_id = j[0]["TClassID"]
                course_id = j[0]["CourseID"]

def login_link():
    link = link_entry.get()
    code = re.search(r"(?<=code=)\S{32}", link)
    if code is not None:
        code = code[0]
        x.get(url=host + f"/P.aspx?authtype=1&code={code}&state=1")
        get_class_json()
    else:
        messagebox.showerror("error", "链接有误")

def on_combo_change(event):
    global class_id, course_id
    className = combo_var.get()
    for i in class_json:
        if i["CourseName"] == className:
            class_id = i["TClassID"]
            course_id = i["CourseID"]

def login():
    global username, password, seconds
    username = username_entry.get()
    password = password_entry.get()
    seconds = seconds_entry.get()
    headers = {
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Referer": "https://www.duifene.com/AppGate.aspx"
    }
    params = f'action=loginmb&loginname={username}&password={password}'
    r1 = x.post(url=host + "/AppCode/LoginInfo.ashx", data=params, headers=headers)
    if r1.status_code == 200:
        text_box.delete("1.0", "end")
        msg = r1.json()["msgbox"]
        messagebox.showinfo("提示", msg)
        text_box.insert(tk.END, f"\n{msg}\n")
        if msg == "登录成功":
            get_class_json()
    else:
        messagebox.showerror("登录失败", "错误提示")

def select_tab(event):
    tab_id = tab_control.index(tab_control.select())
    if tab_id == 0:
        text = '''
        1、打开电脑端微信,复制如下链接到文件传输助手并发送\n
        【https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx1b5650884f657981&redirect_uri=https://www.duifene.com/_FileManage/PdfView.aspx?file=https%3A%2F%2Ffs.duifene.com%2Fres%2Fr2%2Fu6106199%2F%E5%AF%B9%E5%88%86%E6%98%93%E7%99%BB%E5%BD%95_876c9d439ca68ead389c.pdf&response_type=code&scope=snsapi_userinfo&connect_redirect=1#wechat_redirect】\n\n
        2、点击进入链接,点击微信浏览器窗口右上角三个点,点击复制链接,并把微信链接粘贴到左侧输入框。
        '''
        text_box.insert(tk.END, text)
        frame_left_2.pack_forget()
        frame_left.pack(side=tk.LEFT, fill=tk.BOTH, pady=(40, 0))
    elif tab_id == 1:
        text_box.delete("1.0", "end")
        frame_left.pack_forget()
        frame_left_2.pack(side=tk.LEFT, fill=tk.BOTH, pady=(40, 0))

root = tk.Tk()
root.title("GUI测试")
root.resizable(False, False)
# root.configure(bg='lightgrey')

tab_control = ttk.Notebook(root)
tab1 = ttk.Frame(tab_control)
tab2 = ttk.Frame(tab_control)
tab_control.add(tab1, text="微信链接登录")
tab_control.add(tab2, text="账号密码登录")
tab_control.pack(fill=tk.BOTH, side=tk.LEFT)
# 当选项卡被选中时,调用select_tab函数
tab_control.bind("<<NotebookTabChanged>>", select_tab)

frame_left = tk.Frame(tab_control)
frame_left.pack(side=tk.LEFT, fill=tk.BOTH, pady=(40, 0))

text4 = tk.Label(frame_left, text="支持二维码和签到码", font=('宋体', 10))
text4.pack(pady=5)
text = tk.Label(frame_left, text="查看右侧说明进行登录", font=('宋体', 10))
text.pack(pady=5)
text2 = tk.Label(frame_left, text="链接", font=('宋体', 10))
text2.pack(pady=5)
link_entry = tk.Entry(frame_left, font=('宋体', 12))
link_entry.pack(pady=5, padx=10)
login_button = tk.Button(frame_left, text="登录", command=login_link, font=('宋体', 14))
login_button.pack(pady=5)

frame_left_2 = tk.Frame(tab_control)
text3 = tk.Label(frame_left_2, text="不支持二维码签到", font=('宋体', 10))
text3.pack(pady=5)

username_label = tk.Label(frame_left_2, text="账号", font=('宋体', 15))
username_label.pack(padx=10)
username_entry = tk.Entry(frame_left_2, font=('宋体', 12))
username_entry.pack(padx=10)

password_label = tk.Label(frame_left_2, text="密码", font=('宋体', 15))
password_label.pack(padx=10)
password_entry = tk.Entry(frame_left_2, show="*", font=('宋体', 12))
password_entry.pack(padx=10)

username_label = tk.Label(frame_left_2, text="剩余倒计时X秒后签到", font=('宋体', 10))
username_label.pack(pady=5)
seconds_entry = tk.Entry(frame_left_2, font=('宋体', 12), width=5)
seconds_entry.insert(0, "5")
seconds_entry.pack(pady=5)

login_button = tk.Button(frame_left_2, text="登录", command=login, font=('宋体', 14))
login_button.pack(pady=5)

frame_mid = tk.Frame(root)
frame_mid.pack(side=tk.TOP)
f2lable = tk.Label(frame_mid, text="选择课程")
f2lable.pack(side=tk.TOP, fill=tk.BOTH, pady=(10, 0))
combo_var = tk.StringVar()
combo = ttk.Combobox(frame_mid, textvariable=combo_var, state="readonly")
combo.bind("<<ComboboxSelected>>", on_combo_change)
combo.pack(side=tk.LEFT, )
f2btn = tk.Button(frame_mid, text="开始监听签到", command=enter)
f2btn.pack(side=tk.RIGHT, padx=10, pady=10)

frame_right = tk.Frame(root)
frame_right.pack(side=tk.RIGHT)

text_box = tk.Text(frame_right, width=90, height=20, font=('宋体', 9))
text_box.pack(pady=(0, 10), padx=(0, 10))

root.mainloop()

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
seventeen. + 1 + 1 谢谢@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xinxiu 发表于 2024-5-17 11:27
这软件如何?楼主是教师吗?
热门软件 发表于 2024-5-17 11:44
 楼主| k452b 发表于 2024-5-17 11:52
可坏 发表于 2024-5-17 14:15
NB~~~NNBB
wlloveclass 发表于 2024-5-17 15:12
真可惜上学的时候没能看到这一篇帖子
netpeng 发表于 2024-5-17 20:45
试过了挺好用,感谢分享。
voidmio 发表于 2024-5-17 22:36
唉,唉,可惜我现在是布置作业的那个了,该怎么不让小朋友们刷到(
agoni55 发表于 2024-5-17 23:14
感谢分享,对于我这边每天打卡的来说太方便了,谢谢
 楼主| k452b 发表于 2024-5-18 12:21
voidmio 发表于 2024-5-17 22:36
唉,唉,可惜我现在是布置作业的那个了,该怎么不让小朋友们刷到(

你是大学老师吗。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 04:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表