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

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

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

演示工具(私信小編007即自動獲取大量Python視頻教程以及各類PDF!)

電腦系統:Win10

Python版本:2.7.13(64位)

環境配置

Step1:安裝Python

安裝Python2.7並添加到環境變量中。

Step2:配置adb

將相關文件中提供的adb.zip文件解壓,將解壓後的文件夾添加到環境變量中。

(Win10系統:右鍵“此電腦”→“屬性”→“高級系統設置”→“環境變量”→雙擊“Path”,將adb文件夾的路徑添加進去即可。)

例如下圖:

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

添加成功後在cmd窗口輸入adb會有類似如下圖所示的顯示:

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

Step3:安裝依賴庫

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

如下圖所示:

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

使用演示

一、安卓手機(已成功)

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

Step1:

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

Step2:

手機端打開微信小程序“跳一跳”並點擊“開始遊戲”。

Step3:

電腦端在cmd窗口中輸入:

python wechat_jump_auto.py即可。

如下圖所示:

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

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

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

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

代碼分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()

原理說明


由於微信檢測非常嚴厲,這裡的防禁代碼可能已經不起作用,主要供學習用途
  1. 將手機點擊到《跳一跳》小程序界面
  2. 用 ADB 工具獲取當前手機截圖,並用 ADB 將截圖 pull 上來
adb shell screencap -p /sdcard/autojump.png
adb pull /sdcard/autojump.png .
  1. 計算按壓時間
  • 手動版:用 Matplotlib 顯示截圖,用鼠標先點擊起始點位置,然後點擊目標位置,計算像素距離;
  • 自動版:靠棋子的顏色來識別棋子,靠底色和方塊的色差來識別棋盤;
  1. 用 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:

如果屏幕分辨率不能成功探測,處理方式與安卓手機中的處理方式類似。

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


分享到:


相關文章: