mac自动定时签到

因为用的某某上网网站有一个签到的功能,可以获取流量,因此想做一个自动签到的自动化脚本来完全摆脱手动签到。

功能列表

  • 选择适合的chrome webdriver
  • 登录
  • 签到
  • 用mac的crontab定时执行
  • 成功后自动发送状态邮件
  • 用log来记录是否成功签到

选择合适的chrome webdriver

根据不同的系统来自动下载合适的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("驱动解压成功!")

调用chrome来自动登录并签到

# 自动登录
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()

使用mac的crontab自动定时执行

crontab是mac自带的一个自动定时执行的程序,可以简单配置crontab脚本来进行自动定时执行。

初始化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定时程序

一个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列表

清空本地mail

有时候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减少重复调用

使用在本地写入执行日志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,检查当天是否成功执行,如果已有当天记录则脚本结束运行。

你可能感兴趣的:(娱乐)