前言

每次玩回合制游戏的时候,反反复复的日常任务让人不胜其烦

玩问道的时候,我们希望能够自动刷道,玩梦幻希望能自动做师门、捉鬼等等

今天小编就用Python教大家做一个关于回合制游戏的脚本,该脚本只能模拟鼠标键盘操作,并不能修改游戏数据。

作者:`Rest探路者`
源自:`

如果你需要一个良好的学习交流环境,那么你可以考虑Python学习交流群:548377875;

如果你需要一份系统的学习资料,那么你可以考虑Python学习交流群:548377875。

引入:

每次玩回合制游戏的时候,反反复复的日常任务让人不胜其烦

玩问道的时候,我们希望能够自动刷道,玩梦幻希望能自动做师门、捉鬼等等

本次我们选择的安卓游戏对象叫“单词英雄”,大家可以先下载这个游戏。

最近在玩一款背单词的手机游戏-单词英雄,是一个将背单词和卡牌游戏相结合的游戏,通过选择正确的单词意思进行有效攻击,边玩游戏就把单词给背了。
  游戏的界面是这样的:

金沙国际官网 1

 

说明:

该外挂只能模拟鼠标键盘操作,并不能修改游戏数据

我这里使用的python2.7

开发工具是PyCharm

游戏的界面是这样的:

金沙国际官网 2

今晚打完篮球。

开发环境准备

Python2.7 + Windows

模块:autopy,可pip install autopy

前期知识准备:

首先下载autopy包,我这里PyCharm可以直接导入autopy包

或者用利用pip进行安装:pip install autopy

金沙国际官网 3

Paste_Image.png

回来洗完澡,和阿艳聊了一会。

鼠标移动

金沙国际官网 4

 

会发现鼠标瞬间移动到坐标(1,1)的位置,我的电脑是1920*1080的,最右下角的坐标就是(1920,1080)。

将move换成smooth_move,会发现鼠标慢慢地移动到指定坐标

鼠标移动

复制如下代码,运行

#coding=utf-8import time import autopy#quick moveautopy.mouse.move(1,1) #smooth move#autopy.mouse.smooth_move(1370,120)

会发现鼠标瞬间移动到坐标的位置,我的电脑是1920*1080的,最右下角的坐标就是(1920,1080)。

将move换成smooth_move,会发现鼠标慢慢地移动到指定坐标

官方文档的解释:

autopy.mouse.move(x: float, y: float)

Moves the mouse to the given coordinate.

Exceptions:

ValueError is thrown if the point is out of index.

autopy.mouse.smooth_move(x: float, y: float)

Smoothly moves the mouse to the given coordinate in a straight line.

Exceptions:

ValueError is thrown if the point is out of index.

坐标超过分辨率会报异常

通过选择单词的意思进行攻击,选对了就正常攻击,选错了就象征性的攻击一下。玩了一段时间之后琢磨可以做成自动的,通过PIL识别图片里的单词和选项,然后翻译英文成中文意思,根据中文模糊匹配选择对应的选项。

  通过选择单词的意思进行攻击,选对了就正常攻击,选错了就象征性的攻击一下。玩了一段时间之后琢磨可以做成自动的,通过PIL识别图片里的单词和选项,然后翻译英文成中文意思,根据中文模糊匹配选择对应的选项。
  查找了N多资料以后开始动手,程序用到以下这些东西:
PIL       Python Imaging Library 大名鼎鼎的图片处理模块
pytesser     Python下用来驱动tesseract-ocr来进行识别的模块
Tesseract-OCR
 图像识别引擎,用来把图像识别成文字,可以识别英文和中文,以及其它语言
autopy     Python下用来模拟操作鼠标和键盘的模块。

心里想着:今天要写点什么。

鼠标点击

金沙国际官网 ,运行代码,发现当前位置产生了点击操作

金沙国际官网 5

 

鼠标点击

运行代码,发现当前位置产生了点击操作

#coding=utf-8import autopyautopy.mouse.click() # 单击

查找了N多资料以后开始动手,程序用到以下这些东西:

安装步骤(win7环境):
  (1)安装PIL,下载地址:http://www.pythonware.com/products/pil/,安装Python
Imaging Library 1.1.7 for Python 2.7。
  (2)安装pytesser,下载地址:http://code.google.com/p/pytesser/,下载解压后直接放在
C:\Python27\Lib\site-packages下,在文件夹下建立pytesser.pth文件,内容为C:\Python27\Lib\site-packages\pytesser_v0.0.1
  (3)安装Tesseract OCR
engine,下载:https://github.com/tesseract-ocr/tesseract/wiki/Downloads,下载Windows
installer of tesseract-ocr 3.02.02 (including English language
data)的安装文件,进行安装。
  (4)安装语言包,在https://github.com/tesseract-ocr/tessdata下载chi_sim.traineddata简体中文语言包,放到安装的Tesseract
OCR目标下的tessdata文件夹内,用来识别简体中文。
  (5)修改C:\Python27\Lib\site-packages\pytesser_v0.0.1下的pytesser.py的函数,将原来的image_to_string函数增加语音选择参数language,language=’chi_sim’就可以用来识别中文,默认为eng英文。
改好后的pytesser.py:

写什么好?

键盘操作

常见的键值码和键的对应:

金沙国际官网 6

 

这里需要win32api包

调用win32api的keybd_event方法,用过要释放按键

金沙国际官网 7

 

可以看到,完成了切换窗口的操作,相当于我们按alt+tab,然后回车进入

键盘操作

下面时一些常见的键值码和键的对应:

字母和数字键 数字小键盘的键  功能键    其它键
键 键码 键 键码 键 键码 键 键码
A 65 0 96 F1112 Backspace 8
B 66 1 97 F2113 Tab 9
C 67 2 98 F3114 Clear 12
D 68 3 99 F4115 Enter 13
E 69 4 100 F5 116 Shift 16
F 70 5 101 F6 117 Control 17
G 71 6 102 F7 118 Alt 18
H 72 7 103 F8 119 Caps Lock 20
I 73 8 104 F9 120 Esc 27
J 74 9 105 F10121 Spacebar 32
K 75 * 106 F11 122 Page Up 33
L 76 + 107 F12 123 Page Down 34
M 77 Enter 108 End 35
N 78 – 109 Home 36
O 79 . 110 Left Arrow 37
P 80 / 111 Up Arrow38
Q 81 RightArrow 39
R 82 DownArrow 40
S 83 Insert 45
T 84 Delete 46
U 85 Help 47
V 86 NumLock 144
W87
X88
Y89
Z90
048
149
250
351
4 52
553
654
755
856
9 57

复制代码,运行,这里需要win32api包

调用win32api的keybd_event方法,用过要释放按键

#coding=utf-8import timeimport win32api win32api.keybd_event(18,0,0,0)  #alt键位码是18win32api.keybd_event(9,0,0,0)  #tab键位码是9time.sleep(0.5)win32api.keybd_event(13,0,0,0)  #enter键位码是13 win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) #释放按键win32api.keybd_event(9,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)time.sleep(2)

可以看到,完成了切换窗口的操作,相当于我们按alt+tab,然后回车进入

PIL:Python Imaging Library 大名鼎鼎的图片处理模块

"""OCR in Python using the Tesseract engine from Google
http://code.google.com/p/pytesser/
by Michael J.T. O'Kelly
V 0.0.1, 3/10/07"""

import Image
import subprocess
import util
import errors

tesseract_exe_name = 'tesseract' # Name of executable to be called at command line
scratch_image_name = "temp.bmp" # This file must be .bmp or other Tesseract-compatible format
scratch_text_name_root = "temp" # Leave out the .txt extension
cleanup_scratch_flag = True  # Temporary files cleaned up after OCR operation

def call_tesseract(input_filename, output_filename, language):
  """Calls external tesseract.exe on input file (restrictions on types),
  outputting output_filename+'txt'"""
  args = [tesseract_exe_name, input_filename, output_filename, "-l", language]
  proc = subprocess.Popen(args)
  retcode = proc.wait()
  if retcode!=0:
    errors.check_for_errors()

def image_to_string(im, cleanup = cleanup_scratch_flag, language = "eng"):
  """Converts im to file, applies tesseract, and fetches resulting text.
  If cleanup=True, delete scratch files after operation."""
  try:
    util.image_to_scratch(im, scratch_image_name)
    call_tesseract(scratch_image_name, scratch_text_name_root,language)
    text = util.retrieve_text(scratch_text_name_root)
  finally:
    if cleanup:
      util.perform_cleanup(scratch_image_name, scratch_text_name_root)
  return text

def image_file_to_string(filename, cleanup = cleanup_scratch_flag, graceful_errors=True, language = "eng"):
  """Applies tesseract to filename; or, if image is incompatible and graceful_errors=True,
  converts to compatible format and then applies tesseract.  Fetches resulting text.
  If cleanup=True, delete scratch files after operation."""
  try:
    try:
      call_tesseract(filename, scratch_text_name_root, language)
      text = util.retrieve_text(scratch_text_name_root)
    except errors.Tesser_General_Exception:
      if graceful_errors:
        im = Image.open(filename)
        text = image_to_string(im, cleanup)
      else:
        raise
  finally:
    if cleanup:
      util.perform_cleanup(scratch_image_name, scratch_text_name_root)
  return text


if __name__=='__main__':
  im = Image.open('phototest.tif')
  text = image_to_string(im)
  print text
  try:
    text = image_file_to_string('fnord.tif', graceful_errors=False)
  except errors.Tesser_General_Exception, value:
    print "fnord.tif is incompatible filetype.  Try graceful_errors=True"
    print value
  text = image_file_to_string('fnord.tif', graceful_errors=True)
  print "fnord.tif contents:", text
  text = image_file_to_string('fonts_test.png', graceful_errors=True)
  print text

每天都发生很多事情,只是我渐渐压抑了自己的表达冲动,觉得要分享的事情,没有足够有趣和有价值。

开始制作游戏脚本

这里以问道手游为例(回合制手游类似)

需要夜神模拟器,并在模拟器上安装问道

我试过蓝叠和MuMu模拟器,我用autopy移动鼠标到模拟器时鼠标就消失了,不能完成后续的自动操作,后来百度了

说有的模拟器不受win窗口的控制。不管那么多,我们先用夜神模拟器吧!

金沙国际官网 8

 

进入游戏,打开”活动”

金沙国际官网 9

 

我们以”竞技场”活动举例说明

金沙国际官网 10

 

这里我们要用到截图工具,我用的是PicPick

个人用户免费,我主要用它来测量坐标

金沙国际官网 11

 

记录下竞技场前往的坐标(1358,504)

金沙国际官网 12

 

记录下竞技场按钮的坐标(1332,650)

制作回合制脚本首先得要熟悉任务流程

然后点击竞技场,走完这个任务流程,依次记录按钮的坐标

竞技场任务一天可以做五次,我们对步骤循环五次

战斗时间我们需要自己来计时,不同门派,土豪或者平民玩家时间都不一样

我是平民玩家,大概耗时60s,点击过挑战让代码延迟60s再继续执行

金沙国际官网 13

 

开始制作外挂:

这里以问道手游为例

需要夜神模拟器,并在模拟器上安装问道

我试过蓝叠和MuMu模拟器,我用autopy移动鼠标到模拟器时鼠标就消失了,不能完成后续的自动操作,后来百度了

说有的模拟器不受win窗口的控制。不管那么多,我们先用夜神模拟器吧!

金沙国际官网 14

进入游戏,打开“活动”

金沙国际官网 15

我们以“竞技场”活动举例说明

金沙国际官网 16

这里我们要用到截图工具,我用的是PicPick

个人用户免费,我主要用它来测量坐标

金沙国际官网 17

记录下竞技场前往的坐标

金沙国际官网 18

记录下竞技场按钮的坐标

制作回合制脚本首先得要熟悉任务流程

然后点击竞技场,走完这个任务流程,依次记录按钮的坐标

竞技场任务一天可以做五次,我们对步骤循环五次

战斗时间我们需要自己来计时,不同门派,土豪或者平民玩家时间都不一样

我是平民玩家,大概耗时60s,点击过挑战让代码延迟60s再继续执行

金沙国际官网 19

复制代码,运行

#coding=utf-8import autopyimport timeimport win32apiimport win32con#竞技场win32api.keybd_event(18,0,0,0)  #alt键位码是18win32api.keybd_event(9,0,0,0)  #tab键位码是9time.sleep(0.5)win32api.keybd_event(13,0,0,0)  #enter键位码是13 win32api.keybd_event(18,0,win32con.KEYEVENTF_KEYUP,0) #释放按键win32api.keybd_event(9,0,win32con.KEYEVENTF_KEYUP,0)win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)time.sleep(2) def mousemove_click:    autopy.mouse.smooth_move    autopy.mouse.click() mousemove_click(771, 203)  # 活动的坐标 mousemove_click(1358,504)  # 竞技场"前往"的坐标 time.sleep(20)#从天墉城城中心/其他地图走到竞技使者花费20s mousemove_click(1334, 650)  # 竞技使者对话框中的竞技场的坐标  #挑战完毕会出现对话窗口for i in range(1,6,1):    mousemove_click(664,706) #挑战试炼童子     mousemove_click(1082,578) #确认     mousemove_click(1530, 794)  # 战斗自动     time.sleep(60)#挑战试炼童子预计60s

pytesser:Python下用来驱动tesseract-ocr来进行识别的模块

(6)安装autopy,下载地址:https://pypi.python.org/pypi/autopy,下载autopy-0.51.win32-py2.7.exe进行安装,用来模拟鼠标操作。

等等看吧,等有什么我非要分享不可,或者生活中发生了什么特别出彩的事情,再来写,做一些记录和分享好了。

代码

金沙国际官网 20

 

效果如下:

金沙国际官网 21

下一集将介绍如何实现队长模式刷道(自动组队,自动跑环接任务)

Tesseract-OCR:图像识别引擎,用来把图像识别成文字,可以识别英文和中文,以及其它语言

说下程序的思路:
 1.
首先是通过模拟器在WINDOWS下执行安卓的程序,然后用PicPick进行截图,将战斗画面中需要用到的区域进行测量,记录下具体在屏幕上的位置区域,用图中1来判断战斗是否开始(保存下来用作比对),用2,3,4,5,6的区域抓取识别成文字。

见鬼,这完全是借口。

autopy:Python下用来模拟操作鼠标和键盘的模块。

金沙国际官网 22

好不容易,说服自己要开始写点什么。我觉得自己,活着,活下去,总得有些事情可以让我感到兴奋,可以帮助我释放和转换能量。

安装步骤(win7环境):

1485005-75900c16b01ca1f3.png

运动算是一种,写作也是一种。

(1)安装PIL,下载地址:,安装Python
Imaging Library 1.1.7 for Python 2.7。

计算图片指纹的程序:

运动,我已经养成了习惯,最多休息两天,就会去挥洒汗水了。可面对写作,我拖得越久,越顾虑,我总是想,要打开电脑,要登陆微信公众号,要写作,要编辑,要找图片和背景音乐,实在太麻烦了。

(2)安装pytesser,下载地址:,下载解压后直接放在
C:\Python27\Lib\site-packages下,在文件夹下建立pytesser.pth文件,内容为C:\Python27\Lib\site-packages\pytesser_v0.0.1

    def get_hash(self, img):
        #计算图片的hash值
        image = img.convert("L")
        pixels = list(image.getdata())
        avg = sum(pixels) / len(pixels)
        return "".join(map(lambda p : "1" if p > avg else "0", pixels))

几乎每一次,我都因为在想象中,觉得事情很麻烦,就偃旗息鼓,放弃了努力和坚持。

(3)安装Tesseract OCR
engine,下载:
installer of tesseract-ocr 3.02.02 (including English language
data)的安装文件,进行安装。

图片识别成字符:

我自责,懊悔,不安,然后宽容,理解,原谅自己。如此反复,备受困扰。

(4)安装语言包,在下载chi_sim.traineddata简体中文语言包,放到安装的Tesseract
OCR目标下的tessdata文件夹内,用来识别简体中文。

    #识别出对应位置图像成字符,把字符交给chose处理
    def getWordMeaning(self):
        pic_up = ImageGrab.grab((480,350, 480+300, 350+66))
        pic_aws1 = ImageGrab.grab((463,456, 463+362, 456+45))
        pic_aws2 = ImageGrab.grab((463,530, 463+362, 530+45))
        pic_aws3 = ImageGrab.grab((463,601, 463+362, 601+45))
        pic_aws4 = ImageGrab.grab((463,673, 463+362, 673+45))

        str_up = image_to_string(pic_up).strip().lower()

        #判断当前单词和上次识别单词相同,就不继续识别
        if str_up <> self.lastWord:
            #如果题目单词是英文,选项按中文进行识别
            if str_up.isalpha():
                eng_up = self.dt[str_up].decode('gbk') if self.dt.has_key(str_up) else ''
                chs1 = image_to_string(pic_aws1, language='chi_sim').decode('utf-8').strip()
                chs2 = image_to_string(pic_aws2, language='chi_sim').decode('utf-8').strip()
                chs3 = image_to_string(pic_aws3, language='chi_sim').decode('utf-8').strip()
                chs4 = image_to_string(pic_aws4, language='chi_sim').decode('utf-8').strip()
                print str_up, ':', eng_up
                self.chose(eng_up, (chs1, chs2, chs3, chs4))
            #如果题目单词是中文,选项按英文进行识别
            else:
                chs_up = image_to_string(pic_up, language='chi_sim').decode('utf-8').strip()
                eng1 = image_to_string(pic_aws1).strip()
                eng2 = image_to_string(pic_aws2).strip()
                eng3 = image_to_string(pic_aws3).strip()
                eng4 = image_to_string(pic_aws4).strip()

                e2c1 = self.dt[eng1].decode('gbk') if self.dt.has_key(eng1) else ''
                e2c2 = self.dt[eng2].decode('gbk') if self.dt.has_key(eng2) else ''
                e2c3 = self.dt[eng3].decode('gbk') if self.dt.has_key(eng3) else ''
                e2c4 = self.dt[eng4].decode('gbk') if self.dt.has_key(eng4) else ''
                print chs_up
                self.chose(chs_up, (e2c1, e2c2, e2c3, e2c4))
            self.lastWord = str_up
        return str_up

人最痛苦的事,就是你知道你可以做,但是你就是迟迟没有行动。所有的野心,热情,勇气和希望,都在等待和拖延中,慢慢消耗了。

(5)修改C:\Python27\Lib\site-packages\pytesser_v0.0.1下的pytesser.py的函数,将原来的image_to_string函数增加语音选择参数language,language=’chi_sim’就可以用来识别中文,默认为eng英文。

2.
对于1位置的图片提前截一个保存下来,然后通过计算当前画面和保存下来的图片的距离,判断如果小于40的就表示已经到了选择界面,然后识别2,3,4,5,6成字符,判断如果2位置识别成英文字符的,就用2解析出来的英文在字典中获取中文意思,然后再通过2的中文意思和3,4,5,6文字进行匹配,匹配上汉字最多的就做选择,如果匹配不上默认返回最后一个。之前本来考虑是用Fuzzywuzzy来进行模糊匹配算相似度的,不过后来测试了下对于中文匹配的效果不好,就改成按汉字单个进行匹配计算相似度。
匹配文字进行选择:

日复一日,就会陷入一个怪圈,难以突围。

改好后的pytesser.py:

    #根据传入的题目和选项进行匹配选择
    def chose(self, g, chs_list):
        j, max_score = -1, 0
        same_list = None
        #替换掉题目里的特殊字符
        re_list = [u'~', u',', u'.', u';', u' ', u'a', u'V', u'v', u'i', u'n', u'【', u')', u'_', u'W', u'd', u'j', u'-', u't']
        for i in re_list:
            g = g.replace(i, '')
        print type(g)

        #判断2个字符串中相同字符,相同字符最多的为最佳答案
        for i, chsWord in enumerate(chs_list):
            print type(chsWord)
            l = [x for x in g if x in chsWord and len(x)>0]
            score = len(l) if l else 0

            if score > max_score:
                max_score = score
                j = i
                same_list = l
        #如果没有匹配上默认选最后一个
        if j ==-1:
            print '1. %s; 2. %s; 3. %s; 4. %s; Not found choice.' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3])
        else:
            print '1. %s; 2. %s; 3. %s; 4. %s; choice: %s' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3], chs_list[j])
            for k, v in enumerate(same_list):
                print str(k) + '.' + v,
        order = j + 1
        self.mouseMove(order)
        return order

思想上认知到这一点,行动没有跟上,依然会受到一些小困扰。

"""OCR in Python using the Tesseract engine from Google
http://code.google.com/p/pytesser/
by Michael J.T. O'Kelly
V 0.0.1, 3/10/07"""
import Image
import subprocess
import util
import errors
tesseract_exe_name = 'tesseract' # Name of executable to be called at command line
scratch_image_name = "temp.bmp" # This file must be .bmp or other Tesseract-compatible format
scratch_text_name_root = "temp" # Leave out the .txt extension
cleanup_scratch_flag = True # Temporary files cleaned up after OCR operation
def call_tesseract(input_filename, output_filename, language):
 """Calls external tesseract.exe on input file (restrictions on types),
 outputting output_filename+'txt'"""
 args = [tesseract_exe_name, input_filename, output_filename, "-l", language]
 proc = subprocess.Popen(args)
 retcode = proc.wait()
 if retcode!=0:
  errors.check_for_errors()
def image_to_string(im, cleanup = cleanup_scratch_flag, language = "eng"):
 """Converts im to file, applies tesseract, and fetches resulting text.
 If cleanup=True, delete scratch files after operation."""
 try:
  util.image_to_scratch(im, scratch_image_name)
  call_tesseract(scratch_image_name, scratch_text_name_root,language)
  text = util.retrieve_text(scratch_text_name_root)
 finally:
  if cleanup:
   util.perform_cleanup(scratch_image_name, scratch_text_name_root)
 return text
def image_file_to_string(filename, cleanup = cleanup_scratch_flag, graceful_errors=True, language = "eng"):
 """Applies tesseract to filename; or, if image is incompatible and graceful_errors=True,
 converts to compatible format and then applies tesseract. Fetches resulting text.
 If cleanup=True, delete scratch files after operation."""
 try:
  try:
   call_tesseract(filename, scratch_text_name_root, language)
   text = util.retrieve_text(scratch_text_name_root)
  except errors.Tesser_General_Exception:
   if graceful_errors:
    im = Image.open(filename)
    text = image_to_string(im, cleanup)
   else:
    raise
 finally:
  if cleanup:
   util.perform_cleanup(scratch_image_name, scratch_text_name_root)
 return text
if __name__=='__main__':
 im = Image.open('phototest.tif')
 text = image_to_string(im)
 print text
 try:
  text = image_file_to_string('fnord.tif', graceful_errors=False)
 except errors.Tesser_General_Exception, value:
  print "fnord.tif is incompatible filetype. Try graceful_errors=True"
  print value
 text = image_file_to_string('fnord.tif', graceful_errors=True)
 print "fnord.tif contents:", text
 text = image_file_to_string('fonts_test.png', graceful_errors=True)
 print text

3.最后通过mouseMove调用autopy操作鼠标点击对应位置进行选择。
程序运行的录像:
http://v.youku.com/v\_show/id\_XMTYxNTAzMDUwNA==.html
  程序完成后使用正常,因为图片识别准确率和字典的问题,正确率约为70%左右,效果还是比较满意。程序总体来说比较简单,做出来也就是纯粹娱乐一下,串联使用了图片识别、中文模糊匹配、鼠标模拟操作,算是个简单的小外挂吧,源程序和用到的文件如下:
http://git.oschina.net/highroom/My-Project/tree/master/Word%20Hero

我不能这样下去了,我要行动起来,要通过不断采取行动,实现小目标,来提升我的行动力,一定要采取主动,把自己训练成一个有目标,有行动,勇敢而自律得到人。

(6)安装autopy,下载地址:,下载autopy-0.51.win32-py2.7.exe进行安装,用来模拟鼠标操作。

我擅长给自己洗脑。

说下程序的思路:

这样一番思想工作后,我对自己说,如果嫌麻烦的话,就从简单的地方开始做起吧。

1.
首先是通过模拟器在WINDOWS下执行安卓的程序,然后用PicPick进行截图,将战斗画面中需要用到的区域进行测量,记录下具体在屏幕上的位置区域,用图中1来判断战斗是否开始(保存下来用作比对),用2,3,4,5,6的区域抓取识别成文字。

开电脑,上微信公众号写作麻烦,就直接用手机,在简书上开写。

金沙国际官网 23

思路一变,出路就来。

计算图片指纹的程序:

我打开了手机简书,准备写,却又点击相册,去找张配图,翻了一遍,发现没有什么适合的照片。手机系统刚更换不久,之前的资料和相片全部清零了。

def get_hash(self, img):
    #计算图片的hash值
    image = img.convert("L")
    pixels = list(image.getdata())
    avg = sum(pixels) / len(pixels)
    return "".join(map(lambda p : "1" if p > avg else "0", pixels))

最后选了一张阿艳的照片来配文。

图片识别成字符:

没有什么意思,就像习惯了,一上车,就要开音乐,一写文章,就要配图。

#识别出对应位置图像成字符,把字符交给chose处理
  def getWordMeaning(self):
    pic_up = ImageGrab.grab((480,350, 480+300, 350+66))
    pic_aws1 = ImageGrab.grab((463,456, 463+362, 456+45))
    pic_aws2 = ImageGrab.grab((463,530, 463+362, 530+45))
    pic_aws3 = ImageGrab.grab((463,601, 463+362, 601+45))
    pic_aws4 = ImageGrab.grab((463,673, 463+362, 673+45))
    str_up = image_to_string(pic_up).strip().lower()
    #判断当前单词和上次识别单词相同,就不继续识别
    if str_up <> self.lastWord:
      #如果题目单词是英文,选项按中文进行识别
      if str_up.isalpha():
        eng_up = self.dt[str_up].decode('gbk') if self.dt.has_key(str_up) else ''
        chs1 = image_to_string(pic_aws1, language='chi_sim').decode('utf-8').strip()
        chs2 = image_to_string(pic_aws2, language='chi_sim').decode('utf-8').strip()
        chs3 = image_to_string(pic_aws3, language='chi_sim').decode('utf-8').strip()
        chs4 = image_to_string(pic_aws4, language='chi_sim').decode('utf-8').strip()
        print str_up, ':', eng_up
        self.chose(eng_up, (chs1, chs2, chs3, chs4))
      #如果题目单词是中文,选项按英文进行识别
      else:
        chs_up = image_to_string(pic_up, language='chi_sim').decode('utf-8').strip()
        eng1 = image_to_string(pic_aws1).strip()
        eng2 = image_to_string(pic_aws2).strip()
        eng3 = image_to_string(pic_aws3).strip()
        eng4 = image_to_string(pic_aws4).strip()

        e2c1 = self.dt[eng1].decode('gbk') if self.dt.has_key(eng1) else ''
        e2c2 = self.dt[eng2].decode('gbk') if self.dt.has_key(eng2) else ''
        e2c3 = self.dt[eng3].decode('gbk') if self.dt.has_key(eng3) else ''
        e2c4 = self.dt[eng4].decode('gbk') if self.dt.has_key(eng4) else ''
        print chs_up
        self.chose(chs_up, (e2c1, e2c2, e2c3, e2c4))
      self.lastWord = str_up
    return str_up

人真是习惯的动物。

2.
对于1位置的图片提前截一个保存下来,然后通过计算当前画面和保存下来的图片的距离,判断如果小于40的就表示已经到了选择界面,然后识别2,3,4,5,6成字符,判断如果2位置识别成英文字符的,就用2解析出来的英文在字典中获取中文意思,然后再通过2的中文意思和3,4,5,6文字进行匹配,匹配上汉字最多的就做选择,如果匹配不上默认返回最后一个。之前本来考虑是用Fuzzywuzzy来进行模糊匹配算相似度的,不过后来测试了下对于中文匹配的效果不好,就改成按汉字单个进行匹配计算相似度。

我如果习惯了总是怕麻烦,以后会越来越麻烦,如果我开始训练自己不怕麻烦,以后就会越来越不麻烦。

匹配文字进行选择:

如果我习惯了压抑自己表达的能量,不去写,那么我整个生命某个地方就停顿了,堵塞了,失去了生机和活力,如果我训练自己开始习惯表达自己,那么我生命就渐渐打开了,人生和格局就被放大了,路也会越来越宽。

#根据传入的题目和选项进行匹配选择
  def chose(self, g, chs_list):
    j, max_score = -1, 0
    same_list = None
    #替换掉题目里的特殊字符
    re_list = [u'~', u',', u'.', u';', u' ', u'a', u'V', u'v', u'i', u'n', u'【', u')', u'_', u'W', u'd', u'j', u'-', u't']
    for i in re_list:
      g = g.replace(i, '')
    print type(g)
    #判断2个字符串中相同字符,相同字符最多的为最佳答案
    for i, chsWord in enumerate(chs_list):
      print type(chsWord)
      l = [x for x in g if x in chsWord and len(x)>0]
      score = len(l) if l else 0

      if score > max_score:
        max_score = score
        j = i
        same_list = l
    #如果没有匹配上默认选最后一个
    if j ==-1:
      print '1. %s; 2. %s; 3. %s; 4. %s; Not found choice.' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3])
    else:
      print '1. %s; 2. %s; 3. %s; 4. %s; choice: %s' % (chs_list[0], chs_list[1], chs_list[2], chs_list[3], chs_list[j])
      for k, v in enumerate(same_list):
        print str(k) + '.' + v,
    order = j + 1
    self.mouseMove(order)
    return order

过去我羞于表达,害怕表达,各种借口拖延,究其本质,就是认知短浅,格局太小。

3.最后通过mouseMove调用autopy操作鼠标点击对应位置进行选择。

一个人只有不断提高自己的见识,更新自己的认知,拉大自己的格局,人生再大的事情,都会变小,举重若轻,豁达洒脱,活得就是一种格局呀。

程序运行的录像:

从前我格局小,害怕写,容不下自己对写的恐惧和顾虑,如今我拉大自己的格局,接受和看清了自己的局限,就发现,不敢写的旁边,就有很多东西可以写,没有什么可以分享的四周,皆有记录的意义。

程序完成后使用正常,因为图片识别准确率和字典的问题,正确率约为70%左右,效果还是比较满意。程序总体来说比较简单,做出来也就是纯粹娱乐一下,串联使用了图片识别、中文模糊匹配、鼠标模拟操作,算是个简单的小外挂吧,源程序和用到的文件如下:

提到格局,我想起之前一个同事。他借呗借了1000元,分期还款,每期还200多一点吧。到了还款日,他特别不安,说工资没有发,又借不到200元去还,怎么办?会不会影响我征信?

看到他坐立不安的样子,我忽然觉得他格局太小了,才200元就吓成这样了,一个二十出头的年轻人,居然周转不过来200元?

我不禁哑然失笑。他虽然没有问我,不过我当时是借了200元给他还款。一件让他愁眉紧锁的麻烦,就这样解决了。

从他的经历上,我反观自己,每个月房租,伙食费,日常支出,加油,给女朋友买东西和零花钱,加上车贷,就算自己没有收入,固定支出也要8000元,一开始还有压力,可经历他的事情呀,一万几千,算什么压力?

在借了银行30多万买房的大表哥眼里,算个屁。将格局拉大一点,对那些动不动就贷几百万,几千万的生意人来说,几十万的压力根本就不是事。

同样欠几百万几千万的人的压力,在那些亿万富豪眼里,也变得微不足道了……

按照这个角度去看世界,会发现,很多时候,如果有事情困扰我们,一定是我们的格局太小,如果让自己站高一点,看远一点,自然觉得除了生死,真的没有可操心的。

当然,大道理人人都懂,即使认知和见识提高,放大了,还不能马上做到万事无忧的境界。只能说,拉大自己的格局,去容纳,去笑纳生活中问题和一切发生,是值得我们去学习的。

也是一个修行的方向。

如果有人觉得很麻烦,这是很正常的。我的经验是,接受自己生活中的一切,别被它们击倒,噢,我们当然会被击倒,问题是,格局小的人,怕麻烦,不敢再前进,被击倒以后,就在原地打转,画地为牢作茧自缚了。

我曾经就是这样的人。

如今,我正在做出行动,在一切改变之前,改变一切。这件事很麻烦,但是我打定主意了,先从简单的地方做起吧。

主要肯出发,就已经到达了一半了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图