Dukou网站自动化签到

1 问题需求

登陆Dukou网站,点击签到按钮,每天执行此操作。

2 解决

解决方法有两个:

  1. 利用selenium编写浏览器爬虫,模拟执行操作;然后利用Windows自带的任务计划程序实现定时执行爬虫;
  2. 编写ios快捷指令

2.1 Windows自动执行

2.1.1 爬虫脚本

参考python用selenium爬取百度搜索结果

dukou_sign_in.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By


def dukou_sign():
# 无头浏览器设置
co = webdriver.ChromeOptions()
co.headless = False
browser = webdriver.Chrome(options=co)

# 登陆
browser.implicitly_wait(20) # 如果找不到元素,每隔半秒钟再去界面上查看一次, 直到找到该元素, 或者过了20秒最大时长。
url = 'https://dukou.icu/user/index' # 目标网站
browser.get(url)
sleep(5)
username = "xxx" # dukou用户名
password = "xxx" # dukou密码
browser.find_element(by=By.ID, value="email").send_keys(username) # 输入框
browser.find_element(by=By.ID, value="passwd").send_keys(password) #
browser.find_element(by=By.XPATH, value='//*[@id="formLogin"]/div[3]/div/div/span/button').click() # 点击登陆按钮

# 进行签到
sleep(5)
browser.find_element(by=By.XPATH, value='//*[@id="app"]/section/section/main/div/div[2]/div/div/div/div[2]/div[3]'
'/div/div/button[1]').click() # 点击签到
# 停止爬虫
browser.quit()


if __name__ == "__main__":
dukou_sign()

selenium打开指定URL后,需要登陆:

图片名称

在此页面按F12,找到对应输入框的id

图片名称

然后通过ID定位element,并发送对应内容:

1
2
browser.find_element(by=By.ID, value="email").send_keys(username)
browser.find_element(by=By.ID, value="passwd").send_keys(password)

下一步点击确定按钮,通过XPATH定位element,并进行点击:

图片名称
1
browser.find_element(by=By.XPATH, value='//*[@id="formLogin"]/div[3]/div/div/span/button').click()

登陆后,点击签到按钮与上面点击确定按钮类似:

1
2
browser.find_element(by=By.XPATH, value='//*[@id="app"]/section/section/main/div/div[2]/div/div/div/div[2]/div[3]'
'/div/div/button[1]').click() # 点击签到

2.1.2 消息通知脚本

爬虫脚本执行完,需要消息提醒,提高体验。

通过 win10toast 实现在 Win10 系统中发送桌面消息通知,参考

安装 win10toast:

1
pip install win10toast

代码:

1
2
3
4
5
6
7
8
9
10
11
from win10toast import ToastNotifier

toaster = ToastNotifier()
toaster.show_toast("Dukou自动签到",
"签到成功!",
icon_path="./img/dukou.ico",
duration=60*60*6)


if __name__ == "__main__":
pass

但是这种方法发送的消息会在一定的时间内消失(由参数duration指定,单位是秒),不会在管理通知中保存;如果将参数duration改的足够大,消息可以"永存",但是后台会持续运行该程序,不太理想。

下面的程序解决了上面的问题,参考how to storage notifications into Action center

dukou_notice.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from winrt.windows.ui.notifications import ToastNotificationManager, ToastNotification
import winrt.windows.data.xml.dom as dom

notifier = ToastNotificationManager.create_toast_notifier(r'D:\developer\Python\python399\python.exe') # python程序路径

title = "Dukou自动签到"
desp = "签到成功!"
tString = """<toast duration='short'><audio src = 'ms-winsoundevent:Notification.Reminder' loop = 'false' silent = 'false'/><visual><binding template='ToastText02'><text id="1">""" + title + """</text><text id="2">""" + desp + """</text></binding></visual></toast>"""

xDoc = dom.XmlDocument()
xDoc.load_xml(tString)
notifier.show(ToastNotification(xDoc))


if __name__ == "__main__":
pass

注意dukou_notice.py 脚本不能与 dukou_sign_in.py 脚本合在一个文件内,否则会报错:

1
2
_winrt.init_apartment()
RuntimeError: 无法在设置线程模式后对其加以更改。

2.1.3 定时执行脚本

使用Windows自带的任务计划程序实现定时执行脚本,具体参考 Window自带的定时自动执行程序

  1. 在Windows搜索框输入任务计划程序找到这个软件并打开;

  2. 点击创建任务

    图片名称
  3. 常规部分,填写名称,勾选不管用户是否登录都要运行以及 使用最高权限运行

    图片名称
  4. 触发器部分,选择合适的触发条件:

    图片名称
  5. 操作部分,这里运行的程序或者脚本,最好直接选择个bat来执行(bat名称和路径分开放),执行exe有时候会出错,bat里设置的是要执行的Python脚本(bat与python脚本同目录下):

    图片名称

    dukou.bat

    1
    2
    python dukou_sign_in.py
    python dukou_notice.py
  6. 条件设置部分默认即可,然后点击确定即可,前端界面已经出现了设置的任务:

    图片名称
  7. 到此已经完成问题需求。

2.2 ios快捷指令(未实现)