使用python编写微信跳一跳的自动脚本

实现思路:

  1. 调用adb命令,截图
  2. 寻找小小人的底部中心点role(从下到上扫描,直到找到小小人相同像素的点,至于小小人像素点rgb是什么,可以使用photoshop查看)
  3. 寻找棋盘最高点top,然后寻找棋盘最右点。根据最高点与最右点,确定棋盘中心点border
  4. 计算role与border之间的直线距离,然后设置按压时间=距离*按压系数
  5. 调用adb 命令,按压屏幕

完整代码,测试机Oppo r11

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PIL import Image, ImageDraw
import math
import os
import time
import subprocess

# 小小人底部RGB
role_bottom_rgb = (58, 58, 102)
# 小小人头部RGB
role_top_rgb = (65, 65, 90)
# 白色中心点 RGB
white_point = (245, 245, 245)
# 按压系数
press_coefficient = 1.35

def get_screenshot():
    """
    获取截图信息
    :return:
    """

    process = subprocess.Popen(‘adb shell screencap -p‘, shell=True,
                               stdout=subprocess.PIPE)
    binary_screenshot = process.stdout.read()
    binary_screenshot = binary_screenshot.replace(b‘\r\r\n‘, b‘\n‘)
    with open(‘autojump.png‘, ‘wb‘) as f:
        f.write(binary_screenshot)
    time.sleep(1)
    img = Image.open(‘autojump.png‘)
    return img

def is_similar(rgb1, rgb2, degree=20):
    """
    判断颜色是否相近
    :param rgb1:
    :param rgb2:
    :param degree:
    :return:
    """
    return abs(rgb1[0] - rgb2[0]) <= degree and abs(
        rgb1[1] - rgb2[1]) <= degree and abs(rgb1[2] - rgb2[2]) <= degree

def calculate_jump_distance(img):
    """
    计算跳一跳的距离
    :param image:
    :return:
    """
    draw = ImageDraw.Draw(img)
    im_pixel = img.load()
    w, h = img.size
    # 设置有效扫描区域
    min_x = 100
    max_x = w - 10
    min_y = 400
    max_y = h - 100
    # step1:寻找小小人底座位置
    role_start_x = 0
    role_end_x = 0
    role_y = 0
    find_role = False
    # y轴从下往上扫描
    for y in range(max_y, min_y, -1):
        # 找到小小人最低部一行,退出y轴循环
        if find_role:
            break
        # y轴未找到最低一行,则继续遍历x轴元素点
        # x轴从左到右扫描
        for x in range(min_x, max_x):
            current_rgb = im_pixel[x, y]  # 当前像素RGB值
            # 寻找到小人底座首位像素点
            if is_similar(current_rgb, role_bottom_rgb, 5):
                if not find_role:  # 找到首位像素点
                    find_role = True
                    role_start_x = x
                    role_y = y  # 小人底座中心点的y轴坐标已确定

            # 小人底座最右侧像素点定位,条件:首位像素点已找到,在当前y轴上继续遍历x轴,当当前像素不在小小人中时,前一个像素点为底座最右点
            if find_role and not is_similar(current_rgb, role_bottom_rgb, 5):
                role_end_x = x - 1
                break
    # 小小人底座中心点
    role_x = (role_start_x + role_end_x) / 2
    role = (role_x, role_y)
    draw.point([role], fill=(255, 0, 0))

    # step2:寻找棋盘顶点:从上往下,从左到右扫描,寻找首位与初始点不一样的像素
    # 解决小小人头部出现在最顶部时的BUG,在x轴扫描时,跳过小小人位置[role_start_x,role_end_x]
    top_x = 0
    top_y = 0
    top_rgb = None
    role_top_flag = False
    for y in range(min_y, max_y):
        for x in range(min_x, max_x):
            current_rgb = im_pixel[x, y]
            # 首先出现小小人的头部
            if not role_top_flag:
                if is_similar(current_rgb, role_top_rgb, 40):
                    print("首先出现小小人头部!")
                    role_top_flag = True
                    continue
                    # 当小小人头部在最顶部时,从上到下扫描时,当x处于小小人位置中时,跳过本次循环
            if (role_start_x - 50 <= x <= role_end_x + 50) and role_top_flag:
                # 当x轴坐标在小小人位置时
                continue

            # 顶部既不是小小人,又与初始像素点不一样,则定位为棋盘顶部,退出x轴扫描
            if not is_similar(current_rgb, im_pixel[min_x, min_y],
                              20):  # 与背景像素点不一样
                top_x = x
                # 解决棋盘边上出现一条乱七八糟颜色点将棋盘围起来时的BUG,找到第一个差异点后y轴继续往下5个像素点作为顶点
                top_y = y + 4
                top_rgb = im_pixel[top_x, top_y]
                break

        if top_rgb:  # 找到与初始点不一样的像素点,退出y轴循环
            break

    top = (top_x, top_y)
    draw.point([top], fill=(255, 0, 0))

    # step3:寻找棋盘最右侧点,条件:从top_x 向右,top_y 向下扫描,当与棋盘顶部像素点相似,x轴最大时,所在点为最右点
    right_x = top_x
    right_y = top_y
    find_border = False
    check_rgb = top_rgb
    for x in range(top_x, max_x):
        for y in range(top_y, max_y):
            current_rgb = im_pixel[x, y]
            # 找到相邻的相似元素点,定位条件:30个像素内,颜色相似
            if is_similar(current_rgb, check_rgb, 20) and abs(
                            x - right_x) <= 5 and abs(y - right_y) <= 5:
                check_rgb = current_rgb
                find_border = True
                right_x = x
                right_y = y
                break
        else:
            # 如果当前y轴扫描完毕都没有遇到棋盘相似点(即没有遇到break),说明已经超出了最右侧棋盘点,退出x轴循环
            if find_border:
                break
    right = (right_x, right_y)
    draw.point([right], fill=(255, 0, 0))
    # step4:定位棋盘中心:扫描棋盘,判断是否存在中心白点,否则初略可认为棋盘中心点位置是顶点和右侧点交叉位置
    border = (top_x, right_y)
    # 先排除初略中心点位置与白色中心点相似的情况,否则遇到白色版面会定位错误
    if not is_similar(im_pixel[top_x, right_y], white_point, 4):
        find_white_point = False
        for y in range(top_y + 5, right_y + 5):
            for x in range(top_x * 2 - right_x + 5, right_x - 5):
                if is_similar(im_pixel[x, y], white_point, 2):
                    # 寻找到白色中心点
                    find_white_point = True
                    border = (x, y + 10)
                    print("寻找到白色中心点!")
                    break
            # 寻找到白色中心点,退出y轴循环
            if find_white_point:
                break
    draw.point([border], fill=(255, 0, 0))

    # draw.line([top, right], fill=(255, 0, 0), width=10)
    draw.line([role, top, right, border], fill=(255, 0, 0), width=10)
    # img.show()
    img.save("debug.png")
    return math.sqrt((role[0] - border[0]) ** 2 + (role[1] - border[1]) ** 2)

def jump(distance):
    press_time = distance * press_coefficient
    press_time = max(press_time, 200)  # 设置 200ms 是最小的按压时间
    press_time = int(press_time)
    cmd = ‘adb shell input swipe 400 400 400 400 {duration}‘.format(
        duration=press_time)
    print(cmd)
    os.system(cmd)
    return press_time

if __name__ == ‘__main__‘:
    i = 1
    # img = get_screenshot()
    # img=Image.open(‘autojump.png‘)
    # distance = calculate_jump_distance(img)
    # img.close()
    # jump(distance)

    while True:
        img = get_screenshot()
        distance = calculate_jump_distance(img)
        jump(distance)
        img.close()
        i += 1
        if i == 10:
            time.sleep(2)
        time.sleep(2)
        print("*" * 100)

原文地址:https://www.cnblogs.com/guanfuchang/p/8318323.html

时间: 2024-10-10 00:29:38

使用python编写微信跳一跳的自动脚本的相关文章

【辅助工具】Python实现微信跳一跳

最近迷上了微信跳一跳小游戏,正好也看到知乎上有大神分享了技术贴,我也参考了好多资料,原理就是通过abd命令截取图片,python计算两个点距离,然后转化按压时间,让电脑来完成游戏.我花了很长时间才把程序跑起来,作为一名技术小白我谈谈自己的认识,尽量让大家少走弯路. 先贴上大神的github地址:https://github.com/wangshub/wechat_jump_game 准备工具 abd驱动 安卓手机 打开手机调试模式 usb线连接好手机与电脑 实现原理 获取手机实时截图 点击起始位

用Python玩微信跳一跳详细使用教程

github地址:https://github.com/wangshub/wechat_jump_game 工具介绍 Python 3 Android 手机 Adb 驱动 Python Matplot绘图 python3安装 安装pip 安装依赖包 在github地址将源码下载下来解压后,使用cd命令进入项目目录, 执行命令 pip install -r requirements.txt.会将依赖包下载下来. 下载好之后执行命令python -m pip list 安装adb驱动 下载adb驱动

用python玩微信跳一跳(win10+安卓)

一.前言 一场跨年的寒风席卷了整个北方,把我们带到了雪花烂漫的季节:一场"跳一跳"的风波也席卷了我们年轻人,好友们从此展开了如火如荼的较量.由此我们如何才能轻松战胜好友呢?这背后少不了我们强大的技术支持和耐心的调试,那让我们一起去尝试吧! 二.步骤 1.安装python(2.3版本都可以) 安装的时候要勾上"Add Python 3.6 to Path",然后在命令提示符窗口输入python 2.adb驱动安装 adb驱动下载地址:https://adb.clock

python_微信 跳一跳

今天用python刷了一下微信跳一跳游戏得分数. 不是仅仅是玩一玩,而是为了把开发环境搭建好.(这个借口好) 参考: http://blog.csdn.net/LittleBeautiful/article/details/78955792 原文地址:https://www.cnblogs.com/lwbjyp/p/8213897.html

如何使用NSDL玩转微信跳一跳

目前网上介绍windows和IOS操作系统上玩微信跳一跳的有很多文章,但介绍Linux平台下的文章相对较少,所以动手操作下和大家分享,同时感谢wangshub在github上的分享: 1 下载wechat_jump_game-master 下载地址:https://github.com/wangshub/wechat_jump_game/archive/master.zip 2 解压安装并安装依赖包 pip3.4 install -r requirements.txt 操作如下:? 进入pyth

微信跳一跳

题目大意如下:微信跳一跳游戏,输入1,2,,0三个数字: 1代表跳到了下一个盒子但不在中心,得分为1,总分加1: 2代表跳到了下一个盒子且在中心:根据上次的得分计算:如果上一次得分为1,那此次得分为2,总分加2分,如果上一次得分为2,那此次得分为4,总分加4:以此类推:如上一次得分为8分,这次又跳到了盒子中心,那此次得分为10分,总分加10: 0代表没有跳到盒子上,游戏结束. ------------------------------------------------------------

python编写微信公众号首图思路详解

前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式固定下来,方便以后写公众号. 思路 根据微信公众号首图要求,可以上传一个不超过5M的图片,且图片尺寸要是2.35:1的尺寸,换算成像素是900:383,有了这些参数就可以做文章了,这里有两种思路 把今天推文的标题(文字)用图片展示出来,使得文字排列错落有致,简单粗暴,而又不失美感,这里可以利用mat

[原创]用C#实现微信“跳一跳”小游戏的自动跳跃助手

一.前言: 前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“打飞机”游戏,这游戏玩法简单,但加上了积分排名功能后,却成了“装逼”的地方,于是很多人花钱花时间的刷积分抢排名.后来越来越多的聪明的“程序哥们”弄出了不同方式不同花样的跳一跳助手(外挂?),有用JS实现的.有JAVA实现的.有Python实现的,有直接物理模式的.有机械化的.有量尺子的等等,简直是百花齐放啊…… 赶一下潮流,刚好有点时间,于是花了一个下午时间,我也弄了一个C#版本的简单实现.

揭密微信跳一跳小游戏那些外挂

WeTest 导读 张小龙:这个游戏发布以后,其实它的效果有点超出我们的预期,我们自己开玩笑说,这个游戏突然变成了有史以来可能用户规模最大的一个游戏,因为它的DAU大概到了1点几亿,但同时出现了很多外挂,我没有想到这么小的一款游戏也会有那么多外挂,我朋友圈的朋友也打出了特别高的分,但是我相信不是他自己打出来的. 1 月 15 日微信在广州召开 2018 年的微信公开课 Pro,张小龙不仅当场玩了一把跳一跳游戏并取得了900多的高分,还特别提到了跳一跳小游戏的外挂: 在跳一跳这样一个小的游戏里面,