因为用的某某上网网站有一个签到的功能,可以获取流量,因此想做一个自动签到的自动化脚本来完全摆脱手动签到。
根据不同的系统来自动下载合适的chrome
# 下载chromedriver
def download_driver():
opt_system = platform.system()
request = urllib.request.Request('http://npm.taobao.org/mirrors/chromedriver/')
response = urllib.request.urlopen(request)
html = response.read()
r = re.compile(r'/mirrors/chromedriver/(.+?)/')
result = r.findall(str(html))
flag = 0
if opt_system == 'Darwin':
command = r'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version'
s = os.popen(command).read().strip()
version = s.split(" ")[2].split(".")
else:
command = r'reg query "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome" /v DisplayVersion'
s = os.popen(command).read().strip()
version = s.split(" ")[-1].split(".")
if int(version[0]) <= 69:
chrome_version = driver_version[version[0]]
else:
chrome_version = version[0] + '.' + version[1] + '.' + version[2]
for item in result:
if chrome_version in item:
flag = item
break
print("正在下载驱动......")
if opt_system == 'Darwin':
os.system(
"curl -O -L http://npm.taobao.org/mirrors/chromedriver/{0}/chromedriver_mac64.zip".format(
flag))
print("驱动下载成功")
os.system("unzip -o chromedriver_mac64.zip")
else:
run("curl -O -L http://npm.taobao.org/mirrors/chromedriver/{0}/chromedriver_win32.zip".format(
flag), shell=True)
print("驱动下载成功")
unzip('chromedriver_win32.zip')
print("驱动解压成功!")
# 自动登录
def login_and_checkin():
# 自动下载的chromedriver的位置
path = os.path.join(os.getcwd(), 'chromedriver')
# 添加chromeoptions
options = ChromeOptions()
options.add_experimental_option('detach', True)
driver = webdriver.Chrome(executable_path=path, options=options)
driver.get("https://******/auth/login")
time.sleep(1)
account = '***************'
password = '**************'
# 获取email address的元素
driver.find_element_by_id('email').send_keys(account)
time.sleep(1)
driver.find_element_by_id('passwd').send_keys(password)
time.sleep(2)
driver.find_element_by_id('login').click()
time.sleep(3)
driver.get("https://*******/user")
time.sleep(1)
try:
driver.find_element_by_id('checkin').click()
time.sleep(1)
print(str(datetime.today()))
print('网站签到成功')
except Exception as e:
print(str(datetime.today()))
print('网站已完成签到')
driver.close()
driver.quit()
crontab是mac自带的一个自动定时执行的程序,可以简单配置crontab脚本来进行自动定时执行。
第一次使用crontab的话需要进行配置,打开mac的terminal。
# 定时任务统统由 launchctl 来管理的,看看 cron 任务有没有在里面
sudo launchctl list | grep cron
# 有记录。查看一下启动项的配置
locate com.vix.cron
# 创建一个database
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
# 查看 /etc/crontab 是否存在,文中用ll,我这没有此命令,用下面代替
ls -alF /etc/crontab
# 创建该文件
sudo touch /etc/crontab
依次键入如上命令建立一个crontab的配置文件
一个crontab的定时程序的格式如下:
* * * * * 命令
其中,前面的五个星号代表不同的时间参数,具体参数如下:
* | * | * | * | * |
---|---|---|---|---|
分钟 | 小时 | 日 | 月 | 星期 |
0-59 | 0-23 | 1-31 | 1-12 | 0-6 |
我们先使用
crontab -e
打开crontab任务列表,这里使用vim来进行保存
例如可以键入:
49 19 * * * /usr/local/bin/python3.7 /Users/admin/test.py
即在每天19:49分执行test.py的python脚本
保存后如果看到
crontab: installing new crontab
即可。
其python执行输出的命令控制行会存放在/var/mail/username
最后可以通过
crontab -l
查看crontab列表
有时候crontab输出会存放在本地mail中
找到/var/mail/username
用vim打开
输入gg定位行首
dG清空
def send_email(flag):
if flag ==0:
return
# 第三方 SMTP 服务
mail_host = "smtp.163.com" # 设置服务器
mail_user = "********" # 用户名
mail_pass = "********" # 口令
sender = r'user'
receivers = [r'user'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 可以变成list
for i in range(0,len(receivers)):
message = MIMEText('今日成功登录', 'plain', 'utf-8')
message['Accept-Language'] = 'zh-CN'
message['Accept-Charset'] = 'ISO-8859-1,utf-8'
message['From'] = sender
message['To'] = receivers[i]
#message['Cc'] = sender
subject = '自动签网站'
message['Subject'] = Header(subject, 'utf-8')
#print(message)
print('尝试发送邮件给:'+receivers[i])
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
smtpObj.login(mail_user, mail_pass)
smtpObj.sendmail(sender, receivers[i], message.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print(e)
print("Error: 无法发送邮件")
使用在本地写入执行日志log来检测当天是否已经成功签到,减少重复执行。
读写日志的方法:
def read_log():
with open('*.pkl','rb') as f:
return pickle.load(f)
def write_log(d):
with open('*.pkl','wb') as f:
pickle.dump(d,f,pickle.HIGHEST_PROTOCOL)
每次调用脚本前都会先读一下本地的log,检查当天是否成功执行,如果已有当天记录则脚本结束运行。