基于Selenium的网页自动化签到脚本开发指南:从原理到实践
1. 从手动到自动为什么我们需要一个签到脚本每天上班第一件事打开浏览器登录公司内网找到那个小小的“签到”按钮点击。或者作为某个论坛、资源站、积分商城的忠实用户每天雷打不动地去点一下“每日签到”领几个虚拟币。这个动作简单到几乎不用思考但日复一日它就成了一种负担——忘了签到连续记录中断出差在外网络不便甚至只是单纯地觉得把时间花在这种重复性操作上有点浪费生命。这就是我决定动手写一个网页自动签到脚本的初衷。我不是什么自动化大神就是个普通的开发者偶尔也“懒”。但我的“懒”是希望把精力用在更有价值的地方让机器去处理这些规则固定、流程简单的任务。一个网页自动签到脚本本质上就是一个能模拟人类在浏览器中操作的小程序它知道目标网站的地址记得你的账号密码能识别出页面上那个“签到”按钮并帮你点下去最后还能告诉你“今天签到了”或者“出问题了”。这件事听起来有点“黑科技”但其实门槛并不高。你不需要精通爬虫或者逆向工程利用一些成熟的浏览器自动化工具配合一点基础的编程知识就能轻松实现。本文将带你从零开始手把手构建一个健壮、可配置的网页自动签到脚本。我们会从核心工具选型讲起一步步拆解登录、定位元素、执行点击、处理验证码如果有、错误重试、结果通知等完整流程并分享我在实际部署中踩过的坑和总结的经验。无论你是想解放双手的上班族还是想学习自动化测试的开发者这篇文章都能给你提供一条清晰的路径。2. 工欲善其事核心工具链选型与搭建在开始写代码之前选对工具能事半功倍。我们的目标是“模拟浏览器操作”所以核心工具必须能驱动一个真实的浏览器。这里有几个主流选择Selenium、Puppeteer 和 Playwright。我最终选择了Selenium原因如下首先Selenium 生态成熟社区庞大几乎你能想到的浏览器Chrome, Firefox, Edge, Safari它都支持遇到问题网上资料一搜一大把。其次它对多种编程语言友好Python、Java、JavaScript 等都可以。我用 Python 来写因为 Python 语法简洁相关的网络请求库如requests和解析库如BeautifulSoup也非常强大方便我们处理一些非图形界面的交互。最后Selenium 的 API 设计相对直观对于自动化新手来说更容易上手。当然PuppeteerNode.js和 Playwright多语言也是极好的选择它们在性能和现代浏览器特性支持上可能更优。但考虑到通用性和学习成本Selenium Python 是这个入门项目的最佳组合。接下来是环境搭建。你需要安装以下东西Python 3.7从官网下载安装即可。Selenium 库通过 pip 安装。打开你的终端或命令提示符执行pip install selenium浏览器驱动这是关键。Selenium 需要通过一个“驱动”来控制和通信。以最常用的 Chrome 为例首先确保你电脑上安装了 Google Chrome 浏览器。然后需要下载与你的 Chrome 版本匹配的chromedriver。打开 Chrome在地址栏输入chrome://version/查看“Google Chrome”后面的版本号例如120.0.6099.109。前往https://chromedriver.chromium.org/下载对应版本的驱动。如果版本号是 120.0.6099.x就下载主版本号为 120 的驱动。下载后得到一个可执行文件Windows 是chromedriver.exe macOS/Linux 是chromedriver。你需要把它放在一个系统PATH环境变量包含的目录里比如/usr/local/bin或C:\Windows或者更简单的办法在后续的 Python 脚本中直接指定这个驱动文件的完整路径。为了验证环境是否OK我们可以写一个最简单的测试脚本test_env.pyfrom selenium import webdriver from selenium.webdriver.chrome.service import Service # 指定你的 chromedriver 路径如果已加入PATH则不需要 driver_path /path/to/your/chromedriver # 例如C:/tools/chromedriver.exe # 创建驱动服务 service Service(executable_pathdriver_path) # 创建浏览器实例 driver webdriver.Chrome(serviceservice) # 打开百度 driver.get(https://www.baidu.com) # 打印页面标题 print(driver.title) # 等待5秒让你看到效果 import time time.sleep(5) # 关闭浏览器 driver.quit() print(环境测试成功)运行这个脚本如果它能自动打开一个 Chrome 窗口访问百度并在控制台打印出“百度一下你就知道”然后5秒后关闭说明你的环境搭建成功了。注意在实际的自动签到脚本中我们通常不需要看到浏览器界面这既消耗资源又可能干扰其他工作。Selenium 支持“无头模式”即让浏览器在后台静默运行。我们会在后续正式脚本中启用它。3. 脚本核心骨架设计可维护的代码结构在开始怼具体的签到逻辑之前我们先搭好脚本的架子。一个好的结构能让后续维护、添加新签到站点变得非常轻松。我的设计思路是面向对象将单个站点的签到封装成一个类主程序负责调度这些类。首先我们创建一个配置文件config.json用来存放敏感信息和站点配置。永远不要将账号密码硬编码在脚本里{ sites: [ { name: ExampleForum, url: https://bbs.example.com/login, login_required: true, credentials: { username: your_username, password: your_password }, signin_url: https://bbs.example.com/daily_signin, signin_element: { by: css selector, value: a.signin-btn }, check_element: { by: xpath, value: //div[contains(text(), 已签到)] } } ], notification: { enabled: true, type: email, // 可以是 email, bark, serverchan 等 smtp_server: smtp.example.com, smtp_port: 587, from_addr: senderexample.com, to_addr: receiverexample.com, password: your_email_password } }这个配置定义了一个站点需要登录提供了登录URL、凭据、签到页URL、签到按钮的定位方式CSS选择器以及用于验证是否签到成功的元素定位方式XPath。接下来我们创建签到站点的基类base_signer.py它包含一些通用方法import json import logging from abc import ABC, abstractmethod from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException # 设置日志 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) class BaseSigner(ABC): 所有签到类的基类 def __init__(self, site_config, headlessTrue): self.name site_config[name] self.config site_config self.headless headless self.driver None self.wait None def init_driver(self): 初始化浏览器驱动 options webdriver.ChromeOptions() if self.headless: options.add_argument(--headless) # 无头模式 options.add_argument(--no-sandbox) options.add_argument(--disable-dev-shm-usage) options.add_argument(--disable-gpu) options.add_argument(--window-size1920,1080) # 设置窗口大小某些页面响应式布局需要 # 可选禁用图片加载加速 prefs {profile.managed_default_content_settings.images: 2} options.add_experimental_option(prefs, prefs) service webdriver.ChromeService(executable_path/path/to/chromedriver) # 替换为你的路径 self.driver webdriver.Chrome(serviceservice, optionsoptions) self.wait WebDriverWait(self.driver, 10) # 显式等待最多等10秒 logger.info(f[{self.name}] 浏览器驱动初始化完成无头模式: {self.headless}) def find_element(self, by, value, timeout10): 查找元素带等待和异常处理 try: element WebDriverWait(self.driver, timeout).until( EC.presence_of_element_located((by, value)) ) return element except TimeoutException: logger.error(f[{self.name}] 查找元素超时: {by}{value}) return None abstractmethod def login(self): 登录方法子类必须实现 pass abstractmethod def signin(self): 执行签到方法子类必须实现 pass abstractmethod def check_signin_status(self): 检查签到状态方法子类必须实现 pass def run(self): 执行签到的总流程 result {site: self.name, success: False, message: } try: self.init_driver() if self.config.get(login_required, False): self.login() self.signin() status self.check_signin_status() if status: result[success] True result[message] f{self.name} 签到成功 logger.info(result[message]) else: result[message] f{self.name} 签到状态验证失败 logger.warning(result[message]) except Exception as e: result[message] f{self.name} 签到过程发生异常: {str(e)} logger.error(result[message], exc_infoTrue) finally: if self.driver: self.driver.quit() logger.info(f[{self.name}] 浏览器已关闭) return result这个基类做了几件重要的事1) 封装了浏览器初始化和通用元素查找2) 定义了登录、签到、检查状态的抽象方法强制子类实现3) 提供了run()方法作为标准执行流程并包含了完整的异常捕获和资源清理。这样我们新增一个站点时只需要继承BaseSigner实现那三个抽象方法即可大大减少了重复代码。4. 实战实现一个论坛站点的自动签到现在我们以配置文件中虚构的ExampleForum为例实现一个具体的签到类。创建example_forum_signer.pyfrom base_signer import BaseSigner from selenium.webdriver.common.by import By import time class ExampleForumSigner(BaseSigner): def login(self): 实现ExampleForum的登录逻辑 logger.info(f[{self.name}] 开始登录) self.driver.get(self.config[url]) # 定位用户名和密码输入框这里假设它们有特定的id # 实际中你需要用浏览器开发者工具查看元素属性 username_input self.find_element(By.ID, username) # 假设id为username password_input self.find_element(By.ID, password) # 假设id为password submit_button self.find_element(By.CSS_SELECTOR, button[typesubmit]) # 假设提交按钮 if not all([username_input, password_input, submit_button]): raise Exception(未能找到登录表单元素) username_input.clear() username_input.send_keys(self.config[credentials][username]) password_input.clear() password_input.send_keys(self.config[credentials][password]) # 点击登录 submit_button.click() # 等待登录完成通常可以通过检查某个登录后出现的元素来判断 try: # 假设登录成功后页面会出现用户头像其id为user-avatar self.wait.until(EC.presence_of_element_located((By.ID, user-avatar))) logger.info(f[{self.name}] 登录成功) except TimeoutException: # 可能登录失败检查是否有错误提示 error_msg self.find_element(By.CLASS_NAME, error-message) if error_msg: raise Exception(f登录失败: {error_msg.text}) else: raise Exception(登录后未跳转到预期页面可能登录失败) def signin(self): 跳转到签到页面并点击签到按钮 logger.info(f[{self.name}] 开始执行签到) # 直接访问签到页面 self.driver.get(self.config[signin_url]) time.sleep(2) # 等待页面加载可以用更智能的等待替代 # 使用配置中的定位方式查找签到按钮 signin_btn_config self.config[signin_element] by_method getattr(By, signin_btn_config[by].upper()) # 将字符串转为By常量 signin_button self.find_element(by_method, signin_btn_config[value]) if not signin_button: raise Exception(未找到签到按钮) # 有时候按钮可能被遮挡或不可点击可以尝试滚动到元素位置并等待可点击 self.driver.execute_script(arguments[0].scrollIntoView(true);, signin_button) self.wait.until(EC.element_to_be_clickable((by_method, signin_btn_config[value]))) signin_button.click() logger.info(f[{self.name}] 已点击签到按钮) # 点击后等待一段时间让签到结果呈现 time.sleep(3) def check_signin_status(self): 检查是否签到成功 logger.info(f[{self.name}] 开始检查签到状态) # 方法1检查签到成功提示元素 check_config self.config.get(check_element) if check_config: by_method getattr(By, check_config[by].upper()) success_element self.find_element(by_method, check_config[value], timeout5) if success_element: logger.info(f[{self.name}] 找到签到成功标识: {success_element.text[:50]}...) return True # 方法2如果配置中没有检查元素或者没找到可以尝试其他逻辑 # 例如签到后按钮文字变为“已签到”或按钮消失 signin_btn_config self.config[signin_element] by_method getattr(By, signin_btn_config[by].upper()) button_after self.find_element(by_method, signin_btn_config[value], timeout5) if button_after: # 按钮还在检查其文本或属性是否变化 if 已签到 in button_after.text or button_after.get_attribute(disabled): logger.info(f[{self.name}] 根据按钮状态判断签到成功) return True else: logger.warning(f[{self.name}] 签到按钮仍在且状态未变可能签到失败) return False else: # 按钮消失了通常意味着签到成功页面状态改变 logger.info(f[{self.name}] 签到按钮已消失推测签到成功) return True这个实现展示了处理一个典型论坛签到的完整流程。这里有几个关键点需要强调元素定位是核心By.ID,By.CSS_SELECTOR,By.XPATH是最常用的定位方式。你必须使用浏览器的开发者工具F12来查看目标元素的这些属性。ID是唯一的最快CSS选择器很灵活XPath功能最强大但可能性能稍差且易受页面结构变化影响。等待策略直接使用time.sleep()是简单粗暴但不推荐的方式因为它固定等待效率低。我们主要使用WebDriverWait配合expected_conditions如presence_of_element_located,element_to_be_clickable进行“显式等待”它会在条件满足后立即继续否则在超时后抛出异常。这更智能、更健壮。登录状态保持Selenium 驱动的浏览器实例会自然保持 Cookie 和 Session所以登录后直接跳转签到页面即可无需手动处理 Cookie。验证码处理如果目标站点有验证码这就是一个难点。简单图形验证码可以尝试用 OCR 库如pytesseract识别但成功率有限。复杂验证码如滑块、点选通常需要接入第三方打码平台这涉及到额外的成本和接口调用。在入门脚本中我们暂时避开有复杂验证码的站点或者寻找那些登录后一段时间内不需要重复验证的站点。5. 让脚本更健壮错误处理、重试与日志一个能长期无人值守运行的脚本健壮性至关重要。我们不能让一次网络波动或页面元素微调就导致整个脚本崩溃。我们在基类中已经有了基本的try...except现在需要加强它。5.1 细化异常捕获与重试机制对于网络请求、元素查找这类可能因瞬时问题失败的操作加入重试逻辑能极大提高成功率。我们可以修改基类或具体签到类中的关键方法。这里以查找元素为例创建一个带重试的查找函数def find_element_with_retry(self, by, value, max_attempts3, timeout10): 带重试的元素查找 attempt 0 while attempt max_attempts: attempt 1 logger.info(f[{self.name}] 尝试查找元素 ({attempt}/{max_attempts}): {by}{value}) element self.find_element(by, value, timeout) if element: return element else: if attempt max_attempts: wait_time 2 ** attempt # 指数退避等待1, 2, 4秒... logger.warning(f[{self.name}] 第{attempt}次查找失败{wait_time}秒后重试) time.sleep(wait_time) logger.error(f[{self.name}] 元素查找失败已达最大重试次数 {max_attempts}) return None在login或signin方法中对于关键按钮就可以使用self.find_element_with_retry(...)来替代普通的self.find_element。5.2 针对特定错误的处理弹窗/遮罩层有些网站在操作时会弹出模态框。可以在关键操作前尝试关闭它们# 尝试关闭可能的弹窗 popup_close self.find_element(By.CSS_SELECTOR, .modal-close, .popup-close, timeout2) if popup_close: popup_close.click() time.sleep(0.5)Cookie/登录失效在check_signin_status发现状态不对时可以尝试重新登录一次再重试签到。页面跳转延迟在driver.get()或click()后使用WebDriverWait等待某个代表页面加载完成的元素出现而不是固定sleep。5.3 完善的日志记录我们已经使用了 Python 的logging模块。为了让日志更有用我们可以将其输出到文件并区分不同级别def setup_logging(): logger logging.getLogger() logger.setLevel(logging.INFO) # 控制台输出 ch logging.StreamHandler() ch.setLevel(logging.INFO) # 文件输出 fh logging.FileHandler(auto_signin.log, encodingutf-8) fh.setLevel(logging.INFO) formatter logging.Formatter(%(asctime)s - %(name)s - %(levelname)s - %(message)s) ch.setFormatter(formatter) fh.setFormatter(formatter) logger.addHandler(ch) logger.addHandler(fh) return logger在日志中清晰记录每一步操作、成功与否、遇到的错误信息这样当脚本出现问题时你可以通过查看日志文件快速定位。6. 闭环签到结果通知与定时任务脚本跑完了成功还是失败我们需要知道结果。最直接的方式是控制台输出和日志文件但这要求你主动去看。更好的方式是让脚本主动通知你。6.1 邮件通知这是一个非常通用的方式。我们可以实现一个通知模块notifier.pyimport smtplib from email.mime.text import MIMEText from email.header import Header import json class EmailNotifier: def __init__(self, config): self.smtp_server config[smtp_server] self.smtp_port config[smtp_port] self.from_addr config[from_addr] self.to_addr config[to_addr] self.password config[password] # 可能是邮箱密码或授权码 def send(self, subject, content): 发送邮件 message MIMEText(content, plain, utf-8) message[From] Header(fAutoSignBot {self.from_addr}, utf-8) message[To] Header(self.to_addr, utf-8) message[Subject] Header(subject, utf-8) try: # 使用SSL加密连接 server smtplib.SMTP_SSL(self.smtp_server, self.smtp_port) # 或者使用STARTTLS (端口587常用) # server smtplib.SMTP(self.smtp_server, self.smtp_port) # server.starttls() server.login(self.from_addr, self.password) server.sendmail(self.from_addr, [self.to_addr], message.as_string()) server.quit() print(邮件发送成功) except Exception as e: print(f邮件发送失败: {e})在主程序中加载配置遍历所有站点执行签到汇总结果然后发送通知import json from example_forum_signer import ExampleForumSigner from notifier import EmailNotifier def main(): # 加载配置 with open(config.json, r, encodingutf-8) as f: config json.load(f) results [] for site_config in config[sites]: # 根据站点名称动态实例化对应的签到类这里简化假设只有一种 signer ExampleForumSigner(site_config, headlessTrue) result signer.run() results.append(result) # 汇总结果 success_sites [r[site] for r in results if r[success]] fail_sites [r for r in results if not r[success]] summary f 自动签到任务完成报告 执行时间: {datetime.now().strftime(%Y-%m-%d %H:%M:%S)} 成功站点 ({len(success_sites)}个): {, .join(success_sites) if success_sites else 无} 失败站点 ({len(fail_sites)}个): for fail in fail_sites: summary f - {fail[site]}: {fail[message]}\n print(summary) # 发送通知 if config[notification][enabled] and config[notification][type] email: notifier EmailNotifier(config[notification]) notifier.send(自动签到任务报告, summary) if __name__ __main__: main()6.2 其他通知方式Bark / PushDeer 等推送服务它们提供简单的 HTTP API只需一个 POST 请求就能把消息推送到手机App非常适合脚本通知。Server酱 / 钉钉机器人 / 企业微信机器人国内常用的办公通讯工具机器人配置 webhook 后也能方便地接收通知。Telegram Bot如果你使用 Telegram可以创建一个 Bot通过其 API 发送消息到个人或群组。选择哪种方式取决于你的使用习惯和便利性。6.3 配置定时任务脚本写好了总不能每天手动运行。我们需要让它定时自动执行。Linux/Mac使用cron。执行crontab -e编辑定时任务添加一行例如每天上午9点运行0 9 * * * cd /path/to/your/script /usr/bin/python3 /path/to/your/script/main.py /path/to/your/script/cron.log 21Windows使用“任务计划程序”。创建一个基本任务设置每日触发操作为“启动程序”程序或脚本填写python.exe的路径参数填写你的main.py脚本路径起始于填写脚本所在目录。提示在服务器或常年开机的电脑如树莓派、NAS上部署是最佳选择。确保运行环境的 Python 依赖和浏览器驱动都正确安装。7. 进阶挑战与优化思路一个基本的自动签到脚本已经完成了。但真实世界的网页千奇百怪下面是一些你可能会遇到的进阶挑战和应对思路7.1 动态加载与异步请求现代网站大量使用 Ajax 和前端框架页面内容不是一次性加载的。“签到”按钮可能是在页面加载后通过 JavaScript 动态插入的。简单的find_element可能找不到因为元素还没出现。解决方案延长等待时间使用WebDriverWait并配合presence_of_element_located或visibility_of_element_located条件。等待特定条件有时需要等待某个加载动画消失。可以等待代表加载完成的元素出现或者等待某个加载中的元素消失# 等待加载动画消失 self.wait.until(EC.invisibility_of_element_located((By.ID, loading-spinner)))监听网络请求更复杂的情况签到可能是一个独立的 API 调用。你可以使用 Selenium 的performance日志或devtools来监听特定的 XHR/Fetch 请求确认签到请求是否成功发出。但这属于高级用法。7.2 验证码识别这是自动化的最大障碍之一。简单图形验证码尝试pytesseractGoogle 的 Tesseract-OCR 封装进行光学字符识别。但需要预处理图片二值化、去噪等且对扭曲、干扰线多的验证码效果很差。复杂验证码滑块、点选通常需要借助第三方打码平台如超级鹰、图鉴等。流程是脚本截图验证码区域 - 调用平台API - 获取识别结果坐标或文字 - 脚本执行相应操作。这会产生费用且需要编写额外的交互逻辑。最佳策略尽量选择没有验证码或者登录后长时间如几天内不需要再次验证的站点进行自动化。对于必须验证的评估成本与收益。7.3 多账号与并发如果你有多个账号需要签到简单的做法是循环执行。但这样效率低。可以考虑多线程/多进程为每个账号/站点启动独立的浏览器实例并行执行。注意每个浏览器实例资源消耗较大并发数不宜过高。同时要妥善管理驱动实例避免冲突。复用浏览器 Profile对于需要登录的站点可以指定一个用户数据目录来启动 Chrome这样能保持登录状态避免每次重新登录。但多账号间会串号不适用。7.4 反爬虫策略应对一些网站会检测 Selenium 的特征如window.navigator.webdriver属性。虽然我们的操作模拟真人但仍有被识别的风险。应对措施添加excludeSwitches和add_argumentoptions.add_argument(--disable-blink-featuresAutomationControlled) options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False)执行 CDP 命令在启动后执行 Chrome DevTools Protocol 命令覆盖 webdriver 属性。driver.execute_cdp_cmd(Page.addScriptToEvaluateOnNewDocument, { source: Object.defineProperty(navigator, webdriver, { get: () undefined }); })模拟真人行为在操作中加入随机延迟、随机移动鼠标轨迹可通过ActionChains实现等。但这会降低脚本速度。8. 安全与道德考量写在最后在享受自动化便利的同时我们必须清醒地认识到边界。遵守网站规则首先务必阅读目标网站的robots.txt文件和服务条款。明确禁止自动化的网站请不要尝试。你的自动化行为不应给目标网站服务器带来显著额外负载比如避免高频访问。保护个人隐私配置文件中的账号密码是最高机密。确保config.json文件不被上传到公开的代码仓库如 GitHub。可以使用.gitignore文件忽略它或者使用环境变量来存储敏感信息。合理使用这个脚本是为了解放重复劳动用于个人学习与效率提升。请勿将其用于恶意刷量、攻击、爬取受保护数据或其他任何非法或不道德的目的。接受失败网站改版是常态。你的脚本很可能在某一天突然失效因为按钮的 CSS 类名变了或者登录流程更新了。这是自动化脚本的宿命。维护脚本适应变化也是这个过程的一部分。从我个人的经验来看编写和维护这样一个脚本其价值远不止于“自动签到”本身。它迫使你去理解 HTTP 请求、会话保持、前端 DOM 结构、反爬机制锻炼了你的问题分解、调试和编码能力。当你看到脚本在深夜默默运行清晨收到“所有站点签到成功”的推送时那种成就感才是这个项目带来的最大快乐。

相关新闻

Bug基本概念

Bug基本概念

文章目录一. Bug基本概念1. Bug 介绍2. Bug 的判定标准3. 经典面试题:如果开发认为你的提交并不是 Bug 怎么办?4. Bug 的严重程度5. Bug 的优先级严重程度与优先级的关系一. Bug基本概念 1. Bug 介绍 其实 Bug 就是一个电脑程序里的错误,也可…

2026/10/17 12:40:48 阅读更多 →
微信QQ消息总被撤回?3步搞定RevokeMsgPatcher防撤回补丁,重要内容永久留存

微信QQ消息总被撤回?3步搞定RevokeMsgPatcher防撤回补丁,重要内容永久留存

微信QQ消息总被撤回?3步搞定RevokeMsgPatcher防撤回补丁,重要内容永久留存 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) …

2026/10/19 14:22:08 阅读更多 →
消息被撤回怎么办:RevokeMsgPatcher 防撤回补丁完整使用指南(微信/QQ/TIM 通用)

消息被撤回怎么办:RevokeMsgPatcher 防撤回补丁完整使用指南(微信/QQ/TIM 通用)

消息被撤回怎么办:RevokeMsgPatcher 防撤回补丁完整使用指南(微信/QQ/TIM 通用) 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用…

2026/10/16 8:50:38 阅读更多 →

最新新闻

UDS协议栈从入门到精通:状态机、安全访问与踩坑实战全解析

UDS协议栈从入门到精通:状态机、安全访问与踩坑实战全解析

UDS(Unified Diagnostic Services,统一诊断服务)这个缩写,在车载电子圈里几乎每天都会碰到。做ECU开发的人要跟诊断仪打交道,做测试的人要对着诊断报文调参数,做车联网的人要解析诊断数据——但真正能把UDS…

2026/10/20 10:05:47 阅读更多 →
pyVideoTrans实战:从语音识别到自动配音的视频翻译工具指南

pyVideoTrans实战:从语音识别到自动配音的视频翻译工具指南

简介:pyVideoTrans是一款开源的视频翻译配音工具,主要面向视频创作者、字幕翻译者和需要批量处理音视频的用户,可将一种语言视频自动生成指定语言字幕并完成配音。它集成语音识别、字幕翻译、配音合成、字幕格式转换、人声分离、音视频合并与…

2026/10/20 10:05:47 阅读更多 →
YALMIP资源下载与安装全指南:MATLAB路径配置、求解器接口与避坑实战

YALMIP资源下载与安装全指南:MATLAB路径配置、求解器接口与避坑实战

简介:YALMIP 官方 R20230609 版资源包,是面向 MATLAB 环境下运筹优化、自动控制及算法研究者的完整建模工具箱,可用来快速构建与求解线性规划、二次规划、混合整数规划、非线性规划以及动态最优控制问题。压缩包共 1307 个文件,以…

2026/10/20 10:05:47 阅读更多 →
51单片机智能交通灯:车流感知与自适应配时实现

51单片机智能交通灯:车流感知与自适应配时实现

简介:本资源是一套完整的智能交通灯控制器嵌入式开发实践包,面向电子类、自动化及物联网方向的本科课程设计、毕业设计与单片机初学者,解决交通信号系统动态调度算法实现与软硬件联合验证问题。压缩包共17个文件,86KB,…

2026/10/20 10:05:47 阅读更多 →
dart_scope_functions鸿蒙适配实践:Dart作用域函数在Flutter中的迁移全解析

dart_scope_functions鸿蒙适配实践:Dart作用域函数在Flutter中的迁移全解析

先提个问题:你写 Flutter 代码时,有没有经历过这种“工具人时刻”——定义一个对象,判空,取值,塞进构造器,再判空,再赋值……一个本该两行说完的逻辑,硬生生被样板代码撑出十行。想用…

2026/10/20 10:05:47 阅读更多 →
AIGC检测原理与论文写作重构:告别降AI工具,建立真实作者性

AIGC检测原理与论文写作重构:告别降AI工具,建立真实作者性

最近总有人拿着检测报告截图来问我:论文AIGC疑似比例飙到六成以上,学校通知延期,怎么办?说实话,看到这种局面我心里也替人着急,但更着急的是,很多人的第一反应是冲去找“去AI痕迹神器”&#xf…

2026/10/20 10:04:46 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →