前言
对于一般人来说,靠编程没法完成一篇文章,做不了ppt,不能够剪辑。但是它很适合处理简单重复的工作。比如在微信朋友圈里自动点赞。
一、PyAutoGui示例代码
WeChat_1.png
WeCaht_2.png
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", "··")