文章目录

  • 前言
  • 一、python连接打卡网站实现自动批量打卡
    • 1.代码
    • 2.关键部分分析
  • 二、定时启动打卡程序
    • 1、腾讯服务器
    • 2、使用linux+crontab添加定时启动项
  • 三、每日报送成功发送邮件
    • 1、发送邮件功能
    • 2、结合打卡,完成每日打卡成功通知
  • 三、图形化界面的设计
  • 写在最后:

前言

考试周不想复习,自学python,看了一个下午毫无感觉,于是想着实操一下,试试能不能搞个云战役自动打卡,搞到凌晨两点左右成功实现了使用python批量打卡,后来不断改进增加功能,大致实现了用户的添加每日自动批量打卡以及每日打卡成功之后的信息报送,不过仍有很多不足的地方还需改进


一、python连接打卡网站实现自动批量打卡

1.代码

代码如下(示例):

import requests
import time
url='https://nco.zjgsu.edu.cn/genqrcode/2019032'
file = open("C:/Users/Administrator/Desktop/python文件/spide/helloSpide.txt", "r")
file_read = file.readlines()#读取文件内容(以列表形式)
lenthOfFile = len(file_read)#确定长度
for i in range(0, lenthOfFile, 4):#这里是4后边增加了邮箱信息之后会变成5# 每一个for循环签到一次file_read_name = file_read[i]#读取用户名(学号)file_read_name = file_read_name.strip()#将读取的用户名去空格及回车file_read_pass = file_read[i+1]#读取密码file_read_pass = file_read_pass.strip()file_read_first_location = file_read[i+2]#读取省市file_read_first_location = file_read_first_location.strip()file_read_last_location = file_read[i+3]#读取地区file_read_last_location = file_read_last_location.strip()# 读取文件内容并存储# 以下是第一个界面myHeaders_1 = {'User-Agent': 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02 '#页面只允许手机端访问于是更改头部为手机可以直接网上搜代理(这一步很关键)}url = 'https://nco.zjgsu.edu.cn/genqrcode/2019032'r3 = requests.post(url, headers=myHeaders_1)  # 向https://nco.zjgsu.edu.cn/genqrcode/2019032发送请求(进入登录界面)yourLocal1 = file_read_first_location  # 读取现在地址的首地址(例如浙江省杭州市)yourLocal2 = file_read_last_location  # 读取具体地址myHeaders_2 = {'Upgrade-Insecure-Requests': '1','Content-Type': 'application/x-www-form-urlencoded','Cookie': 'zjgsusessionsid=s%3AGSYaaVwF_2pedsizsHYTYSY64hVl3vL_.NMnLf1bV1PJSAS%2FeZXUkcyPkFpBq%2BcMVQYq4XPHXAAU; _ncov_uuid=a59e0ac8-da06-4fb1-83d8-000976c317a9; _ncov_username=1910080117; _ncov_psswd=09187X','User-Agent': 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02 '}myHeaders_2['Cookie'] = r3.headers['set-cookie']#将获得的cookie传到下一个文件头(进行cookie的替换)payload = {'name': ' ', 'psswd': ' '}payload['name'] = file_read_name#设置post参数payload['psswd'] = file_read_pass#设置post参数url = 'https://nco.zjgsu.edu.cn/login'r=requests.post(url, data=payload, headers=myHeaders_2)#登录# r.encoding='utf-8'print(r.text)print(r.headers)time.sleep(10)  # 界面跳转休息十秒怕被抓myHeaders_3 = {'Upgrade-Insecure-Requests': '1','Content-Type': 'application/x-www-form-urlencoded','Cookie': 'zjgsusessionsid=s%3AOIlBmUda3tnT-fWds6uWEKKADgTt3IAd.zQ1LcseRzDNFPv5EU1AlkyyWeSMz6424x6HK8cbov8Q; _ncov_uuid=03d31c9b-696f-4429-a0ca-6e2b7a2e10ce; _ncov_username=1910080117; _ncov_psswd=09187X','User-Agent': 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02 '}myHeaders_3['Cookie'] = r.headers['set-cookie']#传递cookiepayload2 = {'uuid': 'a59e0ac8-da06-4fb1-83d8-000976c317a9','locationInfo': '%E6%B5%99%E6%B1%9F%E7%9C%81%E6%9D%AD%E5%B7%9E%E5%B8%82','currentResd': '%E6%B5%99%E6%B1%9F%E7%9C%81%E6%B8%A9%E5%B7%9E%E5%B8%82%E9%BE%99%E6%B8%AF%E5%B8%82%E4%B8%B4%E6%B8%AF%E8%B7%AF862%E5%8F%B7','fromHbToZjDate': '','fromHbToZj': 'C','fromWtToHzDate': '','fromWtToHz': 'B','meetDate': '','meetCase': 'C','travelDate': '','travelCase': 'D','medObsvReason': '','medObsv': 'B','belowCaseDesc': '','belowCase': 'D','temperature': '','notApplyReason': '','hzQRCode': 'A','specialDesc': ''}payload2['locationInfo'] = yourLocal1  # 换地址payload2['currentResd'] = yourLocal2  # 换地址url2 = 'https://nco.zjgsu.edu.cn/'r2 = requests.post(url2, data=payload2, headers=myHeaders_2)#打卡成功# r.encoding='utf-8'print(r2.text)time.sleep(5)  # 完成一个人的休眠五秒然后继续打卡下一个人

2.关键部分分析

代码如下(示例):

 r=requests.post(url, data=payload, headers=myHeaders_2)

前面的代码都是围绕着这一部分代码展开的,构造url也号payload也好headers也好,只要构造得当便可实现想要的功能
例如:
前面只能用手机端登录打卡界面,于是将headers中的user-agent更改为安卓端的user-agent便可

myHeaders_1['User-Agent'] = 'xxxxxxxx'

二、定时启动打卡程序

1、腾讯服务器

显然我的电脑不能一直开着,所以和室友花重金(可怜学生党)买了腾讯服务器。
腾讯云云服务器 (Cloud Virtual Machine,CVM) 是在云中提供可扩展的计算服务。 [1] 腾讯云在亚太云计算市场份额位列第四,首次超过谷歌。

2、使用linux+crontab添加定时启动项

忘记crontab是不是自带的了,如果要安装

yum install vixie-cron
yum install crontabs

之后添加定时启动项,不过在这之前要先熟悉一下crontab的使用
打开crontab

crontab -e

这时会进入vi编辑器模式,然后在新的一行添加你你想要的定时任务,不过这要熟悉cron表达式的语法例如每天0点启动

0 0 * * * 程序名 >>想记录的日志名

我crontab里面的内容:

2 0 * * * python /root/ShareFile/myFirstSpide.py >>/root/ShareFile/EverDay.txt

代表着每天0:02使用python打开myFirstSpide.py并将运行记录写入EverDay.txt

三、每日报送成功发送邮件

1、发送邮件功能

这里是利用smtp来发送,使用smtp时需要在你的邮箱设置里开启此功能,并获得动态密码

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# from email.mime.image import MIMEImage
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com', 25)#这里使用163来发送邮件qq的话改为smtp.qq.com
username = 'xxxxxxxx'#你的邮箱名
password = 'xxxxxxxx'#你的动态密码(注意这里不是你的密码而是你在163开启的smtp的动态码)
smtp.login(username, password)
sender = 'xxxxxxx'#发送人邮箱名
receiver = 'xxxxxxx'#接收者邮箱
#发送邮件文本内容
subject = 'pythonmailtest'#文件内容
msg = MIMEMultipart('mixed')
msg['Subject'] = subject
msg['From'] = 'xxxxxx@163.com <xxxxxx@163.com>'
msg['To'] = 'xxxxxxxx@qq.com'
text = 'Hello World'#文件内容
text_plain = MIMEText(text, 'plain', 'utf-8')#邮件内容
msg.attach(text_plain)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()

2、结合打卡,完成每日打卡成功通知

import requests
import time
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
url='https://nco.zjgsu.edu.cn/genqrcode/2019032'#发送邮件程序
def sentSecessMsg(receiver):smtp = smtplib.SMTP()smtp.connect('smtp.qq.com', 25)username = 'xxxxxxx'password = 'xxxxxxx'smtp.login(username, password)sender = 'xxxxxxx'#发送邮件文本内容subject = '哈喽哈:今日报送成功'msg = MIMEMultipart('mixed') msg['Subject'] = subjectmsg['From'] = 'xxxxxxx@qq.com <xxxxxx@qq.com>'msg['To'] = receivertext = '打卡成功'text_plain = MIMEText(text, 'plain', 'utf-8')msg.attach(text_plain)smtp.sendmail(sender, receiver, msg.as_string())smtp.quit()file = open("C:/Users/Administrator/Desktop/python文件/spide/helloSpide.txt", "r")
file_read = file.readlines()
lenthOfFile = len(file_read)
for i in range(0, lenthOfFile, 5):# 每一个for循环签到一次file_read_name = file_read[i]file_read_name = file_read_name.strip()file_read_pass = file_read[i+1]file_read_pass = file_read_pass.strip()file_read_first_location = file_read[i+2]file_read_first_location = file_read_first_location.strip()file_read_last_location = file_read[i+3]file_read_last_location = file_read_last_location.strip()# 读取文件内容并存储# 以下是第一个界面myHeaders_1 = {'User-Agent': 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02 '#页面只允许手机端访问于是更改头部为手机}url = 'https://nco.zjgsu.edu.cn/genqrcode/2019032'r3 = requests.post(url, headers=myHeaders_1)  # 向https://nco.zjgsu.edu.cn/genqrcode/2019032发送请求yourLocal1 = file_read_first_location  # 读取现在地址的首地址(例如浙江省杭州市)yourLocal2 = file_read_last_location  # 读取具体地址myHeaders_2 = {'Upgrade-Insecure-Requests': '1','Content-Type': 'application/x-www-form-urlencoded','Cookie': 'zjgsusessionsid=s%3AGSYaaVwF_2pedsizsHYTYSY64hVl3vL_.NMnLf1bV1PJSAS%2FeZXUkcyPkFpBq%2BcMVQYq4XPHXAAU; _ncov_uuid=a59e0ac8-da06-4fb1-83d8-000976c317a9; _ncov_username=1910080117; _ncov_psswd=09187X','User-Agent': 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02 '}myHeaders_2['Cookie'] = r3.headers['set-cookie']#将获得的cookie传到下一个文件头payload = {'name': ' ', 'psswd': ' '}payload['name'] = file_read_namepayload['psswd'] = file_read_passurl = 'https://nco.zjgsu.edu.cn/login'r=requests.post(url, data=payload, headers=myHeaders_2)# r.encoding='utf-8'print(r.text)print(r.headers)# print(r.headers['Url-Hash'])# https://blog.csdn.net/sinat_32258909/article/details/52404305time.sleep(10)  # 界面跳转休息十秒myHeaders_3 = {'Upgrade-Insecure-Requests': '1','Content-Type': 'application/x-www-form-urlencoded','Cookie': 'zjgsusessionsid=s%3AOIlBmUda3tnT-fWds6uWEKKADgTt3IAd.zQ1LcseRzDNFPv5EU1AlkyyWeSMz6424x6HK8cbov8Q; _ncov_uuid=03d31c9b-696f-4429-a0ca-6e2b7a2e10ce; _ncov_username=1910080117; _ncov_psswd=09187X','User-Agent': 'Opera/12.02 (Android 4.1; Linux; Opera Mobi/ADR-1111101157; U; en-US) Presto/2.9.201 Version/12.02 '}myHeaders_3['Cookie'] = r.headers['set-cookie']payload2 = {'uuid': 'a59e0ac8-da06-4fb1-83d8-000976c317a9','locationInfo': '%E6%B5%99%E6%B1%9F%E7%9C%81%E6%9D%AD%E5%B7%9E%E5%B8%82','currentResd': '%E6%B5%99%E6%B1%9F%E7%9C%81%E6%B8%A9%E5%B7%9E%E5%B8%82%E9%BE%99%E6%B8%AF%E5%B8%82%E4%B8%B4%E6%B8%AF%E8%B7%AF862%E5%8F%B7','fromHbToZjDate': '','fromHbToZj': 'C','fromWtToHzDate': '','fromWtToHz': 'B','meetDate': '','meetCase': 'C','travelDate': '','travelCase': 'D','medObsvReason': '','medObsv': 'B','belowCaseDesc': '','belowCase': 'D','temperature': '','notApplyReason': '','hzQRCode': 'A','specialDesc': ''}payload2['locationInfo'] = yourLocal1  # 换地址payload2['currentResd'] = yourLocal2  # 换地址url2 = 'https://nco.zjgsu.edu.cn/'r2 = requests.post(url2, data=payload2, headers=myHeaders_2)# r.encoding='utf-8'print(r2.text)time.sleep(5)  # 完成一个人的休眠五秒然后继续打卡下一个人# 读取邮箱地址MailAddress = file_read[i+4]MailAddress = MailAddress.strip()sentSecessMsg(MailAddress)

三、图形化界面的设计

这里就不多说了,自己慢慢画

import tkinter as tk
import tkinter.messagebox
from PIL import Image
from PIL import ImageTk
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import os
#创建窗口
window = tk.Tk()
window.title("自动打卡小程序")  #窗口标题
window.geometry('500x300')  #尺寸
#添加背景# photo = tk.PhotoImage(file='C:/Users/Administrator/Desktop/python文件/spide/1.png')
# thePhotoLabel = tk.Label(window, image=photo,compound=tk.CENTER)
# thePhotoLabel.pack()
# def writeToText():
#     myFile=open("C:/Users/Administrator/Desktop/python文件/spide/helloSpide.txt",)# def get_image(filename,width,height):
#     im = Image.open(filename).resize((width,height))
#     return ImageTk.PhotoImage(im)
# #添加图片
# Dpath = os.path.abspath('.')
# canvas_root = tkinter.Canvas(window, width=500,height=300)
# im_root = get_image(Dpath+'\\picture\\k.png', 800,600)
# canvas_root.create_image(400,300, image=im_root)
# canvas_root.pack()tk.Label(window, text='用户名:', font=('微软雅黑', 14)).place(x=90, y=20)
tk.Label(window, text='密   码:', font=('微软雅黑', 14)).place(x=90, y=60)
tk.Label(window, text='居住省市:', font=('微软雅黑', 14)).place(x=70, y=100)
tk.Label(window, text='居住地:', font=('微软雅黑', 14)).place(x=90, y=140)
tk.Label(window, text='邮   箱:', font=('微软雅黑', 14)).place(x=90, y=180)userNameEntry = tk.Entry(window)
userPasswordEntry = tk.Entry(window, show='*')
userNameEntry.place(x=170, y=25)
userPasswordEntry.place(x=170, y=65)userFirstAddress = tk.Entry(window)
userLastAddress = tk.Entry(window)
userFirstAddress.place(x=170, y=105)
userLastAddress.place(x=170, y=145)EmailAddress = tk.Entry(window)
EmailAddress.place(x=170, y=185)def writeInText():# myFile = open('C:/Users/Administrator/Desktop/python文件/spide/helloSpide.txt', 'a+')# myFile.write('\n'+userNameEntry.get()+'\n')# myFile.write(userPasswordEntry.get()+'\n')# myFile.write(userFirstAddress.get()+'\n')# myFile.write(userLastAddress.get())# myFile.close()if userNameEntry.get()=='' or userPasswordEntry.get()=='' or userFirstAddress.get()=='' or userLastAddress.get()=='' or EmailAddress.get()=='':tkinter.messagebox.showinfo(title='提示', message='输入框不能为空')else:AllInfo = userNameEntry.get()+'\n'+userPasswordEntry.get()+'\n'+userFirstAddress.get()+'\n'+userLastAddress.get()+'\n'+EmailAddress.get()smtp = smtplib.SMTP()smtp.connect('smtp.qq.com', 25)username = 'xxxxx@qq.com'password = 'xxxxxxxx'smtp.login(username, password)sender = 'xxxxxxx@qq.com'receiver = 'xxxxxxx@qq.com'#发送邮件文本内容subject = '信息更改'msg = MIMEMultipart('mixed') msg['Subject'] = subjectmsg['From'] = 'xxxxxx@qq.com <xxxxxxx@qq.com>'msg['To'] = 'xxxxxxxx@qq.com'# msg['Date'] = '2021-1-23'text = AllInfotext_plain = MIMEText(text, 'plain', 'utf-8')msg.attach(text_plain)# text = 'Hello World'# text_plain = MIMEText(text, 'plain', 'utf-8')smtp.sendmail(sender, receiver, msg.as_string())smtp.quit()tkinter.messagebox.showinfo(title='提示', message='发送成功')def clearText():# myFile = open('C:/Users/Administrator/Desktop/python文件/spide/new.txt','w')# myFile.close() tkinter.messagebox.showinfo(title='提示', message='开发者有点菜,该功能还未开放,请联系管理员MyNameIsChenWenHan')sendTotextButton = tk.Button(window, text='添加', width=20, height=2, command=writeInText)
sendTotextButton.place(x=100, y=230)
tkinter.messagebox.showinfo(title='提示', message='使用方法:输入云战役打卡账号密码等点击添加即可实现每日自动打卡')
clearTextButton = tk.Button(window, text='清除用户数据', width=20, height=2, command=clearText)
clearTextButton.place(x=320, y=230)window.mainloop()

写在最后:

有很多的不足,例如资料是存在txt里面的,客户信息的传递是通过邮件的。其实应该是用数据库搞得,不过没时间了,也不想搞了附上数据库连接代码,希望有缘人搞搞

import pymysql# 打开数据库连接
db = pymysql.connect(host="192.168.xxx.xxx",user="xxxx",password="xxxxx",database="xxxxxxx")
cursor = db.cursor()
cursor.execute("SELECT VERSION()")
data = cursor.fetchone()print ("Database version : %s " % data)# 关闭数据库连接
db.close()

全球某工商云战役自动打卡系统相关推荐

  1. Python进行网页自动打卡系统

    Python进行网页自动打卡系统 安装Python 下载Chromedriver 安装selenium 设置定时自动运行 Python程序 安装Python 可以直接Python官网下载,需要进行路径 ...

  2. BNUZ自动打卡系统

    文章目录 1. 需要的库 2. js接口调用部分 每日报平安 post.py 早中午检 以上所需字典文件 xg_json_bean.py 3. 程序调用 start.py 4. 定时启动 5. 网页建 ...

  3. 2020年全球自动化装卸车系统(ATLS)收入大约80百万美元,预计2026年达到134.5百万美元,2021至2026期间,年复合增长率为14.0%

    本文研究全球市场.主要地区和主要国家自动化装卸车系统(ATLS)的销量.销售收入等,同时也重点分析全球范围内主要厂商(品牌)竞争态势,自动化装卸车系统(ATLS)销量.价格.收入和市场份额等. 针对过 ...

  4. 2022-2028全球及中国自动运输网络(ATN)系统市场研究

    2021年全球自动运输网络(ATN)系统市场规模大约为 亿元(人民币),预计2028年将达到 亿元,2022-2028期间年复合增长率(CAGR)为 %.未来几年,本行业具有很大不确定性,本文的202 ...

  5. 美通企业日报 | Cision推出新一代全球企业传播云服务平台;基石药业全球研发总部落户苏州...

    要闻 华人运通针对全球高级市场发布纯电超跑SUV 2019中国游客版泰国五大旅游目的地电子指南上线 黑人电动牙刷研发新品打造个性化刷牙体验 伊顿2019第二季度销售额55亿美元,同比上涨1% Cisi ...

  6. 接龙管家-Python自动打卡

    接龙管家-Python自动打卡 首先要用 fillder 抓包小程序: 根据抓包的内容,编写脚本: 在云服务器上设置定时脚本: Autojs版脚本: 云服务器-获取接龙管家token 首先要用 fil ...

  7. GitChat · 架构 | 大规模私有云产品自动升级的架构选型和实战

    GitChat 作者:冰尘 原文: 大规模私有云产品自动升级的架构选型和实战 关注微信公众号:GitChat 技术杂谈 ,一本正经的讲技术 一.项目背景概述 对于云计算,每个人都有自己的定义,有按SA ...

  8. python实现易统计自动打卡

    最近被老师安排提醒班级同学打卡,看到每天很多人忘记打就很心累,想着弄个自动打卡的,于是网上巴拉了一下,找到了主要接口.具体方法如下: 一.获取token值 每个用户都有固定的且不变的一个token值, ...

  9. 阿里云 VS AWS,谁能赢得上云战役 | 凌云时刻

    凌云时刻 · 洞见 导读:云计算是科技巨头必争的战场,那么上云战役的上半场结束了吗?在AWS领跑.IBM all in的赛道内,中国企业是否能够突围?未来的格局,会是三头鼎立.各分天下吗? 作者 | ...

最新文章

  1. P3201 [HNOI2009]梦幻布丁 [启发式合并][set]
  2. linux+cp+吃内存怎么办,Linux吃掉了我的内存
  3. 开放报名 | 阿里云 Serverless 研修班走进四川大学
  4. Android学习笔记——数据库
  5. 实现.Net程序中OpenTracing采样和上报配置的自动更新
  6. 如何在ASP.NET Core 中快速构建PDF文档
  7. ASP.NET Core 添加统一模型验证处理机制
  8. 转向Kotlin——数据类和封闭类
  9. 【华为敏捷/DevOps实践】4. 如何从Excel做项目管理的方式中走出来
  10. 使用express框架接收和发送ajax信息
  11. python import random_python import random 后一直无法使用解决方法
  12. 深入解析Invoke and BeginInvoke, 同步与异步解析
  13. sql统计各科成绩大于平均分的人_SQL第三关:汇总分析
  14. ieee trans pami latex模板
  15. VMware——VMware Tools的介绍及安装方法
  16. 总结命令行05:Kafka
  17. Qt常用UI控件读取、写入方法
  18. 局域网服务器怎么更改账号,怎么修改访问局域网共享用户名和密码
  19. linux命令之一 diff(2) 命令用法
  20. UE4+Cubemap(jpg导入UE4生成Cubemap)

热门文章

  1. 语音识别引擎接口 将声音转换为文字显示
  2. C语言【程序19】题目:两个乒乓球队进行比赛,各出三人。
  3. 掌门人共话根技术 | 麒麟信安高级副总裁陈松政参加2022长沙·中国1024程序员节“岳麓对话”
  4. CC00033.bigdatajava——|Java方法封装.V15|——|Java.v15|费氏数列.v01|递归实现|
  5. 设置Office 365移动设备管理MDM服务——创建APNs证书
  6. 单细胞分析:归一化和回归(八)
  7. Centos7-Linux
  8. Django毕业设计题目推荐电影推荐系统
  9. MySQL获取季初日期_用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间...
  10. java计算机毕业设计在线毕设选题系统源码+系统+mysql数据库+lw文档