python实现自动打卡小程序
作者:沉默,掩饰 发布时间:2022-07-24 00:45:15
标签:python,打卡,小程序
本文实例为大家分享了python实现自动打卡小程序的具体代码,供大家参考,具体内容如下
"""
湖南大学疫情防控每日自动打卡程序v1.0
author: Liu
time:2021/3/16
"""
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
from bs4 import BeautifulSoup
import requests
from aip import AipOcr
import time
from datetime import datetime
import re
class DailyAttend(object):
def __init__(self, browser, stu_id, passwd, t, address, tmp_yesterday, tmp_today):
self.browser = browser
self.stu_id = stu_id
self.passwd = passwd
self.t = t
self.address = address
self.tmp_yesterday = tmp_yesterday
self.tmp_today = tmp_today
self.img_path = "captcha.png"
def get_captcha_img(self):
url = "https://fangkong.hnu.edu.cn/app/#/login?redirect=%2Fhome"
self.browser.get(url)
self.browser.find_element_by_class_name("vcdoe-tips").click() # 模拟点击使验证码加载出来
time.sleep(2)
webpage = self.browser.page_source
soup = BeautifulSoup(webpage, features="html.parser")
div = soup.find("div", attrs={"class": "login-content"})
src = div.find_all("img")[2].attrs["src"] # 从html中解析出图片链接
r = requests.get(src)
if r.status_code == 200:
open(self.img_path, "wb").write(r.content)
else:
print("网络不佳,无法加载验证码图片")
def recog_captcha_img(self):
img = Image.open(self.img_path)
img = img.convert('L') # P模式转换为L模式(灰度模式默认阈值127)
count = 165 # 设定阈值
table = []
for i in range(256):
if i < count:
table.append(0)
else:
table.append(1)
img = img.point(table, '1')
img.save(self.img_path) # 保存处理后的验证码
## 调用百度ocr
# 识别码
APP_ID = "23779944"
API_KEY = "FPgsSXsuqXk3twpqVHmNNK6g"
SECRET_KEY = "nG08oGzErk8CdMvDAynAiGdzfBjHr3NO"
# 初始化对象
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 读取图片
def get_file_content(file_path):
with open(file_path, 'rb') as f:
return f.read()
image = get_file_content(self.img_path)
# 定义参数变量
options = {'language_type': 'ENG', } # 识别语言类型,默认为'CHN_ENG'中英文混合
# 调用通用文字识别
result = client.basicGeneral(image, options) # 高精度接口 basicAccurate
for word in result['words_result']:
self.captcha = (word['words'])
def login(self):
## 登录
while True:
self.browser.find_element_by_css_selector("[type=text]").send_keys(self.stu_id)
self.browser.find_element_by_css_selector("[type=password]").send_keys(self.passwd)
self.browser.find_element_by_css_selector("[type=number]").send_keys(self.captcha)
self.browser.find_element_by_tag_name("button").click()
time.sleep(2)
page = self.browser.page_source
html = BeautifulSoup(page, features="html.parser")
err_message = html.find("p", attrs={"class": "el-message__content"})
if err_message.text == "登录成功":
print("登录成功!")
break
elif err_message.text == "账号或密码错误":
print("账号或密码错误!请重新输入!")
self.stu_id = input("请输入学号:")
self.passwd = input("请输入密码:")
continue
else:
self.get_captcha_img()
self.recog_captcha_img()
continue
def attend(self):
success_messages = self.browser.find_elements_by_css_selector('p[class=el-message__content]')
success_messages = [message.text for message in success_messages]
if "今日已打卡" in success_messages:
print("今日已打卡!")
time.sleep(60)
else:
## 选择打卡定位
self.browser.find_elements_by_xpath('//div/span[text()="正在获取定位..."]')[1].click()
time.sleep(1)
for i in range(17):
self.browser.find_elements_by_xpath('//ul/li')[i + 1].click()
time.sleep(1)
self.browser.find_element_by_xpath('//ul/li[text()="岳麓区"]').click()
time.sleep(1)
self.browser.find_element_by_xpath('//div/button[text()="确认"]').click()
time.sleep(1)
## 输入相关打卡信息并点击打卡按钮
self.browser.find_elements_by_css_selector('input[placeholder="街道门牌、楼层房间号等信息"]')[1].send_keys(self.address)
temp = self.browser.find_elements_by_css_selector("input[placeholder=请输入]")
temp[0].send_keys(self.tmp_yesterday)
temp[1].send_keys(self.tmp_today)
self.browser.find_elements_by_css_selector(
'button[class="btnDaka van-button van-button--info van-button--normal van-button--block"]')[1].click()
today = datetime.now().strftime("%Y-%m-%d")
print(today + "打卡成功!")
time.sleep(60)
if __name__ == "__main__":
## 欢迎界面
print("=" * 100)
print("打卡小程序")
print("欢迎你湖南大学的朋友!开始使用吧!")
print("=" * 100)
## 用户输入
while True:
t = input("请输入你的每日打卡时间(24小时制, 例如:00:10):")
if re.search('^(([0-1][0-9])|(2[1-3])):[0-5][0-9]$', t) == None:
print("你输入的时间格式有误,请重新输入!")
continue
stu_id = input("请输入你的学号:")
passwd = input("请输入个人门户密码:")
address = input("请输入你的打卡详细地址(例如:湖南大学北校区1舍):")
tmp_yesterday = input("请输入你的昨日体温:")
tmp_today = input("请输入你的今日体温:")
print("=" * 100)
if input("请检查你的输入是否无误,若有误则输入y并重新输入,若无误则输入n:") == "n":
print("=" * 100)
break
user_info = {
't': t,
'stu_id': stu_id,
'passwd': passwd,
'address': address,
'tmp_yesterday': tmp_yesterday,
'tmp_today': tmp_today
}
## 浏览器设置
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
browser = webdriver.Chrome(executable_path="chromedriver.exe", options=chrome_options)
## 打卡
app = DailyAttend(browser, **user_info) # 实例化打卡器
print("正在等待打卡时间到来...")
while True:
if datetime.now().strftime("%H:%M") == t:
app.get_captcha_img()
app.recog_captcha_img()
app.login()
app.attend()
else:
time.sleep(10)
来源:https://blog.csdn.net/weixin_44612658/article/details/114859788


猜你喜欢
- 本文实例为大家分享了vue+axios+java实现文件上传的具体代码,供大家参考,具体内容如下背景vue.js + axios + ele
- 数据库中内置函数的使用该篇主要介绍数据库中内置函数的使用,主要有日期函数,字符串函数,数学函数。(一)日期函数select current_
- 1. 引言元组是Python中一种重要的内置数据类型。与列表一样,我们经常使用元组将多个对象保存为相应的数据容器。然而,与列表不同的是元组的
- 前几天开始原来的google pr查询接口已经失效,导致很多站长工具pr查询功能不能使用原始pr查询接口:$string =&nb
- 本文实例分析了Python中的对象,方法,类,实例,函数用法。分享给大家供大家参考。具体分析如下:Python是一个完全面向对象的语言。不仅
- Python将控制台输出另存为日志文件需求  在 PyCharm 中或者说运行 python 程序时会使
- 1、文件添加方式:pycharm提供了一个在新建文件自动生成文件头注释的功能,可以实现自动生成运行环境,作者、日期等必要信息,使用比较方便,
- 一、数据库、表的创建与删除1. 创建数据库使用可视化管理工具是创建 SQL Server 数据库最常使用的方法,其特点是简单、高效。下面将以
- 前言LogEntry是在后台开发中经常用到的模块,它在admin是默认开启的。可以使用LogEntry模块记录所有用户的操作记录。一方面可以
- 最近疫情在家,空闲时间比较多,整理下之前写的Golang项目Weave,补充了一些功能,加了前端实现。作为一个Web应用模板,也算是功能比较
- 1. 自己写for循环从array里去掉$tmp这个元素的值<?php$tmp = '324';$arr = arra
- 移动端适配满足多个查询时的优先级: 请注意,可以同时满足多个查询,并且它们都将由mergeOption合并,mergeOption稍后由me
- parse_dates : boolean or list of ints or names or list of lists or dic
- 前言本文介绍的是将django项目部署到centos的遇到的一些问题,关于将Django项目部署到CentOs服务器中的步骤可以参考这篇文章
- 问题描述:在pyhton脚本中logging.info("hello world")希望输出'hello wor
- 通过文件夹导入包要求每个目录下都有一个__init__.py文件,此文件可空白。也可不空。a@ubuntu:~/Desktop$ tree
- 如下所示:#求一个数的最大约数(不算本身)def getmaxnum(n): num = n //2 while n
- 正文 curl,用于发送请求的命令行工具,一个 HTTP 请求客户端(实际上它也可以做 FTP/SCP/TELNET 协议的事情,
- 近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还
- vm.$watch用法: vm.$watch( expOrFn, callback, [options] ) ,返回值为 unwatch 是