msxml 6 10 1129 0-酷狗音乐盒子
2023年4月3日发(作者:adobefireworks)
微信跳⼀跳,Python辅助⾃动跳程序
⼀、说明
此代码借鉴⼀位⼤神提供在gitHub上的源码,已经做了简化合并处理,成功连上⼿机并运⾏后,可实现⾃动玩微信跳⼀跳游戏,刷个1000+的分数轻轻松松
实际运⾏,以下代码可能需要修改,github源码配置⽂件中有不同⼿机不同分辨率配置的参数,以下是本⼈⼿机1080*1920华为⼿机参数配置,其它⼿机配置可⾃⼰查看源码或者更
改参数慢慢试或者留⾔咨询,楼主会在看到的第⼀时间回复,源码也提供ios系统辅助,有需要的同学可⾃⼰研究
#分数y坐标
under_game_score_y=300
#长按的时间系数,请⾃⼰根据实际情况调节
press_coefficient=1.392
#⼆分之⼀的棋⼦底座⾼度,可能要调节
piece_base_height_1_2=20
#棋⼦的宽度,⽐截图中量到的稍微⼤⼀点⽐较安全,可能要调节
piece_body_width=70
⼆、实现思路介绍
1.通过adb命令从⼿机截图并拷贝⾄电脑
2.通过核⼼算法find_piece_and_board,找到棋⼦当前坐标和应跳坐标
3.计算2中两点坐标,计算按压时间,通过adb向⼿机发送操作命令
4.重复1、2、3步骤
三、贴上完整源码:
只⼀个python⽂件,名字⾃定义(如:wechat_jump_auto),Python3.6完美运⾏!
#-*-coding:utf-8-*-
"""
===思路===
核⼼:每次落稳之后截图,根据截图算出棋⼦的坐标和下⼀个块顶⾯的中点坐标,
根据两个点的距离乘以⼀个时间系数获得长按的时间
识别棋⼦:靠棋⼦的颜⾊来识别位置,通过截图发现最下⾯⼀⾏⼤概是⼀条
直线,就从上往下⼀⾏⼀⾏遍历,⽐较颜⾊(颜⾊⽤了⼀个区间来⽐较)
找到最下⾯的那⼀⾏的所有点,然后求个中点,求好之后再让Y轴坐标
减⼩棋⼦底盘的⼀半⾼度从⽽得到中⼼点的坐标
识别棋盘:靠底⾊和⽅块的⾊差来做,从分数之下的位置开始,⼀⾏⼀⾏扫描,
由于圆形的块最顶上是⼀条线,⽅形的上⾯⼤概是⼀个点,所以就
⽤类似识别棋⼦的做法多识别了⼏个点求中点,这时候得到了块中点的X
轴坐标,这时候假设现在棋⼦在当前块的中⼼,根据⼀个通过截图获取的
固定的⾓度来推出中点的Y坐标
最后:根据两点的坐标算距离乘以系数来获取长按时间(似乎可以直接⽤X轴距离)
"""
from__future__importprint_function,division
importos
importsys
importtime
importmath
importrandom
fromPILimportImage
importsubprocess
#分数y坐标
under_game_score_y=300
#长按的时间系数,请⾃⼰根据实际情况调节
press_coefficient=1.392
#⼆分之⼀的棋⼦底座⾼度,可能要调节
piece_base_height_1_2=20
#棋⼦的宽度,⽐截图中量到的稍微⼤⼀点⽐较安全,可能要调节
piece_body_width=70
defset_button_position(im):
"""
将swipe设置为`再来⼀局`按钮的位置
"""
globalswipe_x1,swipe_y1,swipe_x2,swipe_y2
w,h=
left=int(w/2)
top=int(1584*(h/1920.0))
left=int(m(left-50,left+50))
top=int(m(top-10,top+10))#随机防ban
swipe_x1,swipe_y1,swipe_x2,swipe_y2=left,top,left,top
defjump(distance):
"""
跳跃⼀定的距离
"""
press_time=distance*press_coefficient
press_time=max(press_time,200)#设置200ms是最⼩的按压时间
press_time=int(press_time)
cmd='adbshellinputswipe{x1}{y1}{x2}{y2}{duration}'.format(
x1=swipe_x1,
y1=swipe_y1,
x2=swipe_x2,
y2=swipe_y2,
duration=press_time
)
print(cmd)
(cmd)
returnpress_time
deffind_piece_and_board(im):
"""
寻找关键坐标
"""
w,h=
piece_x_sum=0
piece_x_c=0
piece_y_max=0
board_x=0
board_y=0
scan_x_border=int(w/8)#扫描棋⼦时的左右边界
scan_start_y=0#扫描的起始y坐标
im_pixel=()
#以50px步长,尝试探测scan_start_y
foriinrange(int(h/3),int(h*2/3),50):
last_pixel=im_pixel[0,i]
forjinrange(1,w):
pixel=im_pixel[j,i]
#不是纯⾊的线,则记录scan_start_y的值,准备跳出循环
ifpixel!=last_pixel:
scan_start_y=i-50
break
ifscan_start_y:
break
print('scan_start_y:{}'.format(scan_start_y))
#从scan_start_y开始往下扫描,棋⼦应位于屏幕上半部分,这⾥暂定不超过2/3
foriinrange(scan_start_y,int(h*2/3)):
#横坐标⽅⾯也减少了⼀部分扫描开销
forjinrange(scan_x_border,w-scan_x_border):
pixel=im_pixel[j,i]
#根据棋⼦的最低⾏的颜⾊判断,找最后⼀⾏那些点的平均值,这个颜
#⾊这样应该OK,暂时不提出来
if(50
and(53
and(95
piece_x_sum+=j
piece_x_c+=1
piece_y_max=max(i,piece_y_max)
ifnotall((piece_x_sum,piece_x_c)):
return0,0,0,0
piece_x=int(piece_x_sum/piece_x_c)
piece_y=piece_y_max-piece_base_height_1_2#上移棋⼦底盘⾼度的⼀半
#限制棋盘扫描的横坐标,避免⾳符bug
ifpiece_x
board_x_start=piece_x
board_x_end=w
else:
board_x_start=0
board_x_end=piece_x
foriinrange(int(h/3),int(h*2/3)):
last_pixel=im_pixel[0,i]
ifboard_xorboard_y:
break
board_x_sum=0
board_x_c=0
forjinrange(int(board_x_start),int(board_x_end)):
pixel=im_pixel[j,i]
#修掉脑袋⽐下⼀个⼩格⼦还⾼的情况的bug
ifabs(j-piece_x)
continue
#修掉圆顶的时候⼀条线导致的⼩bug,这个颜⾊判断应该OK,暂时不提出来
ifabs(pixel[0]-last_pixel[0])
+abs(pixel[1]-last_pixel[1])
+abs(pixel[2]-last_pixel[2])>10:
board_x_sum+=j
board_x_c+=1
ifboard_x_sum:
board_x=board_x_sum/board_x_c
last_pixel=im_pixel[board_x,i]
#从上顶点往下+274的位置开始向上找颜⾊与上顶点⼀样的点,为下顶点
#该⽅法对所有纯⾊平⾯和部分⾮纯⾊平⾯有效,对⾼尔夫草坪⾯、⽊纹桌⾯、
#药瓶和⾮菱形的碟机(好像是)会判断错误
forkinrange(i+274,i,-1):#274取开局时最⼤的⽅块的上下顶点距离
pixel=im_pixel[board_x,k]
ifabs(pixel[0]-last_pixel[0])
+abs(pixel[1]-last_pixel[1])
+abs(pixel[2]-last_pixel[2])<10:
break
board_y=int((i+k)/2)
#如果上⼀跳命中中间,则下个⽬标中⼼会出现r245g245b245的点,利⽤这个
#属性弥补上⼀段代码可能存在的判断错误
#若上⼀跳由于某种原因没有跳到正中间,⽽下⼀跳恰好有⽆法正确识别花纹,则有
#可能游戏失败,由于花纹⾯积通常⽐较⼤,失败概率较低
forjinrange(i,i+200):
pixel=im_pixel[board_x,j]
ifabs(pixel[0]-245)+abs(pixel[1]-245)+abs(pixel[2]-245)==0:
board_y=j+10
break
ifnotall((board_x,board_y)):
return0,0,0,0
returnpiece_x,piece_y,board_x,board_y
defpull_screenshot():
('adbshellscreencap-p/sdcard/')
('adbpull/sdcard/.')
defcheck_screenshot():
#检查获取截图的⽅式
(''):
('')
pull_screenshot()
('./').load()
defmain():
check_screenshot()
i,next_rest,next_rest_time=(0,nge(3,10),
nge(5,10))
whileTrue:
pull_screenshot()
im=('./')
#获取棋⼦和board的位置
piece_x,piece_y,board_x,board_y=find_piece_and_board(im)
ts=int(())
print(ts,piece_x,piece_y,board_x,board_y)
set_button_position(im)
jump(((board_x-piece_x)**2+(board_y-piece_y)**2))
()
i+=1
ifi==next_rest:
print('已经连续打了{}下,休息{}s'.format(i,next_rest_time))
forjinrange(next_rest_time):
('r程序将在{}s后继续'.format(next_rest_time-j))
()
(1)
print('n继续')
i,next_rest,next_rest_time=(0,nge(30,100),
nge(10,60))
#为了保证截图的时候应落稳了,多延迟⼀会⼉,随机值防ban
(m(0.9,1.2))
if__name__=='__main__':
main()
四、补充
继上⼀篇,需要⼿机开发者模式和电脑adb⽀持,以上代码楼主亲测可⽤,已成功刷了1505好友排⾏第⼀的分数
业余爱好,不⾜之处请不吝指正,欢迎留⾔交流!
最后感谢github⼤神提供的源码,秀排⾏榜图⼀张!
更多推荐
微信跳一跳辅助
发布评论