Python模拟点赞助手

背景

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

这就用到了一个 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:用于图像识别,检测屏幕上的特定图标。

注意事项

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

视频演示

见模拟知乎点赞小助手

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器运存使用率多少正常?

服务器运存使用率多少正常,这是一个相对主观的问题,因为服务器的正常运行不仅取决于运存使用率,还与服务器的工作负载、应用程序的特性和需求、服务器的配置和用途等多种因素有关。然而,一般来说,大多数服务器在运存使…

###C语言程序设计-----C语言学习(10)#函数再探

前言:感谢您的关注哦,我会持续更新编程相关知识,愿您在这里有所收获。如果有任何问题,欢迎沟通交流!期待与您在学习编程的道路上共同进步。 目录 一. 基础知识的学习 1.不返回结果函数 2.局部变量 3.全局变量 4.…

AIGC ChatGPT4 实战案例教你VLOOKUP用法

实际需求: 像这样的案例可以通过VLOOKUP来完成,如果不会使用VLOOKUP也没有关系,我们可以先让ChatGPT来帮我们介绍一下VLOOKUP函数的具体用法。 VLOOKUP是Excel中的一个非常有用的函数,用于查找和检索数据。"V"在VLOOKUP…

Java面向对象 this

this 在Java中,this 是一个特殊的引用变量,它引用了当前对象实例。当在类的非静态方法或构造方法中使用时,this 关键字指代当前的对象实例。它经常用于区分对象的成员变量和局部变量,或者调用其他重载的方法。 以下是一些使用 t…

锁(二)队列同步器AQS

一、队列同步器AQS 1、定义 用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。是实现锁的关键。 2、实现 同步器的设计是基于模板方法模式的,也就是说&#…

Ubuntu22.04切换系统cuda版本

由于最近项目要求的cuda版本有差异,而在Ubuntu中可以通过切换cuda来满足需求,现记录如下。 1、按照 Ubuntu22.04与深度学习配置 中的cuda安装章节,将需要的cuda版本下载到本地并进行安装。 2、cuda安装完成后修改bashrc文件内容 sudo gedit …

Spring核心基础:全面总结Spring中提供的那些基础工具类!

内容概要 Spring Framework 提供了众多实用的工具类,这些工具类在简化开发流程、提升代码质量和维护性方面发挥了重要作用,以下是部分关键工具类的总结及其使用场景: StringUtils:不仅提供了基础的字符串操作,如拼接…

倍增c++

快速幂 区间最小值&#xff08;用倍增思想去求&#xff09; #include<bits/stdc.h> using namespace std; #define maxn 110000 #define ll long long int n, a[maxn], f[maxn][40]; int query (int l, int r) {int k (int)(log((r - l 1) * 1.0) / log(2.0));retur…

JWT令牌 | 一个区别于cookie/session的更安全的校验技术

目录 1、简介 2、组成成分 3、应用场景 4、生成和校验 5、登录下发令牌 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初步涉猎Pyth…

selenium+egdedriver+opencv 爬虫使用教程

一、Edge安装 二、Edge版本查看 1、安装内核要保证内核版本已浏览器版本一致 2、Window环境在edge浏览器中输入&#xff1a;edge://version/ 3、Ubuntu环境在浏览器目录执行 ./microsoft-edge-beta -verison 三、EdgeDriver安装 1、下载地址&#xff1a;https://developer.m…

iPhone 14支持NFC吗?如果支持,那么怎么启用

你准备好通过启用NFC来释放iPhone 14的全部潜力了吗&#xff1f;如果你曾经想知道如何在你的设备上利用NFC&#xff0c;那么你就来对地方了。 在本综合指南中&#xff0c;我们将引导你完成在iPhone 14上激活NFC的步骤&#xff0c;使你能够无缝连接其他设备&#xff0c;进行非接…

SpringSecurity(19)——OAuth2客户端信息存储

ClientDetailsService public interface ClientDetails extends Serializable {String getClientId();//客户端idSet<String> getResourceIds();//此客户端可以访问的资源。如果为空&#xff0c;则调用者可以忽略boolean isSecretRequired();//验证此客户端是否需要secr…

python 函数式编程入门:Lambda 函数的魅力

python 函数式编程入门&#xff1a;Lambda 函数的魅力 介绍Lambda 函数的应用排序过滤映射map、filter、reduce数据转换和筛选 介绍 Lambda 函数是 Python 中一个强大的功能&#xff0c;它可以快速创建匿名函数。在函数式编程中&#xff0c;lambda 函数发挥着至关重要的作用。…

Leetcode刷题-(11~15)-Java+Python+JavaScript

算法是程序员的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写算法题吧 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可…

更新至2022年,2008-2022年按行业分城镇单位就业人员相关指标数据(20个指标)

更新至2022年&#xff0c;2008-2022年按行业分城镇单位就业人员相关指标数据 1、时间&#xff1a;2008-2022年 2、来源&#xff1a;统计年鉴、国家统计J、各省年鉴 3、指标&#xff1a;2008-2022年城镇单位就业人员(万人)、2008-2022年农林牧渔业城镇单位就业人员(万人)、制…

idea中git提交代码出现:commit and push checks failed

参考&#xff1a;https://blog.csdn.net/qq_46548855/article/details/126506747

ThinkPHP 中使用Redis

环境.env [app] app_debug "1" app_trace ""[database] database "" hostname "127.0.0.1" hostport "" password "" prefix "ls_" username ""[redis] hostname "127.0.0.1…

浅谈交换原理(3)——交换网络

一、基本概念 交换网络是由若干个交换单元按照一定的拓扑结构和控制方式构成的网络。交换网络的三个基本要素是&#xff1a;交换单元、不同交换单元间的拓扑连接和控制方式。 1.1 单机交换网络与多级交换网络 交换网络按拓扑连接方式可分为&#xff1a;单级交换网络和多级交换网…

第三篇:跨平台QT开发-正则表达式和文件处理

正则表达式 正则表达式即一个文本匹配字符串的一种模式&#xff0c;Qt 中 QRegExp 类实现使用正则表达式 进行模式匹配&#xff0c;且完全支持 Unicode&#xff0c;主要应用&#xff1a;字符串验证、搜索、查找替换、分割。 正则表达式中字符及字符集 元素含义 c 匹配字符本…

mac电脑快捷指令实现拼图

mac访达&#xff0c;搜索输入‘快捷指令’&#xff0c;找到‘快捷指令’&#xff0c; 点击快捷指令&#xff0c;进入快捷指令中心&#xff0c;搜索‘拼图’ &#xff0c;选中‘照片拼图’&#xff0c; 点击‘添加快捷指令’&#xff0c; 在‘所有快捷键指令’中可以看到添加的快…