PyAutoGui自动点赞+解决 TypeError Don‘t know how to convert parameter 4 问题


前言

对于一般人来说,靠编程没法完成一篇文章,做不了ppt,不能够剪辑。但是它很适合处理简单重复的工作。比如在微信朋友圈里自动点赞。


一、PyAutoGui示例代码

WeChat_1.png
朋友圈自动点赞1
WeCaht_2.png
朋友圈自动点赞2

Python有个库——PyAutoGui,它可以很方便地实现自动化。我觉得它最强大的功能在于识图,而且还有模糊度选项(需搭配OpenCV库),实在是自动化的一项利器。

先来解释下这个getpic函数,它不仅能找到指定的图片,还会自动点击图片的中心,如果点击成功,返回图片在显示屏上的纵坐标。否则返回0。

我之所以能将不同图像用一个函数来实现。是因为我截取的图片都是上下左右对称的,而且中心位置就是要点击的位置。

import pyautogui as au

def getpic(pic_path: str, imply: str) -> int:
    box = au.locateOnScreen(pic_path)
    if box:
        pos = (box.left + box.width // 2, box.top + box.height // 2)
        print(imply, "位于", pos)

        au.click(pos)
        return int(box.top+box.height)
    print("未找到", pic_path)
    return 0

while True:

    down=getpic("WeChat_1.png", "··")
    if not(down and getpic("WeChat_2.png", "爱心")):
            break
    
    au.scroll(-down)
    au.sleep(1)

下面while循环部分实现自动往下翻页,但是到底要翻多少呢?每个人发的朋友圈,其内容长度不尽相同,因此往下翻多少个像素要随内容在y方向的长度而变。这就用到了down变量,它记录上一条朋友圈的长度(准确来说是··这个图标在显示器上的y坐标)然后往下翻,把这条朋友圈翻到不被显示的时候,进入下一个循环,查找下一条朋友圈。

看到这里,你觉得奇怪了,什么时候循环退出呢?总不能变成死循环吧。在这里,只要找不到··图标,或者点开··图标之后,没有爱心选项,那么就自动退出循环。

二、解决问题<class ‘TypeError’>: Don’t know how to convert parameter 4

笔者在写代码的时候
之前函数返回box.top+box.height的时候是没有加int( )的,即

        return box.top+box.height

之后就遇到了

    ctypes.windll.user32.mouse_event(ev, ctypes.c_long(convertedX), ctypes.c_long(convertedY), dwData, 0)        
ctypes.ArgumentError: argument 4: <class 'TypeError'>: Don't know how to convert parameter 4

这个问题。

错误类型是TypeError,提示说无法转换参数4
我debug了一下,发现是这一句报错。

    au.scroll(-down)

怎么回事呢?
python很多库都是用C或C++写的,C系列语言有个特点就是必须声明变量的数据类型编译器是不会去判断这是一个int还是一个char的。
PyAutoGui应该也是用C++写的,scroll函数在接受到down的时候,down的数据类型和函数return的box.top+box.height是一样的。而box是locateOnScreen返回的一个没有确定是什么类的类。

(variable) box: Any
(function) locateOnScreen: (*args: Any, **kwargs: Any) -> Any

这么一来,box.top和box.height也就不知道是什么东西了,down的数据类型也就不确定。因此,Python解释器没法确定它属于什么数据类型,就报错TypeError。

解决办法其实很简单,只需要用int函数将box.top+box.height变成int

def getpic(pic_path: str, imply: str):

        return int(box.top+box.height) #注意这个int( )
	
	return 0

或者

    down=getpic("WeChat_1.png", "··")
    
    down = int(down) #注意这个int( )

另外在函数定义的后面加上 ->int声明返回值类型


def getpic(pic_path: str, imply: str) -> int:  #注意这个 ->int

        return box.top+box.height
    return 0

这种做法是无效的,后面的->只是相当于写了个注释给别人看而已。

赋值时写上:int=也是无用功

down:int=getpic("WeChat_1.png", "··")

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值