Python实现游戏双人共玩:输入劫持与分时复用技术详解
最近在关注《英雄联盟》韩服高端局直播时发现一种极具节目效果的玩法——“双人共玩”模式俗称“双头食人魔”由两位主播如杨哥和凯哥共同操控一个英雄。这种玩法不仅考验两位玩家的默契更因其操作上的“抽象”和结果上的“反差”而笑点频出常常创造出“伤害比辅助还低”的名场面。对于游戏开发者、内容创作者乃至普通玩家而言这背后其实涉及游戏机制、数据交互、直播技术以及节目效果设计的综合知识。本文将从一个技术实践者的角度深度拆解如何模拟实现一个类似“双人共玩”的本地联机控制程序。我们将从原理分析、环境搭建、核心代码实现、数据同步策略到最终的程序演示和性能优化提供一个完整的、可运行的实战项目。无论你是想学习网络编程、游戏外设控制还是对直播互动技术感兴趣都能从中获得启发。1. 核心概念与原理分析在深入代码之前我们首先要理解“双人共玩”在技术层面的本质。它并不是游戏内置的功能而是通过外部程序实现的“输入劫持”与“指令融合”。1.1 什么是“输入劫持”游戏通常接收来自一套键盘鼠标的输入信号。“输入劫持”是指我们的程序作为一个“中间人”同时监听两套输入设备如两套键盘然后根据一定的规则将这两套输入合并或选择一套再模拟成一套标准的输入信号发送给游戏。这样游戏就认为只有一个玩家在操作但实际上指令来源有两个。1.2 核心挑战指令冲突与融合策略当杨哥控制移动和凯哥控制技能同时下达指令时程序需要解决冲突。例如移动冲突两人同时向不同方向移动。策略可以是“后来者优先”、“向量叠加”但游戏通常不支持或“分配给不同轴向”如一人控X轴一人控Y轴。技能冲突两人同时按不同技能键。策略可以是“队列化”、“优先级”或“随机选择”。 我们项目将采用一种简单且节目效果十足的策略分时复用。即程序以极快的速度如每秒10次在两套输入间切换将控制权轮流交给两位玩家从而实现一种“抽搐式”的协同操作这恰好还原了直播中“操作变形”的喜剧效果。1.3 技术栈选择语言Python。因其拥有丰富的库来监听键盘事件和模拟输入开发速度快适合原型验证。核心库pynput用于监听和控制键盘、鼠标事件。socket(Python标准库)用于实现两台电脑之间的网络通信模拟远程遥控。threading用于处理并发的输入监听和网络通信。2. 环境准备与项目结构2.1 开发环境操作系统Windows 10/11 (因为游戏和大部分直播环境在Windows)Python版本3.8 或以上IDEVS Code, PyCharm 或任何文本编辑器均可。2.2 安装依赖库在命令行中执行以下命令安装必要的库pip install pynputsocket和threading是Python内置库无需安装。2.3 项目结构规划创建如下目录和文件dual_player_control/ ├── main_local.py # 单机双键盘控制版本核心 ├── main_network.py # 网络联机版本凯哥遥控版 ├── input_manager.py # 输入管理核心类 ├── network_server.py # 网络服务端 ├── network_client.py # 网络客户端 └── README.md本文我们将重点实现main_local.py和input_manager.py这是实现“双头食人魔”效果的核心。3. 核心模块输入管理器Input Manager实现这个模块负责监听两套输入并按照“分时复用”策略将其融合成一套输出。3.1 创建input_manager.py# input_manager.py from pynput import keyboard from pynput.keyboard import Controller, Key import time import threading from collections import defaultdict class DualInputManager: 双人输入管理器。 监听两套键盘输入并按照分时复用策略模拟输出。 def __init__(self, switch_interval0.1): 初始化管理器。 :param switch_interval: 控制权切换间隔秒默认0.1秒。越小越“抽搐”。 self.switch_interval switch_interval self.keyboard_controller Controller() # 记录两个玩家当前按下的键 self.player1_pressed set() self.player2_pressed set() # 当前激活的玩家1或2 self.active_player 1 self.last_switch_time time.time() # 监听器对象 self.listener1 None self.listener2 None # 运行标志 self.running False # 定义游戏常用键位映射以英雄联盟为例 self.game_keys { q: q, w: w, e: e, r: r, # 技能 d: d, f: f, # 召唤师技能 1: 1, 2: 2, 3: 3, 4: 4, # 物品栏 space: Key.space, # 锁定视角/中心 tab: Key.tab, # 记分板 } def on_press_player1(self, key): 玩家1按键按下事件 try: key_char key.char except AttributeError: key_char str(key).split(.)[-1] # 处理特殊键如 Key.space if key_char in self.game_keys or hasattr(key, char): self.player1_pressed.add(key_char) print(f[玩家1] 按下: {key_char}) def on_release_player1(self, key): 玩家1按键释放事件 try: key_char key.char except AttributeError: key_char str(key).split(.)[-1] if key_char in self.player1_pressed: self.player1_pressed.discard(key_char) print(f[玩家1] 释放: {key_char}) def on_press_player2(self, key): 玩家2按键按下事件 try: key_char key.char except AttributeError: key_char str(key).split(.)[-1] if key_char in self.game_keys or hasattr(key, char): self.player2_pressed.add(key_char) print(f[玩家2] 按下: {key_char}) def on_release_player2(self, key): 玩家2按键释放事件 try: key_char key.char except AttributeError: key_char str(key).split(.)[-1] if key_char in self.player2_pressed: self.player2_pressed.discard(key_char) print(f[玩家2] 释放: {key_char}) def _switch_active_player(self): 内部方法根据时间切换激活玩家 current_time time.time() if current_time - self.last_switch_time self.switch_interval: self.active_player 2 if self.active_player 1 else 1 self.last_switch_time current_time # 切换时释放上一个玩家的所有键避免卡键 self._release_all_keys() print(f切换控制权 - 玩家{self.active_player}) def _release_all_keys(self): 模拟释放所有当前可能被按下的游戏键 for key in self.game_keys.values(): if isinstance(key, str): self.keyboard_controller.release(key) else: # 是 Key 对象 self.keyboard_controller.release(key) def _apply_active_player_keys(self): 应用当前激活玩家的按键状态到系统 active_pressed_set self.player1_pressed if self.active_player 1 else self.player2_pressed # 按下当前激活玩家所有按下的键 for key_char in active_pressed_set: if key_char in self.game_keys: target_key self.game_keys[key_char] self.keyboard_controller.press(target_key) # 注意释放操作在 _switch_active_player 和按键释放事件中处理 def start_listeners(self): 启动两个键盘监听器需要两个物理键盘 # 监听器1通常对应第一个插入的键盘 self.listener1 keyboard.Listener( on_pressself.on_press_player1, on_releaseself.on_release_player1) # 监听器2通常对应第二个插入的键盘 self.listener2 keyboard.Listener( on_pressself.on_press_player2, on_releaseself.on_release_player2) self.listener1.start() self.listener2.start() print(双键盘监听器已启动。请确保两个键盘已连接。) def run(self): 主循环运行输入融合逻辑 self.running True self.start_listeners() print(开始双人共玩控制循环... 按 Esc 键退出。) try: while self.running: # 1. 判断是否需要切换控制权 self._switch_active_player() # 2. 应用当前激活玩家的按键 self._apply_active_player_keys() # 3. 短暂休眠降低CPU占用 time.sleep(0.01) # 10ms except KeyboardInterrupt: pass finally: self.stop() def stop(self): 停止所有监听器和循环 self.running False if self.listener1: self.listener1.stop() if self.listener2: self.listener2.stop() self._release_all_keys() print(程序已停止。) # 全局退出监听 def on_global_release(key): 全局按键监听用于退出程序 if key keyboard.Key.esc: print(接收到退出信号(Esc)。) return False # 这会停止 pynput 的全局监听器 if __name__ __main__: manager DualInputManager(switch_interval0.15) # 0.15秒切换一次效果明显 # 启动一个全局监听器来捕获Esc键 with keyboard.Listener(on_releaseon_global_release) as global_listener: # 在新线程中运行管理器主循环避免阻塞Esc监听 import threading manager_thread threading.Thread(targetmanager.run) manager_thread.start() global_listener.join() # 等待Esc键 manager.stop() manager_thread.join()代码关键点解释双监听器pynput可以创建多个Listener实例来监听不同设备但需要系统识别为独立键盘。分时复用_switch_active_player方法根据switch_interval定期切换active_player。切换时会强制释放所有键防止“卡键”。键位映射game_keys字典将监听的按键映射到游戏实际按键方便自定义。状态同步使用集合(set)来记录每个玩家按下的键确保按下和释放事件能正确配对。4. 单机双键盘实战演示接下来我们创建主程序来使用这个输入管理器。4.1 创建main_local.py# main_local.py from input_manager import DualInputManager import time def main(): print(*50) print(《英雄联盟》双人共玩模拟器 - 单机双键盘版) print(说明) print(1. 请确保两个USB键盘已连接到电脑。) print(2. 玩家1使用第一个键盘玩家2使用第二个键盘。) print(3. 控制权会每隔一定时间自动切换。) print(4. 游戏前请将输入法切换为英文。) print(5. 按 Esc 键退出程序。) print(*50) time.sleep(2) # 给用户阅读时间 # 初始化管理器设置切换间隔为0.2秒这样操作不连贯感会很强节目效果足 manager DualInputManager(switch_interval0.2) try: manager.run() except Exception as e: print(f程序运行出现错误: {e}) manager.stop() if __name__ __main__: main()4.2 运行与测试连接硬件将两个USB键盘连接到你的电脑。系统会自动识别。启动游戏打开《英雄联盟》并进入训练模式或自定义模式。运行程序在命令行中切换到项目目录运行python main_local.py开始操作让一位朋友操作第二个键盘。两人尝试同时操作一个英雄。你会发现控制权在快速切换英雄移动和施法会显得非常“抽象”和“犹豫”完美复刻“双头食人魔”操作。在游戏中尝试补刀、放技能观察因为控制权切换导致的失误。退出按下键盘上的Esc键程序会安全退出。4.3 预期效果与节目效果分析运行程序后英雄的控制权会以0.2秒为单位在两个玩家间轮换。这将导致移动英雄路径呈“之”字形或突然停顿。技能技能可能指向错误方向或在关键时刻被打断。补刀补刀成功率急剧下降。最终结果游戏数据面板上该英雄的伤害量很可能低于辅助英雄创造出“节目效果”。5. 网络联机版模拟“凯哥遥控”场景直播中“凯哥遥控”意味着一位主播通过网络远程控制另一台电脑上的游戏。我们可以用简单的Socket编程模拟。5.1 创建网络服务端 (network_server.py)服务端运行在“杨哥”的电脑上运行游戏的主机接收“凯哥”发来的指令。# network_server.py import socket import threading from input_manager import DualInputManager class RemoteControlServer: def __init__(self, host0.0.0.0, port12345): self.host host self.port port self.server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.input_manager DualInputManager(switch_interval0.5) # 网络版切换可以慢一点 self.remote_keys set() # 存储远程按下的键 self.running False def handle_client(self, client_socket): 处理远程客户端凯哥的连接 print([服务器] 远程控制器已连接。) client_socket.send(bConnected to Dual-Player Server.\n) while self.running: try: data client_socket.recv(1024).decode(utf-8).strip() if not data: break # 指令格式: press:q 或 release:q if data.startswith(press:): key data.split(:)[1] self.remote_keys.add(key) print(f[远程指令] 按下: {key}) elif data.startswith(release:): key data.split(:)[1] self.remote_keys.discard(key) print(f[远程指令] 释放: {key}) except ConnectionResetError: break client_socket.close() print([服务器] 远程控制器断开连接。) def start(self): self.running True self.server_socket.bind((self.host, self.port)) self.server_socket.listen(1) print(f[服务器] 监听在 {self.host}:{self.port}等待远程控制器连接...) # 启动输入管理器本地玩家仍可用键盘1控制 self.input_manager.start_listeners() # 接受客户端连接 client_sock, addr self.server_socket.accept() client_thread threading.Thread(targetself.handle_client, args(client_sock,)) client_thread.start() # 修改管理器的逻辑将远程按键视为“玩家2” print([服务器] 开始融合本地与远程控制...) try: while self.running: self.input_manager._switch_active_player() # 将远程按键同步到管理器的player2_pressed集合 self.input_manager.player2_pressed self.remote_keys.copy() self.input_manager._apply_active_player_keys() threading.Event().wait(0.01) except KeyboardInterrupt: pass finally: self.stop() def stop(self): self.running False self.input_manager.stop() self.server_socket.close() print([服务器] 已关闭。) if __name__ __main__: server RemoteControlServer() server.start()5.2 创建网络客户端 (network_client.py)客户端运行在“凯哥”的电脑上发送按键指令。# network_client.py import socket from pynput import keyboard class RemoteControllerClient: def __init__(self, server_ip127.0.0.1, port12345): self.server_ip server_ip self.port port self.socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) def connect(self): try: self.socket.connect((self.server_ip, self.port)) print(f[客户端] 已连接到服务器 {self.server_ip}:{self.port}) print(现在可以开始操作你的按键将控制远程英雄。) return True except Exception as e: print(f[客户端] 连接失败: {e}) return False def on_press(self, key): 检测本地按键并发送给服务器 try: key_char key.char except AttributeError: key_char str(key).split(.)[-1] # 只发送游戏相关键 game_keys [q,w,e,r,d,f,1,2,3,4,space,tab] if key_char in game_keys: cmd fpress:{key_char} self.socket.send(cmd.encode(utf-8)) def on_release(self, key): 检测本地释放键并发送给服务器 try: key_char key.char except AttributeError: key_char str(key).split(.)[-1] game_keys [q,w,e,r,d,f,1,2,3,4,space,tab] if key_char in game_keys: cmd frelease:{key_char} self.socket.send(cmd.encode(utf-8)) if key keyboard.Key.esc: # 按Esc退出客户端 print([客户端] 退出。) return False def start(self): if not self.connect(): return # 启动键盘监听 with keyboard.Listener(on_pressself.on_press, on_releaseself.on_release) as listener: listener.join() self.socket.close() if __name__ __main__: # 使用时需要将 ‘127.0.0.1‘ 改为运行 server 的电脑的 IP 地址 SERVER_IP input(请输入服务器IP地址 (例如 192.168.1.100): ).strip() or 127.0.0.1 client RemoteControllerClient(server_ipSERVER_IP) client.start()5.3 网络版运行流程在主机杨哥电脑上运行游戏。运行python network_server.py。在控制端凯哥电脑上确保网络互通或在同一局域网。运行python network_client.py输入主机IP地址。效果凯哥的按键会通过网络发送到杨哥的电脑并与杨哥本地的输入进行“分时复用”融合共同控制一个英雄。由于网络延迟操作会更加不可预测节目效果加倍。6. 常见问题与排查思路在实现和运行上述程序时你可能会遇到以下问题问题现象可能原因解决思路ModuleNotFoundError: No module named pynput未安装pynput库。使用pip install pynput命令安装。第二个键盘按键无反应系统未正确识别第二键盘或pynput未能捕获其事件。1. 在系统设置中检查键盘是否被识别。2. 尝试交换两个键盘的USB端口。3. 使用pynput的调试功能打印所有键盘事件查看第二个键盘的事件码。游戏内角色完全不受控制或控制错乱游戏键位映射错误或输入法未切换为英文。1. 检查input_manager.py中的game_keys字典确保键位与游戏内设置匹配。2.务必在运行程序前将输入法切换为英文美式键盘这是最常见的问题。程序报错OSError: [Errno 48] Address already in use网络端口被占用。1. 检查是否已有程序占用12345端口。2. 修改network_server.py中的port为其他值如 54321。网络客户端连接失败防火墙阻止、IP地址错误、服务器未启动。1. 确认服务器程序已运行。2. 确认客户端输入的服务器IP正确主机IP不是127.0.0.1。3. 暂时关闭主机防火墙测试。按键“卡住”不释放程序异常退出或切换逻辑bug导致释放信号未发送。1. 确保通过按Esc键正常退出程序。2. 在游戏外如记事本测试程序观察按键是否正常释放。3. 检查_release_all_keys方法是否被正确调用。7. 最佳实践与工程化建议如果要将此技术用于更稳定的直播互动或开发更复杂的工具需要考虑以下几点输入去抖与平滑目前的“分时复用”策略非常生硬。可以引入“权重”或“投票”机制。例如连续收到同一方向移动指令时增加该方向权重使操作在冲突时有一定惯性而非纯粹随机切换。指令队列与超时为每个玩家的指令建立一个微小的队列例如保存最近100ms的指令。融合时从队列中按规则取出指令执行可以缓解网络延迟带来的问题。心跳与状态同步在网络版中加入心跳包机制。客户端定期发送心跳服务端检测到超时则自动释放所有远程按键防止因网络断开导致角色“卡死”。配置化将键位映射、切换间隔、网络端口等参数提取到配置文件如config.ini或config.json中方便不同游戏和场景调整。用户界面开发一个简单的GUI使用Tkinter或PyQt显示当前激活玩家、连接状态、按键日志等提升可操作性。安全与伦理仅用于单机游戏或自定义模式此技术可能违反在线游戏的用户协议严禁在排位赛等正式模式中使用否则可能导致封号。明确告知观众在直播中使用时应明确告知观众这是通过外部程序实现的娱乐效果并非游戏漏洞或外挂。本地测试所有开发与测试请在训练模式或单人游戏中进行。性能优化主循环中的time.sleep(0.01)是必要的但可以改为使用事件驱动模型如asyncio来降低CPU占用实现更精确的时序控制。通过这个项目我们不仅复现了“双头食人魔”的节目效果更深入理解了输入设备监听、模拟、网络通信和多线程编程等实用技术。你可以在此基础上扩展例如加入鼠标控制融合、语音控制接口甚至开发成一个正式的直播互动插件。

相关新闻

Seedance2.0动态光影重绘实战:规避API兼容性三大陷阱

Seedance2.0动态光影重绘实战:规避API兼容性三大陷阱

1. 项目概述:当动态光影重绘遇上API兼容的“暗礁”最近在几个技术社区和项目复盘会上,一个现象被反复提及:尽管Seedance2.0动态光影重绘算法在技术演示和独立测试中表现惊艳,宣称能带来更真实、更高效的光影效果,但实际…

2026/10/9 16:52:39 阅读更多 →
Cadence Allegro SPB 17.4 Visibility View:PCB设计效率提升与图层管理实战

Cadence Allegro SPB 17.4 Visibility View:PCB设计效率提升与图层管理实战

1. 项目概述:为什么我们需要Visibility View在Cadence Allegro SPB 17.4里画板子,最让人头疼的瞬间之一,可能就是面对一个密密麻麻、所有元素都堆叠在一起的PCB设计界面。你想检查一下电源层的铺铜形状,但顶层丝印、底层走线、过孔…

2026/10/12 18:15:00 阅读更多 →
Unity Timeline过场动画制作:从核心原理到模块化实战

Unity Timeline过场动画制作:从核心原理到模块化实战

1. 项目概述:为什么选择Timeline来制作过场动画?在游戏开发里,过场动画(Cutscene)是个绕不开的坎。无论是用来推进剧情、交代背景,还是单纯为了炫技,一个流畅、有感染力的过场动画都能极大地提升…

2026/10/10 17:56:14 阅读更多 →

最新新闻

豆瓣电影详情页爬虫实战:requests+BeautifulSoup精准提取元数据

豆瓣电影详情页爬虫实战:requests+BeautifulSoup精准提取元数据

前阵子要做个小型的电影观察分析,缺一批影片的片名、导演、主演、评分、上映日期、片长、剧情简介这类元数据。我一开始想的是手动复制,结果整理了十几部就受不了了——豆瓣详情页的信息密度高,一条影片条目要来回滚动好几次才能把需要的东西…

2026/10/13 11:42:19 阅读更多 →
Rational Rose安装全攻略:Windows10/11兼容性与许可证配置

Rational Rose安装全攻略:Windows10/11兼容性与许可证配置

简介:一份面向软件开发者、系统分析师及项目经理的 IBM Rational Rose 安装教程文档,聚焦 UML 建模工具从下载到配置的完整流程,帮助初学者规避许可证、兼容性等常见安装问题。资源仅含 1 个 docx 文件,压缩包大小 16KB&#xff0…

2026/10/13 11:42:19 阅读更多 →
招聘系统API设计实战:打通钉钉、Jira与Confluence的完整方案

招聘系统API设计实战:打通钉钉、Jira与Confluence的完整方案

做招聘系统的同时把钉钉、Jira、Confluence全部打通,听起来像是个“接口搬运工”的活儿,但真正落地时你会发现,问题根本不在于调用几个API,而在于三种工具的协作模型完全不一样。钉钉是沟通和审批工具,Jira是任务和流程…

2026/10/13 11:42:19 阅读更多 →
SAP S4 HANA S4520 中文采购教程:从物料主数据到供应商评估全流程

SAP S4 HANA S4520 中文采购教程:从物料主数据到供应商评估全流程

简介:这份中文版 SAP S4 HANA S4520 教材面向应用顾问、项目经理及最终用户,聚焦采购模块的系统操作与流程管理,帮助读者从物料主数据维护起步,逐步掌握供应链采购的完整技能体系。资源为单个 PDF 文件,压缩包约 18MB&…

2026/10/13 11:42:19 阅读更多 →
Python函数定义与调用:代码复用与作用域实战指南

Python函数定义与调用:代码复用与作用域实战指南

在日常写 Python 的时候,函数定义与调用大概是最常碰到的语法之一。不管你是刚接触编程的新手,还是已经写了几年业务逻辑的老手,几乎每个脚本里都少不了 def 这个词。很多人的函数用法停留在“能跑就行”的阶段,能定义、能调用、…

2026/10/13 11:42:19 阅读更多 →
昆明理工大学MBA复试真题详解:题型拆解与高效备考策略

昆明理工大学MBA复试真题详解:题型拆解与高效备考策略

26考研的时间点其实很微妙。初试刚结束那阵子,大多数人都在放松,觉得笔试考完就算过了大半关。但真正走过完整流程的人都知道,复试才是淘汰率最集中的环节,尤其对于昆明理工大学MBA这类报考热度一直不低的项目来说,复试…

2026/10/13 11:41:16 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →