第一个实用python程序——自动填写工作日志、签到

刚刚把文章重看了一遍,自己给的评价就是:闲的没事干了?

1. 前言

一直苦于每天要分上下午两次写工作日志(不太能理解单位某些部门的脑洞……一天一次不行么?噢……噢噢,好吧,你们抄的模板就是分上下午的,不怪你们了),而现在正在看的Python做这些自动化的工作属于python擅长的部分,于是花了半天时间写了相关代码,经测试基本成功(文后放出)。因为每周工作日内容都差不多,只要判断下当天是周几,把周几上午/下午的文本粘贴进去就可以了,所以程序很简单。

代码什么的都是别人现成的轮子,拿来照着改改就是了,没什么优点可言。缺点是大把的:不够精简,基本只是顺序结构,连个循环都没有。。。。鉴于目前的思路是够用就好,所以……对于程序这部分,边学边改吧。

这里要记录的是初用Python踏过的坑,为了填坑,花的时间比写代码的时间要长的多,为了让自己今后不再犯,另外也给遇到相似经历的初学者们一点解决的方案,故留此文。

说明下环境:Windows 10 + Python3 + Pychram 2017.3 + firefox
(在windows下编程,微软分分钟教你做人)


2. 程序构成

  • 第一部分,自动登陆工作日志网站,根据周几自动填写当天工作日志;
  • 第二部分,自动登陆什么值得买,在大妈家签到;
  • 第三部分,自动给自己邮箱发条邮件,告诉自己任务已完成。

2.1 自动填写日志部分遇到的坑

  1. 使用pip进行安装selenium,按之前自己学的,pip是啥都不知道。。。。需要在cmd中使用pip命令安装。装不上?是不是path没有对?
  2. 关于Path,Windows 10中不需要加;,要建立在Path中。python安装的时候一定要记得把path那一项选上。
  3. firefoxfirefox 不是firfox
  4. 不是安装好selenium就可以使用了,还要在官网下载firefox对应的驱动,并且把这个驱动路径也加入Path才能调用!
  5. 如果还是selenium不可用,提示:# no module named 'selenium'需要调Pychram中设置,具体可参考:https://www.cnblogs.com/lovexin/p/8612197.html

2.2 自动登陆什么值得买遇到的坑

  • 由于前序自己登陆工作日志网站,在此处基本没有遇到坑。(顽皮)
  1. 需要通过firefox的查看元素,慢慢找对应的签到按钮的元素,不是by id,而是by class name,也是可以找到的。
  2. 在网页上签到似乎只能签到,不能领积分/补签什么的,还得到手机上操作下,宝宝心里苦。。。。

2.3 自动给自己邮箱发邮件遇到的坑

  1. 一开始使用的是126邮箱发送邮件,发完三条测试邮件之后再怎么发都显示失败,开始绑定手机,使用安全密码……泥煤的除了在126自家的邮箱大师上能发邮件,第三方邮件app全阵亡,提示发送失败。这个原因查了好长时间,后来分析,估计126把我当spam了,才发几条给自己的邮件就封,你也太狠了吧。好吧,转向鹅厂,搞了一半突然灵光乍现,为毛不用139邮箱呢?也有smtp,收到邮件还“bang~”给你手机发个短信说邮件收到啦邮件收到啦。于是现在每天点完“执行”按钮后,等着收短信,还是狠开心滴。
  2. 期间遇到一件奇怪的事情,明明使用的126邮箱配置信息,但企鹅邮箱里收到了一封自己qq邮箱发给自己qq邮箱的测试邮件,实在莫名啊。
  3. 在想到使用139邮箱之前,还考虑过使用微信提醒。需要pip装itchat。装好之后发觉达不成自己要的目标,弃用。但似乎可以做不少事情。

3. 现在遇到的问题,今后计划的方案:

  1. firefox启动太慢。每次使用都要磨磨蹭蹭半天firefox才能出来。今后考虑是不是可以不用UI界面,所有这些后台解决。
  2. firefox加载太慢。页面打开了99%,就一个无所谓的小图片或者什么元素的没有加载完成,就是不进行下一步。之前查资料说有什么隐形加载什么的,可以加以改进。
  3. 程序代码傻大粗……还能说啥,慢慢改呗。
  4. 每次都要点太麻烦,后续打算搞下树莓派,每天下午三点自动运行,酱紫,今后就等着收短信就好了。——世界是懒人推动的!
  5. 利用树莓派做个服务器跑下WP,嗯,当然需要用frp做个内网穿透。

4. 代码:

# 1. 工作日志填写
# 2. 张大妈签到
# 3. 发邮件汇报成功


# 0. 导入各种包
import time
import os
import smtplib
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from email.mime.text import MIMEText
from email.header import Header

# 1. 工作日志填写
# 选择浏览器
browser = webdriver.Firefox()
browser.get('http://此处为网址马赛克')


# 检查并输入用户名和密码,然后登陆
user = browser.find_element_by_id("username") #审查元素username的id
user.send_keys("此处为账号马赛克")  #输入账号
password = browser.find_element_by_name("password") #审查元素password的name
password.send_keys("此处为密码马赛克")  #输入密码
user.send_keys(Keys.RETURN) #实现自动点击登陆


# 登陆输入日志界面
browser.get('http://此处为网址2马赛克') # 手动“跳转”


# 查找并输入当前日期
date_now = browser.find_element_by_id("ctl00_MainContent_S_Time")
date_now.send_keys(time.strftime("%Y-%m-%d", time.localtime()))


# 啥都不做,默认选择“上午”


#  以下根据星期判断输入的内容
user = browser.find_element_by_id("ctl00_MainContent_TextBox1") #审查元素username的id
time_week = time.strftime("%w",time.localtime())
if time_week == "1" :
    user.send_keys("周一任务马赛克")  # 输入当日工作日志内容
elif time_week == "2":
    user.send_keys("周二任务马赛克")  # 输入当日工作日志内容
elif time_week == "3":
    user.send_keys("周三任务马赛克") # 输入当日工作日志内容
elif time_week == "4":
    user.send_keys("周四任务马赛克")  # 输入当日工作日志内容
elif time_week == "5":
    user.send_keys("周五任务马赛克")  # 输入当日工作日志内容
else:
    user.send_keys("")  # 输入当日工作日志内容


# 点击按钮,提交日志
browser.find_element_by_id("ctl00_MainContent_Button1").click()


# 重新进入输入日志界面,刷新
browser.get('http://此处为网址2马赛克')


# 查找并输入当前日期
date_now = browser.find_element_by_id("ctl00_MainContent_S_Time")
date_now.send_keys(time.strftime("%Y-%m-%d", time.localtime()))


# 选择“下午”
browser.find_element_by_id("ctl00_MainContent_RadioButtonList1_1").click()


#  以下根据星期判断输入的内容
user = browser.find_element_by_id("ctl00_MainContent_TextBox1") #审查元素username的id
time_week = time.strftime("%w",time.localtime())
if time_week == "1" :
    user.send_keys("周一任务马赛克")  # 输入当日工作日志内容
elif time_week == "2":
    user.send_keys("周二任务马赛克")  # 输入当日工作日志内容
elif time_week == "3":
    user.send_keys("周三任务马赛克") # 输入当日工作日志内容
elif time_week == "4":
    user.send_keys("周四任务马赛克")  # 输入当日工作日志内容
elif time_week == "5":
    user.send_keys("周五任务马赛克")  # 输入当日工作日志内容
else:
    user.send_keys("")  # 输入当日工作日志内容


# 点击按钮,提交日志
browser.find_element_by_id("ctl00_MainContent_Button1").click()
print("工作日志填写成功")


# 2. 张大妈签到
# 输入网址
browser.get('https://zhiyou.smzdm.com/user/login?redirect_to=https://post.smzdm.com/tougao/')


# 检查并输入用户名和密码,然后登陆
user = browser.find_element_by_id("username") #审查元素username的id
user.send_keys("账号马赛克")  #输入账号
password = browser.find_element_by_name("password") #审查元素password的name
password.send_keys("密码马赛克")  #输入密码
user.send_keys(Keys.RETURN) #实现自动点击登陆

time.sleep(2)

browser.get('https://www.smzdm.com/')

button_click = browser.find_element_by_class_name("J_punch").click()
time.sleep(2)
button_click = browser.find_element_by_class_name("J_punch").click()
print("张大妈签到成功")


# 3. 发邮件汇报成功
# 第三方 SMTP 服务
mail_host = "smtp.139.com"  # 设置服务器
mail_user = "邮箱名马赛克"  # 用户名
mail_pass = "邮箱密码马赛克"  # 口令

sender = '发送邮箱马赛克'
receivers = ['接收邮箱马赛克']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱

message = MIMEText('今日任务已完成,OK', 'plain', 'utf-8')
message['From'] = Header("发送邮箱马赛克", 'utf-8')
message['To'] = Header("接收邮箱马赛克", 'utf-8')

subject =  time.strftime("%Y-%m-%d", time.localtime()) + " 任务已完成,大佬请放心!"
message['Subject'] = Header(subject, 'utf-8')


try:
    smtpObj = smtplib.SMTP()
    smtpObj.connect(mail_host, 25)  # 25 为 SMTP 端口号
    smtpObj.login(mail_user, mail_pass)
    smtpObj.sendmail(sender, receivers, message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error: 无法发送邮件")