0
点赞
收藏
分享

微信扫一扫

青年大学习一键提醒、一键查看未学习名单

兮城 2022-04-17 阅读 161
python

陕西地区成品及使用教程:青年大学习一键催人工具-【陕西地区】_哔哩哔哩_bilibili

 

目录

一、登录+分析模块

1.selenium+webdriver配置

2.实现登录+获取token

3.通过token对数据进行分析

二、验证码识别模块

三、邮件发送模块

四、程序入口模块

 五、log模块


 tips:一个模块就是一个文件

一、登录+分析模块

1.selenium+webdriver配置

比如你电脑上有edge浏览器,然后去selenium官网下载edge浏览器对应版本的webdriver。

下载后把驱动解压到项目目录,然后这样调用(我这样用是为了方便打包):

driver = webdriver.Edge(executable_path='msedgedriver.exe')

也可以配置一下环境变量,具体请百度。

2.实现登录+获取token

可以看我的login()函数

这里解释一下为啥不保存token,因为陕西这个网站token有效期只有2小时。

3.通过token对数据进行分析

可以看我的getRequest()函数

import requests
import json
from selenium import webdriver
import time
from LogSystem import writeLog
import base64
from io import BytesIO
from PIL import Image
import re
from OCR import ddocr


class qndxx:
    def __init__(self, account, passwd):
        self.account = account
        self.password = passwd
        self.token = ""


    def base64_to_image(self, base64_str):
        base64_data = re.sub('^data:image/.+;base64,', '', base64_str)
        byte_data = base64.b64decode(base64_data)
        image_data = BytesIO(byte_data)
        img = Image.open(image_data)
        return img

    def login(self):
        # 成功   cookie里面存在token的值
        url = "https://www.sxgqt.org.cn/bgsxv2/login?redirect=%2Fbgsxv2%2Freunion%2Fmember%2FmemberList"
        try:

            driver = webdriver.Edge(executable_path='msedgedriver.exe')
        except Exception:
            print("请更新Edge浏览器到最新版本-ver100")
            return

        driver.implicitly_wait(3)  # 隐性等待3s
        # tkinter.messagebox.showerror('提示', '只需要输入验证码,请勿点击网页的登录按钮')
        while 1:

            driver.get(url)
            time.sleep(0.5)
            driver.find_element("xpath", "//*[@id='pane-first']/div/div/form/div[1]/div/div/input").send_keys(
                self.account)
            driver.find_element("xpath", "//*[@id='pane-first']/div/div/form/div[2]/div/div/input").send_keys(
                self.password)
            ce = driver.find_element("xpath", "//*[@id='pane-first']/div/div/form/div[3]/div/img").get_attribute("src")

            img = self.base64_to_image(ce)
            img.save('code.png')

            verfCode = ddocr('code.png')
            # tkinter.messagebox.showerror('提示', '输入验证码,然后关掉弹窗')

            driver.find_element("xpath", "//*[@id='pane-first']/div/div/form/div[3]/div/div/input").send_keys(
                verfCode)
            time.sleep(1)
            driver.find_element("xpath", "//*[@id='pane-first']/div/div/form/button").click()
            time.sleep(1)

            cur_cookies = driver.get_cookies()

            if cur_cookies[0]["name"] == "token":
                break

        # print(cur_cookies[0]["value"])
        self.token = cur_cookies[0]["value"]

        # with open("222222.txt", "w") as f:
        #     f.write(json.dumps(cur_cookies))
        driver.quit()

        return True

    def getRequest(self):
        list_meixue = []
        if self.login():
            head = {
                "token": self.token,
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68"
            }

            url = "https://www.sxgqt.org.cn/bgsxapiv2/regiment?page=1&rows=100&keyword=&oid=100612025&leagueStatus=&goHomeStatus=&memberCardStatus=&isPartyMember=&isAll="
            url_qing = "https://www.sxgqt.org.cn/bgsxapiv2/regiment/youngList?oid=100612025&keyword=&isAll=&page=1&rows=15"

            text_data = requests.get(url=url, headers=head).text
            data = json.loads(text_data)
            # print(data)
            for line in data['data']['data']:
                if line["isStudy"] == "否":
                    list_meixue.append(line['realname'])
            text_data = requests.get(url=url_qing, headers=head).text
            data = json.loads(text_data)
            # print(data)
            for line in data['data']['data']:
                if line["isStudy"] == "否":
                    list_meixue.append(line['realname'])

            if len(list_meixue) == 0:
                print("本期大学习全部完成")
            else:
                line1 = "共%d个人没学本期大学习" % len(list_meixue)
                line2 = " ".join(list_meixue)
                print(line1)
                print(line2)
                writeLog(line1)
                writeLog(line2)
        return list_meixue

二、验证码识别模块


import ddddocr

def ddocr(file):
    try:
        ocr = ddddocr.DdddOcr()
        with open(file, 'rb') as f:
            img_bytes = f.read()
        res = ocr.classification(img_bytes)
        return res
    except:
        print("获取验证码失败,请继续!")



三、邮件发送模块

import smtplib
from email.mime.text import MIMEText
from email.header import Header

from email.mime.multipart import MIMEMultipart


def send_mail(accountList, eAccount, eAuthorizationCode, eTitle, eContent):
    msg_from = eAccount  # 发送方邮箱
    passwd = eAuthorizationCode  # 就是上面的授权码
    to_addr = accountList  # 接受方邮箱,列表
    # print(to)

    # 设置邮件内容
    # MIMEMultipart类可以放任何内容
    msg = MIMEMultipart()
    content = eContent
    # 把内容加进去
    msg.attach(MIMEText(content, 'plain', 'utf-8'))

    # 设置邮件主题
    msg['Subject'] = eTitle

    # 设置发送者信息
    msg['From'] = '青年大学习提醒Bot'
    # 设置接受者信息
    msg['To'] = '未进行青年大学习的同学'

    # 开始发送
    try:
        temp_flag_email = msg_from.split("@")[-1]
        if temp_flag_email == "qq.com":
            # 通过SSL方式发送,服务器地址和端口
            s = smtplib.SMTP_SSL("smtp.qq.com", 465)
        elif temp_flag_email == "163.com":
            s = smtplib.SMTP_SSL("smtp.163.com", 465)
        elif temp_flag_email == "gmail.com":
            s = smtplib.SMTP_SSL("smtp.gmail.com", 465)
        elif temp_flag_email == "126.com":
            s = smtplib.SMTP_SSL("smtp.126.com", 465)
        else:
            # 如果没有匹配,默认用QQ邮箱
            s = smtplib.SMTP_SSL("smtp.qq.com", 465)
        # 登录邮箱
        s.login(msg_from, passwd)
        # 开始发送
        res = s.sendmail(msg_from, to_addr, msg.as_string())
        if len(res) != 0:
            print("发送失败,错误码:", res)
        s.quit()
        print("邮件发送成功")
    except smtplib.SMTPException as e:
        print("邮件发送失败!!", e)

四、程序入口模块

程序启动前先从config文件读取配置

import configparser
import os

from qndxx import qndxx
from send_emile import send_mail

# 配置初始化
cf = configparser.ConfigParser()
cf.read("config.ini", encoding="utf8")
account = cf.get("accountPart", "account")
password = cf.get("accountPart", "password")
eAccount = cf.get("sendEmail", "eAccount")
eAuthorizationCode = cf.get("sendEmail", "eAuthorizationCode")
eTitle = cf.get("emailContent", "eTitle")
eContent = cf.get("emailContent", "eContent")

print("配置初始化--完成")
print("使用前请检查config文件是否配置正确")

# print("邮件发送测试模式,收信人:xxxx@qq.com")

# print("点击弹窗的确定按钮,程序才会继续运行")
qn = qndxx(account, password)
list_meixue = qn.getRequest()
list_email = []
if input("是否发送提醒邮件(1发送,0不发送):") == "1":
    for line in list_meixue:
        try:
            email = cf.get("emailList", line)
            list_email.append(email)
        except Exception:
            print(line + "\t未初始化邮箱")

    if len(list_meixue) == len(list_email):
        send_mail(list_email, eAccount, eAuthorizationCode, eTitle, eContent)
    else:
        print("请在config文件初始化所有人的邮箱后再运行")

os.system("pause")

 config.ini  文件的配置

 五、log模块

import time


# LogText:需要记录的数据
def writeLog(LogText=''):
    # 格式化成2021-08-05 09:42:08形式
    time_true = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    filename = "./Log.txt"
    with open(filename, 'a+', encoding="utf8") as f:
        f.writelines([time_true, "\t", LogText + "\n"])

最后,如果大家需要具体讲解(每个部分的解决思路+打包教程)可以留言,如果需求多我会出一篇详细的文章解释。

举报

相关推荐

0 条评论