2020年04月08日
虽然程序才20几行,但包括配置服务器环境什么的,前前后后也写了好几天
PS:程序运行于ubuntu18.04的阿里云服务器上(有图形化界面,且安装了Chrome,ChromeDriver),最后面附有windows版程序
csdn用selenium打开的话,是不能用账号密码实现自动登录的,因为会有一个滑动验证码,
我们手动操作都验证不过的那种,所以不能用账号密码登录,那么只能我们先登录,让浏览器记住我们登录的状态
(这样也就隔绝批量登录签到的想法了,但用于个人签到还是没问题的,话说我也只有一个账号)。
如果用webdriver.Chrome()
直接打开,浏览器是没有记住我们的登陆状态的,
要用google-chrome --remote-debugging-port=3353
这种方式,然后再和我们的selenium进行对接,
再然后跳到签到的页面,签到的按钮在源代码中是个div块,没法直接点击,可以获取其坐标,模拟鼠标点击其中间位置完成签到,关闭浏览器,搞定。
最后弄个定时签到,如果用ubuntu自带的crontab自动签到,会出现比较多问题,,,有兴趣再自己尝试吧
我直接在代码里用apscheduler实现定时的功能。
import subprocess
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from apscheduler.schedulers.background import BackgroundScheduler
def check_in():
p = subprocess.Popen(["google-chrome","--remote-debugging-port=3353"])
print('等待浏览器打开完毕...')
time.sleep(5)
options = webdriver.ChromeOptions()
options.debugger_address = "127.0.0.1:3353"
browser = webdriver.Chrome(options=options)
browser.get('https://i.csdn.net/#/uc/reward')
check_in = browser.find_element_by_xpath("//div[@class='handle_box to_sign']")
ActionChains(browser).move_by_offset(check_in.location['x']+check_in.size['width']/2, check_in.location['y']+check_in.size['height']/2).click().perform()
time.sleep(2)
p.kill()
if __name__ == '__main__':
scheduler = BackgroundScheduler()
scheduler.add_job(check_in, 'cron', hour='4',minute='0')
scheduler.start()
while True:
time.sleep(999)
后台运行
nohup python -u /home/rrr/PycharmProjects/ubuntu/CSDN/check_in.py >> /home/rrr/Desktop/log 2>&1 &
这样每天晚上的4点就会进行自动签到了。
(每5天能抽奖一次,可我每次都是打酱油,等我攒它好多次再抽试试 ^_^)
有什么问题的话,欢迎评论交流。
我个人的一个理解
p = subprocess.Popen(r'google-chrome --remote-debugging-port=3353', shell=True)
以shell=True的方式虽然能打开,但是p.kill()却杀不掉进程(浏览器)。
因为(打开浏览器的)进程1打开了浏览器这一进程2,进程1打开浏览器后也就结束了,但是进程2却始终还在运行,kill已经结束了的进程1就没有意义了。
p = subprocess.Popen(["google-chrome","--remote-debugging-port=3353"])
以["google-chrome","--remote-debugging-port=3353"]这一方式打开,浏览器这一进程就赋值给了p,kill掉p进程浏览器自然也就关掉了。
考虑到windows用得比较多,做个示例,大家可以复制下面的程序到PyCharm运行。(记得把chrome.exe的路径换成你们的,并且安装ChromeDriver)
import subprocess
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
p = subprocess.Popen(["C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "--remote-debugging-port=3353"])
print('等待浏览器打开完毕...')
time.sleep(5)
options = webdriver.ChromeOptions()
options.debugger_address = "127.0.0.1:3353"
browser = webdriver.Chrome(options=options)
browser.get('https://i.csdn.net/#/uc/reward')
check_in = browser.find_element_by_xpath("//div[@class='handle_box to_sign']")
ActionChains(browser).move_by_offset(check_in.location['x']+check_in.size['width']/2, check_in.location['y']+check_in.size['height']/2).click().perform()
time.sleep(2)
p.kill()