微信跳一跳指令碼重出江湖,python實現安卓&iOS自動版與手動版!

諸葛青雲h發表於2018-09-14

前面一段時間在GitHub上看到有人利用Python玩一款名為“跳一跳”的微信小程式,於是打算自己也來試一試,畢竟這款小遊戲最近吸引了眾多人的目光。

strip

演示工具

電腦系統:Win10

Python版本:2.7.13(64位)

環境配置

Step1:安裝Python

安裝Python2.7並新增到環境變數中。

Step2:配置adb

將相關檔案中提供的adb.zip檔案解壓,將解壓後的資料夾新增到環境變數中。

(Win10系統:右鍵“此電腦”→“屬性”→“高階系統設定”→“環境變數”→雙擊“Path”,將adb資料夾的路徑新增進去即可。)

例如下圖:

1240

新增成功後在cmd視窗輸入adb會有類似如下圖所示的顯示:

1240

Step3:安裝依賴庫

解壓相關檔案中提供的wechat_jump_game.rar檔案。cmd視窗切換到解壓後的資料夾內後輸入pip install -r requirements.txt耐心等待相關依賴庫安裝完成即可。

如下圖所示:

1240


1240


小編給大家推薦一個學習氛圍超好的地方,python交流企鵝裙:【6.1.1,五三零,1.0.1】!適合在校大學生,小白,想轉行,想通過這個找工作的加入。裙裡有大量學習資料,有大神解答交流問題,每晚都有免費的直播課程



使用演示

一、安卓手機(已成功)

cmd視窗中路徑保持在wechat_jump_game不變。

Step1:

將安卓手機與電腦連線並開啟安卓手機的USB除錯(安全模式)。(請根據機型和系統自行百度開啟方式。)

Step2:

手機端開啟微信小程式“跳一跳”並點選“開始遊戲”。

Step3:

電腦端在cmd視窗中輸入:

python wechat_jump_auto.py即可。

如下圖所示:

1240

此時你可以發現小人已經自己開始跳起來了!

可能剛開始上手的時候,因為時間距離之間的關係把握不恰當,只能跳出幾個就掉到了臺子下面。如果能利用影像識別精確測量出起始和目標點之間測距離,就可以估計按壓的時間來精確跳躍。

1240

程式碼分iOS與安卓

# -*- coding: utf-8 -*-

from __future__ import print_function, division

import os

import time

import datetime

import matplotlib.pyplot as plt

import matplotlib.animation as animation

import cv2

VERSION = “1.1.4”

scale = 0.25

template = cv2.imread(`./resource/image/character.png`)

template = cv2.resize(template, (0, 0), fx=scale, fy=scale)

template_size = template.shape[:2]

def search(img):

result = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

cv2.rectangle(

img,

(min_loc[0], min_loc[1]),

(min_loc[0] + template_size[1], min_loc[1] + template_size[0]),

(255, 0, 0),

4)

return img, min_loc[0] + template_size[1] / 2, min_loc[1] + template_size[0]

def pull_screenshot():

filename = datetime.datetime.now().strftime(“%H%M%S”) + `.png`

os.system(`mv autojump.png {}`.format(filename))

os.system(`adb shell screencap -p /sdcard/autojump.png`)

os.system(`adb pull /sdcard/autojump.png ./autojump.png`)

def jump(distance):

press_time = distance * 1.35

press_time = int(press_time)

cmd = `adb shell input swipe 320 410 320 410 ` + str(press_time)

print(cmd)

os.system(cmd)

def update_data():

global src_x, src_y

img = cv2.imread(`./autojump.png`)

img = cv2.resize(img, (0, 0), fx=scale, fy=scale)

img, src_x, src_y = search(img)

return img

fig = plt.figure()

pull_screenshot()

img = update_data()

im = plt.imshow(img, animated=True)

update = True

def updatefig(*args):

global update

if update:

time.sleep(1)

pull_screenshot()

im.set_array(update_data())

update = False

return im,

def on_click(event):

global update

global src_x, src_y

dst_x, dst_y = event.xdata, event.ydata

distance = (dst_x – src_x)**2 + (dst_y – src_y)**2

distance = (distance ** 0.5) / scale

print(`distance = `, distance)

jump(distance)

update = True

fig.canvas.mpl_connect(`button_press_event`, on_click)

ani = animation.FuncAnimation(fig, updatefig, interval=5, blit=True)

plt.show()

# -*- coding: utf-8 -*-

import time

import wda

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.animation as animation

from PIL import Image

# 截圖距離 * time_coefficient = 按鍵時長

# time_coefficient:

# iphonex: 0.00125

# iphone6: 0.00196

# iphone6s plus: 0.00120

time_coefficient = 0.00120

VERSION = “1.1.4”

c = wda.Client()

s = c.session()

def pull_screenshot():

c.screenshot(`autojump.png`)

def jump(distance):

press_time = distance * time_coefficient

press_time = press_time

print(`press_time = `,press_time)

s.tap_hold(200, 200, press_time)

fig = plt.figure()

pull_screenshot()

img = np.array(Image.open(`autojump.png`))

im = plt.imshow(img, animated=True)

update = True

click_count = 0

cor = []

def update_data():

return np.array(Image.open(`autojump.png`))

def updatefig(*args):

global update

if update:

time.sleep(1)

pull_screenshot()

im.set_array(update_data())

update = False

return im,

def on_click(event):

global update

global ix, iy

global click_count

global cor

ix, iy = event.xdata, event.ydata

coords = [(ix, iy)]

print(`now = `, coords)

cor.append(coords)

click_count += 1

if click_count > 1:

click_count = 0

cor1 = cor.pop()

cor2 = cor.pop()

distance = (cor1[0][0] – cor2[0][0])**2 + (cor1[0][1] – cor2[0][1])**2

distance = distance ** 0.5

print(`distance = `, distance)

jump(distance)

update = True

fig.canvas.mpl_connect(`button_press_event`, on_click)

ani = animation.FuncAnimation(fig, updatefig, interval=50, blit=True)

plt.show()

原理說明

由於微信檢測非常嚴厲,這裡的防禁程式碼可能已經不起作用,主要供學習用途

將手機點選到《跳一跳》小程式介面

用 ADB 工具獲取當前手機截圖,並用 ADB 將截圖 pull 上來

adb shell screencap -p /sdcard/autojump.png

adb pull /sdcard/autojump.png .

計算按壓時間

手動版:用 Matplotlib 顯示截圖,用滑鼠先點選起始點位置,然後點選目標位置,計算畫素距離;

自動版:靠棋子的顏色來識別棋子,靠底色和方塊的色差來識別棋盤;

用 ADB 工具點選螢幕蓄力一跳

adb shell input swipe x y x y time(ms)

使用教程

相關軟體工具安裝和使用步驟請參考 Android 和 iOS 操作步驟

PS:

如果螢幕解析度不能成功探測,請按照你的手機解析度從相應的config資料夾將config.json檔案拷貝到 *.py 同級目錄(wechat_jump_game下)。

二、蘋果手機(未嘗試)

蘋果手機需要配置WebDriverAgentRunner,本人不使用Mac,因此無法測試程式碼的有效性。在相關檔案中,本人也提供了一份CSDN中積分下載的WebDriverAgent.rar檔案,有需要者可參考相關網路資料進行配置。

執行WebDriverAgentRunner並開啟微信“跳一跳”程式介面。

Step2:

執行指令碼。有兩種模式可供選擇:

(1)手動輔助跳:

①命令列輸入:

python3 wechat_jump_iOS_py3.py後回車執行;

②依次點選彈出視窗中的起始位置和目標位置,程式會自動計算距離後起跳;

③根據起跳的精準性更改原始碼中的time_coefficient引數,直到獲得最佳取值。

(2)自動連續跳:

①命令列輸入:

python3 wechat_jump_auto_iOS.py後回車執行;

②根據起跳的精準性更改機型對應的config.json 檔案中的press_coefficient引數,直到獲得最佳取值。

PS:

如果螢幕解析度不能成功探測,處理方式與安卓手機中的處理方式類似。

1240


相關文章