最近QQ开启了个玩游戏送福气袋活动。
游戏规则,游戏时间大于5s,积分不为0,则有几率获得红包。每个人可以领120。我在想一个人实现的话得玩多久,太浪费时间了,作为自动化的先驱(码农),就想到用代码来实现这一流程。
环境和工具:
windows(python3 + adb)
有最新版QQ的安卓手机
数据线一条
手机中可以运行python的同学,只需要手机就够了,看这里
git源码直通(两个版本都有)
代码:
注释非常详细了,不多解释。
# coding:utf-8
"""
2019年1月28日 刷QQ 福气袋活动脚本
LYM
程序思路:游戏规则,游戏时间大于5s,积分不为0,则有几率获得红包。
据此,天降福运活动。分别点击底部三个按钮,等等游戏结束即可。
其中,代码中出现的数据均以 屏幕为20*1440的手机为例
"""
from PIL import Image
import os
import time
#封装os.system, AOP思想,为满足不同使用者的需求
def shell(str):
str = "adb shell " + str #如果使用adb命令,解开改行注释; 如果直接在手机里跑,注释改行。
os.system(str)
#传入坐标x,y,在屏幕的位置,单位为百分比
def click(x, y):
x = round(x * width)
y = round(y * height)
shell("input tap " + str(x) +" " + str(y))
#获取手机屏幕分辨率,如果已知,可以注释该段,直接赋值
shell("screencap -p /sdcard/screen.png")
os.system("adb pull /sdcard/screen.png") #将图片拉下来,到当前文件夹
img = Image.open("screen.png") #路径改为当前文件
width = img.width #宽
height = img.height #高
shell("rm -rf /sdcard/screen.png")
blessingCount = 0 #记录已经领了多少次福气袋,QQ这次活动120次封顶,到了120 就不用继续运行了
'''
手动打开活动界面,若想实现自动化,参考以下两行
(am start -n com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity
点击福字)
等待5s,点击天降福运
等待5s,点击开始游戏
等待1s,依次点击下面三个按钮
等待12s,游戏结束
if 出现福气袋
点击分享福袋
等待2s,选择分享给谁(点击最近的第一个联系人或群聊)
等待2s,点击发送福气袋
等待2s,点击开启福气袋
等待2s,点击去获取福袋 --> line 39
else
点击再来一局 --> line 41
'''
#打开活动页面
#手动打开,代码略...
#等待5s,点击天降福运
def click_tjfy():
time.sleep(5)
#坐标在(0.9,0.736)* 分辨率处
click(0.9, 0.736)
#等待5s,点击开始游戏
def click_start():
time.sleep(5)
click(0.5, 0.88)
#等待1s,依次点击下面三个按钮
def click_bottom3():
time.sleep(1)
click(0.16, 0.94)
time.sleep(1)
click(0.5, 0.94)
time.sleep(1)
click(0.83, 0.94)
#等待12s,游戏结束
def wait_to_end():
time.sleep(12)
#判断是否出现福气袋:经观察对比,如果出现福气袋,左上角像素只可能为(47,5,6)或(50,8,9)。
def has_blessing():
shell("screencap -p /sdcard/screen.png")
os.system("adb pull /sdcard/screen.png") #将图片拉下来,到当前文件夹
img = Image.open("screen.png") #路径改为当前文件
#'''
for i in range(50,100):
for j in range(50,100):
totalColor = img.getpixel((i,j))[0] + img.getpixel((i,j))[1] + img.getpixel((i,j))[2] #如(251, 188, 86, 255),前三个分别为r,g,b
if totalColor > 80:
return False
return True
#点击分享福袋
def click_share():
click(0.5, 0.7)
#等待2s,点击最近的第一个联系人或群聊
def select_who_to_share():
time.sleep(2)
click(0.5, 0.43) #最近的第一个
#click(0.5, 0.5) #最近的第二个
#等待2s,点击发送福气袋
def send_blessing():
time.sleep(2)
click(0.7, 0.78)
#等待2s,点击开启福气袋
def open_blessing():
time.sleep(2)
click(0.55, 0.74)
#等待2s,点击去获取福袋
def go_to_get_blessing():
time.sleep(2)
click(0.7, 0.8)
#点击再来一局
def click_restart():
click(0.5, 0.72)
if __name__=="__main__":
#等待5s,点击天降福运
click_tjfy()
#等待5s,点击开始游戏
click_start()
while(True):
#等待1s,依次点击下面三个按钮
click_bottom3()
#等待12s,游戏结束
wait_to_end()
#判断是否出现福气袋:经观察对比,如果出现福气袋,左上角像素只可能为(47,5,6)或(50,8,9)。
if has_blessing():
#点击分享福袋
click_share()
#等待2s,点击最近的第一个联系人或群聊
select_who_to_share()
#等待2s,点击发送福气袋
send_blessing()
#等待2s,点击开启福气袋
open_blessing()
#等待2s,点击去获取福袋
go_to_get_blessing()
open_blessing()
blessingCount = blessingCount + 1
if blessingCount > 120:
shell("rm -rf /sdcard/screen.png")#删掉截图,释放占用的空间
sys.exit()
#等待5s,点击天降福运
click_tjfy()
#等待5s,点击开始游戏
click_start()
else:
#点击再来一局
click_restart()