Python模拟点赞助手

news2024/12/27 2:08:15

背景

之前公司一直会安排各种学习任务,视频章节很多的视频,有些是技术的有些是政策相关的,如果没有按时完成学习任务会被通报。但是,这些学习内容不一定有帮助,所以大家就养成了刷课的习惯,也就是点开视频,让它在那挂着。但是有个问题,视频播放过程会检测用户有没有操作,如果检测长时间不操作会弹框提示,只有点击弹框上的继续按钮才能继续播放,这就导致我们在刷课的时候要经常关注页面有没有暂停,刷课的效率有点低。为此就做了一个桌面图标检测的小工具,它测到桌面出现特定的图标之后,再模拟鼠标点击,完成继续播放的功能。

这就用到了一个 python 库——PyAutoGUI。下面就是这个库的使用的方式,并且利用这个库做一个刷赞的助手来供参考,但是建议不要拿来真正的去刷赞。

PyAutoGUI库基础

pyautogui是一个 Python 库,用于编程方式控制鼠标和键盘操作,可以用于自动化测试、任务和其他需求。以下是一个 pyautogui基础使用教程。

安装 pyautogui

首先,需要安装 pyautogui

pip install pyautogui

基本使用

移动鼠标

pyautogui可以控制鼠标移动到屏幕上的特定位置。这可以通过 moveTo函数实现,它需要 x 和 y 坐标作为参数。

import pyautogui

# 移动鼠标到屏幕的(100, 100)位置
pyautogui.moveTo(100, 100, duration=1)

duration参数是可选的,表示移动到指定位置所需的时间,单位为秒。

点击鼠标

使用 click函数可以模拟鼠标点击,也可以指定点击的位置。

# 在当前位置点击鼠标左键
pyautogui.click()

# 在屏幕的(200, 200)位置点击鼠标右键
pyautogui.click(200, 200, button='right')

滚动鼠标

scroll 函数可以滚动鼠标。正数表示向上滚动,负数表示向下滚动。这个单位并不直接对应于屏幕上的像素数量,而是依赖于操作系统和应用程序的滚动设置。例如,在一些文本编辑器或网页浏览器中,一行可能被定义为一个文本行的高度,而在其他上下文中,则可能依赖于系统的滚动速度设置。

# 向上滚动
pyautogui.scroll(200)

# 向下滚动
pyautogui.scroll(-200)

键盘操作

pyautogui还可以模拟键盘操作,如按键、输入文字等。

# 按下并释放空格键
pyautogui.press('space')

# 输入字符串
pyautogui.write('Hello, pyautogui!', interval=0.25)

interval参数表示每个字符之间的延迟时间,单位为秒。

截图功能

pyautogui可以捕获屏幕的截图,这对于自动化测试和监控非常有用。

# 捕获全屏截图
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')

识别图像

pyautogui可以在屏幕上找到图像的位置。如果找到会返回一个四元组 (left, top, width, height),表示找到的图像在屏幕上的位置和大小。如果没有找到匹配的图像,函数返回 None。可以通过 confidence参数增加搜索的容错能力。confidence参数用于指定匹配的精度,范围从0到1。注意,使用 confidence参数需要安装 opencv-python库。

location = pyautogui.locateOnScreen('button.png', confidence=0.9)

注意事项

  • 使用 pyautogui时,特别是在自动控制鼠标和键盘时,要确保有足够的安全措施,比如设置延迟或使用 pyautogui.FAILSAFE = True启用故障安全特性。当启用故障安全特性时,将鼠标移动到屏幕左上角将抛出 pyautogui.FailSafeException,从而中断脚本。
  • 在运行自动化脚本之前,确保了解代码将执行的操作,以防止鼠标键盘的意外操作或其他问题。

实现原理

该工具的核心是使用Python库 pyautoguipynputopencv-python来实现自动化的互动行为。工作流程如下:

  1. 打开知乎关注页面:首先,手动打开知乎的关注页面,准备开始自动化操作。
  2. 屏幕检测赞同图标:工具将不断扫描屏幕,寻找特定的赞同图标。
  3. 模拟用户阅读:一旦发现赞同图标,工具会先模拟点击图标上方一行以打开全文,然后模拟鼠标上下滚动来模拟阅读过程。
  4. 自动点赞:阅读完毕后,工具模拟点击赞同图标,完成点赞操作。
  5. 退出阅读,继续检测:识别到收起图标后,退出阅读状态,并模拟鼠标下滑,准备检测下一个赞同图标。

通过这一系列操作,工具能够自动在知乎上为文章点赞,模拟用户的正常浏览行为。

赞同图标

收起图标

已点赞图标

Show me the code

代码获取

项目代码已托管于 GitHub,可通过以下链接下载代码和图标:GitHub - 知乎点赞机器人

import random
import time
import pyautogui

from pynput import keyboard
import threading

# 监听ESC键标识(监听到ESC键时,停止运行)
listener_esc = False

# 图像样本的路径
agree_path = 'image/agree.png'
read_more_path = 'image/read_more.png'
close_path = 'image/close.png'

# 休息时长(单位s,最好调长一点)
sleep_time = 1

# 置信度(建议调高,不然容易误触)
confidence = 0.8

# 鼠标滚动速度
scroll_speed = 10


def on_press(key):
    # 按键按下时的操作
    try:
        if key == keyboard.Key.esc:
            # 当检测到ESC键被按下时,输出信息并停止监听
            print('ESC键被按下,停止监听。')

            # ESC已按下
            global listener_esc
            listener_esc = True
            # 返回False来停止监听器
            return False
    except AttributeError:
        pass


def get_a_number(a, b):
    """
    生成一个随机数[a, b]
    :return:
    """
    return random.Random().randint(a, b)


def on_release(key):
    # 按键释放时的操作
    pass


def start_listener():
    """
    监听ESC键
    :return:
    """
    with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()


def reading():
    """
    模拟阅读
    1、随机滚动鼠标次数
    2、随机滚动像素行数
    :return:
    """
    # 随机上下滚动鼠标次数()
    scroll_times = get_a_number(1, 3)

    while scroll_times > 0 and not listener_esc:
        # 随机滚动像素行数
        lines = get_a_number(50, 100)

        # 向下滑动
        for _ in range(int(lines / scroll_speed)):
            pyautogui.scroll(-scroll_speed)
        time.sleep(sleep_time)

        # 向上滑动,为了能回到刚刚的位置
        for _ in range(int(lines / scroll_speed)):
            pyautogui.scroll(scroll_speed)
        time.sleep(sleep_time)

        scroll_times -= 1


def close():
    """
    模拟关闭阅读,循环是为了防止坐标不准确导致没关掉
    :return:
    """

    try:
        close_location = pyautogui.locateOnScreen(close_path, confidence=confidence)
        while close_location:
            # 计算图像中心点
            center = pyautogui.center(close_location)
            pyautogui.click(center)
            print(f"close-Clicked on {center}")
            time.sleep(sleep_time)

            close_location = pyautogui.locateOnScreen(close_path, confidence=confidence)

    except pyautogui.FailSafeException:
        print("close not found")
        return


def do_read(x, y):
    """
    模拟点击“”
    :param x:
    :param y: 赞同上方约50像素位置点击即可查看全文
    :return:
    """
    # 在屏幕上查找阅读全文图像
    if not listener_esc:
        # 点击查看全文
        pyautogui.click(x, y)
        print(f"Read more-Clicked on {x}, {y}")

        # 加载内容
        time.sleep(sleep_time)

        # 阅读
        reading()


def do_click():
    """
    模拟点赞
    :return:
    """

    # 检查是否按下了ESC键,如果是,则退出循环
    while not listener_esc:
        # 给自己一些时间准备切换到目标应用窗口
        time.sleep(sleep_time)

        try:
            # 在屏幕上查找赞同图像,可以调整confidence参数以适应图像匹配的准确性要求
            agree_location = pyautogui.locateOnScreen(agree_path, confidence=confidence)

            if agree_location:
                # 计算图像中心点
                center = pyautogui.center(agree_location)
                x, y = center

                # 模拟阅读
                do_read(x, y - 50)

                # 点赞
                if not listener_esc:
                    # pyautogui.click(x, y)  # 防止坐标因移动而造成的偏差,重新获取赞同坐标
                    agree_location = pyautogui.locateOnScreen(agree_path, confidence=confidence)
                    center = pyautogui.center(agree_location)
                    pyautogui.click(center)
                    print(f"Agree - Clicked on {center}")

                    # 点击关闭按钮
                    close()

        except pyautogui.ImageNotFoundException:
            print("agree not found. Trying again...")

            # 短暂暂停,以便循环不会过于频繁地执行
            time.sleep(sleep_time)

        # 向下滚动,大概向下滚动200像素行
        for _ in range(int(200 / scroll_speed)):
            pyautogui.scroll(-scroll_speed)

    print("Exited.")


# 创建并启动线程监听ESC键
listener_thread1 = threading.Thread(target=start_listener)
listener_thread1.start()

# 这里的代码可以在不被阻塞的情况下执行
print("Like mode begin...")
do_click()
print("Like mode end...")

依赖安装

为了运行本工具,需要安装以下Python库:

pip install pyautogui pynput opencv-python
  • pyautogui:用于模拟鼠标点击和滚动操作。
  • pynput:用于模拟键盘输入,捕获退出信号。
  • opencv-python:用于图像识别,检测屏幕上的特定图标。

注意事项

  • 坐标精确性:确保使用的像素坐标是左上角的,而不是中心坐标,以提高识别精度。
  • 图标清晰度:点赞和关闭按钮的截图需要清晰,且截图时的网页缩放比例应与程序运行时一致。
  • 防检测措施:为避免被平台检测,建议设置较长的随机休息时间。
  • 合理使用:本项目仅供学习和研究使用,请勿用于任何违规行为。

视频演示

见模拟知乎点赞小助手

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1437749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络协议与攻击模拟_15FTP协议

了解FTP协议 在Windows操作系统上使用serv-U软件搭建FTP服务 分析FTP流量 一、FTP协议 1、FTP概念 FTP(文件传输协议)由两部分组成:客户端/服务端(C/S架构) 应用场景:企业内部存放公司文件、开发网站时利…

离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言

离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言。 要实现翻译需要解决以下3个主要问题: 1)from:内容本身的语言类型是什么&#xf…

Android Studio从零基础到APP上线(3)

第3章 简单控件 本章介绍App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图,容纳视图的常用布局,响应点击的按钮控件,显示图片的图像视图等。然后结合本章所学的知识,演示一个实战项目“简单计算器”的设计与实现。 3.1 文本显示 本节介绍如何在文本视图Tex…

社交分享效果统计:Xinstall助您精确追踪用户行为,优化推广策略

在移动互联网时代,社交分享已成为App推广的重要手段之一。通过微信、QQ等社交工具及主流浏览器的多渠道分享邀请,可以实现裂变式的推广效果,迅速扩大App的用户群体。然而,如何精确统计社交分享带来的安装量、注册量等关键数据&…

SQL常用语句大全

我们在进行开发工作时,对数据库的操作是必不可少的,熟练掌握SQL语句可以让我们对数据库的数据处理变得非常简单,所以学习SQL语句是非常有必要的,下面汇总了一些常用的SQL语句 SQL语句的类型 DDL(Data Definition Language)数据定…

Deepin基本环境查看(八)【系统安全:房、车、查房、查车】

Deepin基本环境查看(八)【系统安全:房、车、查房、查车】 - 相关文章目录1、概述2、想象中的... 现实中的...1)想象中的我2)梦幻中的我3)现实中的我 3 要房、要车、还是房车都要1)超级计算机2&a…

Yearning审核平台本地安装配置并结合内网穿透实现远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用…

【Linux系统化学习】自定义简易shell

目录 环境变量在进程替换中的继承 在当前进程中添加环境变量 putenv函数 环境变量被继承的原因 使用ecexle传递环境变量 传递自己的环境变量表 自定义简易的shell 获取主机、使用者、工作目录 获取命令 切割分解命令 创建子进程执行命令 内建命令的特殊处理 完整代…

CSS之盒子模型

盒子模型 01-选择器 结构伪类选择器 基本使用 作用&#xff1a;根据元素的结构关系查找元素。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IE…

根据MySql建表语句创建Java实体类工具

点击下载《根据MySql建表语句创建Java实体类工具》 1. 前言 在软件开发领域&#xff0c;特别是在构建企业级应用时&#xff0c;数据模型与代码模型之间的映射是至关重要的。该软件是一款基于C#开发的高效工具&#xff0c;它将这一繁琐且容易出错的过程变得简洁且快速。此工具…

5.0 ZooKeeper 数据模型 znode 结构详解

数据模型 在 zookeeper 中&#xff0c;可以说 zookeeper 中的所有存储的数据是由 znode 组成的&#xff0c;节点也称为 znode&#xff0c;并以 key/value 形式存储数据。 整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。 进入 zookeeper 安装的 …

【wu-lazy-cloud-network】Java自动化内网穿透

项目介绍 wu-lazy-cloud-network 是一款基于&#xff08;wu-framework-parent&#xff09;孵化出的项目&#xff0c;内部使用Lazy ORM操作数据库&#xff0c;主要功能是网络穿透&#xff0c;对于没有公网IP的服务进行公网IP映射 使用环境JDK17 Spring Boot 3.0.2 功能 1.内网…

MRAM存内计算:现状及挑战

1 传统冯诺依曼瓶颈 随着人工智能、物联网、智能传感等应用的快速兴起&#xff0c;数据以爆发式的速度增长。海量数据的高效存储、迁移与处理成为当前信息领域的重大挑战。受限于经典的冯诺依曼计算架构存储与处理分离的特性&#xff0c;在面向大数据分析等应用场景中&#xff…

计算机设计大赛 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

MybatisPlus快速入门及常见设置

目录 一、快速入门 1.1 准备数据 1.2 创建SpringBoot工程 1.3 使用MP 1.4 获取Mapper进行测试 二、常用设置 2.1 设置表映射规则 2.1.1 单独设置 2.1.2 全局设置 2.2 设置主键生成策略 2.2.1 为什么会有雪花算法&#xff1f; 2.2.2 垂直分表 2.2.3 水平分表 2.…

用云手机打造tiktok账号需要注意些什么?

随着tiktok平台的火热&#xff0c;越来越多的商家开始尝试更高效的tiktok运营方法。其中&#xff0c;tiktok云手机作为一种新科技引起了很多人的注意&#xff0c;那么用云手机运营tiktok需要注意些什么&#xff1f;下文将对此进行详细解析。 1. 不是所有的云手机都适合做tiktok…

AI-数学-高中-23-三角函数的平移与伸缩

原作者视频&#xff1a;三角函数】11三角函数的平移伸缩&#xff08;易&#xff09;_哔哩哔哩_bilibili 左加右减&#xff1a;针对函数中的x变化&#xff0c;上加下减&#xff1a;针对函数f(x)变化。 示例1&#xff1a; 示例2&#xff1a; 示例3

解锁售前新效能:AI助手使用的三点建议

1.售前工作概述 自从阴差阳错从技术实施转做售前到现在也有10多年时间&#xff0c;与技术实施仅负责设备安装调试、用户使用培训以及售后维护等被动工作不同。售前更多的是针对用户的主动性工作&#xff0c;包括需求调研与分析、技术沟通与咨询、方案设计与制定、方案演示与讲…

C#在既有数组中插入另一个数组:Array.Copy方法 vs 自定义插入方法

目录 一、使用的方法 1.使用Array.Copy方法 2.Copy(Array, Int32, Array, Int32, Int32) 3. 使用自定义的方法 二、实例 1.示例1&#xff1a;使用Array.Copy方法 2.示例2&#xff1a;使用自定义的方法 一、使用的方法 1.使用Array.Copy方法 首先定义了一个名为InsertAr…

Docker 有哪些常用的命令和操作?

Docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。以下是Docker的一些常用命令和操作&#xff1a; 安装和启动Docker 要使用Do…