背景:
Dnf的周年庆活动之一,鬼才策划为了在线率想的活动,规律如下
1.在线1分钟可以生成1根竹子,领取竹子以后可以获取到积分,积分满足活动要求后可以领取相应档位的奖励
2.玩家不在线期间,不会生成新竹子(最坑的一点)
3.竹子的存储上限为20,也就是说20分钟就要收割一次
为了最快领取到奖励,只好出个下策,自动化领竹子,晚上挂通宵,写文章的这会已经完成指标....
思路:
运用python中的pyautogui模块控制鼠标自动打开活动界面,点击领取,关闭界面,为了方便写了死循环,所以需要利用cmd打开py脚本,需要结束运行脚本时ctrl+c停止运行即可
优势:在不移动游戏界面的情况下游戏内窗口控件所处的相对位置不会改变,利用pyautogui模块点击相应坐标即可实现自动化
劣势:游戏断线重连,直接扑街·。
难处:游戏在12点会弹出公告界面,若不处理公告界面,养竹活动的界面层级并没有公告界面高,脚本会被遮挡,无法运行
解决方案:定时执行关闭公告界面的脚本,执行完毕后继续执行挂机领竹脚本
代码:
获取鼠标当前位置信息,代码如下
import pyautogui
print(pyautogui.position())
使用cmd运行上述脚本,在运行前将鼠标移动到需要定位的坐标,然后直接回车,会打印当前的鼠标坐标
领取代码如下
import datetime
import pyautogui
import time
import random
def time_timer(now_time):
next_time = datetime.datetime.strptime("2019-6-21 0:00:00", "%Y-%m-%d %H:%M:%S")
timer_start_time = (next_time - now_time).total_seconds()
return timer_start_time
def pyautogui_dnf(now_time):
#主体:打开养竹活动界面,领取竹子,退出界面
print("开始执行,当前系统时间: %s" % now_time)
#坐标1:点击竹子的小图标
pyautogui.click(1025, 855)
pyautogui.mouseDown()
pyautogui.mouseUp()
time.sleep(5)
# 坐标2:点击领取按钮
pyautogui.click(1034, 723)
pyautogui.mouseDown()
pyautogui.mouseUp()
# 坐标3:点击关闭按钮关闭活动界面
pyautogui.click(1320, 248)
pyautogui.mouseDown()
pyautogui.mouseUp()
c = random.randint(600,1200)
print("执行完毕,开始休眠,%s"%(datetime.timedelta(seconds=c)))
time.sleep(c)
def tomrrow_Refresh(now_time):
#点击公告下的确定按钮
pyautogui.click(944, 713)
pyautogui.mouseDown()
pyautogui.mouseUp()
print("已关闭公告,继续执行")
time.sleep(5)
#死循环继续执行领竹子的脚本
while True:
pyautogui_dnf(now_time)
def main_pyauto():
while True:
now_time = datetime.datetime.now()
d = time_timer(now_time)
if d > 0:
print("距离公告弹窗时间还有%s秒" % (int(d)))
pyautogui_dnf(now_time)
else:
print("关闭公告")
tomrrow_Refresh(now_time)
if __name__ == "__main__":
main_pyauto()
之所以使用随机数,是因为如果20分钟点一下太稳定,我怕被封号....
总之,两天领完了所有奖励,可喜可贺....吧