用户
搜索
  • TA的每日心情
    擦汗
    2019-6-21 00:06
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]经常看看I

    实习版主

    Rank: 7Rank: 7Rank: 7

    4

    主题

    20

    帖子

    181

    魔法币
    收听
    0
    粉丝
    2
    注册时间
    2016-10-20
    发表于 2019-6-3 16:05:55 155362
    本帖最后由 骚柒 于 2019-6-4 03:03 编辑
    一、背景

           在我玩某灵的一个月后我萌生了一个想法,主要是天天让我钓鱼,关键是钓鱼可以换只能用钱买的东西,我那里忍受得了这些,于是想写一个Python脚本做这个恶心的事情,然后我马上开始想怎么做,其实蛮简单,就鼠标模拟加键盘操作,为什么我要这么做,因为物理脚本不容易封号,毕竟是自己的游戏账号,不能乱搞啦。就像在写这篇文章之前的一个小时,一个人还说你这样写为啥不用按键精灵?我没回答他,因为我觉得这个问题有点垃圾,我凭什么要用类易语言的中文编程语言来写代码?外挂写得好的大佬有几个用中文编程鸭,嘤嘤嘤?英文编程才是王道。



    二、两个第三方库


    1、 模拟鼠标键盘的第三方库
          
           在写这个自动化脚本以前我用过很多Python模拟鼠标键盘操作的第三方库,但都没有这次这个牛逼,他就是Pyautogui,一个非常好的第三方库。有一些基本的操作,如下:
           (1)  鼠标操作:click()函数,它有三个常用的参数,分别是X轴坐标、Y轴坐标、鼠标左中右键,若加上X,Y轴坐标,该函数是先将指针移动到该坐标点再进行左或中或右键的点击操作,当然也可以进行双击,双击函数是doubleclick()。操作滚轮的函数是scroll(),它的参数必须为正整数。
           (2)  键盘操作:press()函数,该函数我目前只需要制定一个参数,比如我想按“W”键,那么我只需要写成press(‘w’)就可以了,但是这里会有一个小BUG,这个函数是按住W键不松,如果你的游戏或动作是按下W键之后松开,然后再按怎么办呢?别怕,铁头娃作者再告诉你两个函数keydown()keyup(),分别是按下和松开函数,两个配合使用即可实现按下松开的操作了。当然也可以接受组合键,比如CTRL+C的组合键为:hotkey(‘ctrl’, ‘c’),这里不做多的解释了,键盘上有的键都可以进行调用。如果想要获取更多的关于Pyautogui这个第三方库的知识可以去看看官方的文档,网址为:https://pyautogui.readthedocs.io/en/latest/

    2、 关于截图并对比两图是否一样的第三方库
          
           在这一部分上我其实思考过两种替代方法,第一种是直接用PIL第三方模块进行像素对比,第二种是用OpenCV这样一个老牌的计算机视觉来实现。但我思考了很久之后选择了第一种,因为我发现这个游戏每次出现可以按键的时候提示的画面都是一样的,没必要动用带有人工智能的OpenCV,显得有点大材小用。那么我们也分开来说吧,如下:
          (1)  截图:ImageGrab.grab(())函数,两个括号,别以为我写错了,这里面的参数有四个,分别是左上角X轴坐标、左上角Y轴坐标、右下角X轴坐标,右下角Y轴坐标。也就是说你截图区域的左上的那个点的坐标和右下的那个点的坐标。这样就可以决定一个固定的区域。也是为下一步提供对比图。
           (2)  对比:Image.open()函数,用这个函数打开两张图片,然后判断一下即可,这里有个小问题,因为这个方法是进行的像素级对比,也就是说如果两个图片的某一个像素的颜色不对都会返回False(不一样),别问我为什么知道这个,我就上了一次当,还是我把截图放到画图里放大之后才发现的,一个图里的某个像素是白色,而截出来的图中对应像素的颜色是蓝色。些许难受。而且你在截图的时候一定要用save()函数进行保存,要保存了之后才能对比。每次保存完之后不用执行删除截图的操作,下一次截图保存会自动覆盖上一次的图片





    三、具体源码及思路


    1、源码

    [Python] 纯文本查看 复制代码
    import time
    import random
    import pyautogui
    from PIL import Image
    from PIL import ImageFile
    from PIL import ImageGrab
    
    
    def Grab():
        img = ImageGrab.grab((1570, 1026, 1606, 1062))
        img.save('1.png')
    
    
    def Keyboard():
        pyautogui.press('i')
    
    
    def Mouse():
        width = random.randint(2508, 2530)
        high = random.randint(1201, 1222)
        pyautogui.moveTo(width, high, duration=1)
        pyautogui.click(button='right')
        # mou**, mouseY = pyautogui.position()
        # print(str(mou**) + "*" + str(mouseY))
    
    
    def Compare_Image(img1, img2):
        if img1 == img2:
            pyautogui.press('f')
        fp1 = open(img1, 'rb')
        fp2 = open(img2, 'rb')
        im1 = Image.open(fp1)
        im2 = Image.open(fp2)
        ImageFile.LOAD_TRUNCATED_IMAGES = True
        b = im1 == im2
        if im1 == im2:
            pyautogui.press('f')
        fp1.close()
        fp2.close()
        print(b)
        return b
    
    
    if __name__ == '__main__':
        for i in range(1, 4):
            time.sleep(3)
            Keyboard()
            Mouse()
            flag = 1
            while flag:
                Grab()
                a = Compare_Image('fishing.png', '1.png')
                time.sleep(1)
                if a:
                    flag = 0



    2、思路及解释
          
           如上,源码并不多也很简单,简简单单说下思路吧,因为某些函数我都在第二部分说了。首先我对全屏进行了截图,利用微软自带的画图程序找到我需要点击的按钮所在的坐标,见源码第19、20行,这里因为我怕后台检测到为什么这个玩家一直点一个点,控制如此精确,于是使用了随机函数randint(),接下来我将鼠标移动到这个随机的坐标点上进行右键点击操作,见源码第21、22行,其中有一个参数duration=1,这个其实就是让鼠标移动慢点,别一下子移动过去,咱们毕竟要逼真一点鸭~~~,然后对出现的钓鱼按钮进行截图并保存,见源码第9-11行,这里为什么要截图呢,因为他前后两个按钮不一样,如下图:
    前图.png              后图.png

    左图是按下鼠标右键之后的图片,右图是可以钓起来的图片,所以我无限的截取屏幕再与本地的图片进行对比,如果一样就按下F键,见源码第27-41行。最后一个主函数将这些思路连接起来进行一个循环即可得到最终的自动钓鱼效果。


    四、总结

           总的来说这个程序不难,入门级的吧,主要是思路,写程序其实思路挺重要的,也请大佬别喷。如果你觉得和我游戏玩的一样,请来带带我这个小垃圾,哈哈。

           最后的最后,我要声嘶力竭的吼出:Python天下第一。





    shenme bianji
    使用道具 举报 回复
    发表于 2019-6-5 14:26:20

    哈?啥意思呀。。。。
    使用道具 举报 回复
    天析 i春秋作家 Arctic Shell 安全团队 春秋文阁 春秋游侠 突出贡献 积极活跃奖
    地板
    发表于 2019-6-5 15:17:27
    你成功的标题了我
    Arctic Shell 安 全 技 术 团 队 - (๑•̀ㅂ•́)و✧
    使用道具 举报 回复
    发表于 2019-6-5 20:28:58
    这个标题成功吸引我了
    使用道具 举报 回复
    发表于 2019-6-5 23:06:06
    被标题吸引过来
    使用道具 举报 回复
    发表于 2019-6-6 07:54:30
    UC震惊部,无疑。
    使用道具 举报 回复
    huangpan110 i春秋-核心白帽 i春秋第十五军总参谋长兼 核心白帽 春秋游侠 春秋文阁 楚 积极活跃奖 白帽高手
    7#
    发表于 2019-6-6 16:18:15
    你的标题成功吸引了我
    时人不识凌云木,直到凌云始到高
    使用道具 举报 回复
    感谢分享
    使用道具 举报 回复
    使用道具 举报 回复
    使用道具 举报 回复
    大佬这两句   width = random.randint(2508, 2530) high = random.randint(1201, 1222) 随机生成什么?
    使用道具 举报 回复
    发表于 2019-6-10 11:02:12
    freedomwell 发表于 2019-6-7 13:29
    大佬这两句   width = random.randint(2508, 2530) high = random.randint(1201, 1222) 随机生成什么? ...

    随机生成需要点击的按钮的X,Y轴坐标鸭。
    使用道具 举报 回复
    发表于 2019-6-10 17:24:55
    你的标题成功吸引了我
    有一天他会突然觉得累了甚至忘了初衷 放弃了梦想也许因为年纪的关系奔波于现实 然后拉黑了网络认识的所有人或者说不用了一个号码换了一个QQ 那么记得他叫大叔 这个网络他曾来过
    使用道具 举报 回复
    丿SEVEN 发表于 2019-6-10 11:02
    随机生成需要点击的按钮的X,Y轴坐标鸭。

    点击的按钮的X,Y轴坐标,如何获得。。。。。
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册