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⼤神提供的源码,秀排⾏榜图⼀张!

更多推荐

微信跳一跳辅助