news 2026/7/17 19:46:59

Python自动化抢票实战:从接口请求到浏览器模拟,5倍提升成功率

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python自动化抢票实战:从接口请求到浏览器模拟,5倍提升成功率

1. 项目概述:为什么我们需要自动化抢票?

又到了一年一度的热门演唱会、体育赛事或者节假日火车票开售的日子,你是不是也经历过这样的场景?提前定好闹钟,打开电脑和手机,在开票前几分钟就紧张地刷新页面,结果一到点,页面瞬间卡死,等终于能点进去,票早已售罄,屏幕上只剩下一个冰冷的“无票”提示。这种挫败感,相信很多人都体会过。手动抢票的成功率,很大程度上取决于你的网速、手速和运气,在巨大的供需缺口面前,个人用户几乎毫无胜算。

这就是“Python自动化抢票”项目诞生的背景。它不是一个简单的“外挂”或“作弊工具”,而是一个基于合法、公开的接口和模拟正常用户行为的自动化脚本。其核心目标,是利用代码的执行速度和精准度,将我们从重复、机械的点击和刷新中解放出来,将抢票的成功率提升数倍。这里的“5倍成功率”并非一个精确的科学数据,而是一个形象的比喻,意指通过自动化手段,可以显著超越普通手动操作的效率和成功率。它解决的不仅仅是“买不到票”的问题,更是“如何更高效、更省力地买到票”的体验问题。

这个项目适合谁?首先,当然是那些有明确购票需求的普通用户,无论是追星族、体育迷还是需要出行的旅客。其次,它也非常适合正在学习Python编程的初学者和爱好者。通过这个实战项目,你可以将学到的网络请求(如requests库)、HTML解析(如BeautifulSouplxml)、浏览器自动化(如SeleniumPlaywright)等知识融会贯通,完成一个看得见、用得着的作品,成就感远超书本上的练习题。最后,对于测试工程师或开发者,这也是一个理解Web交互、模拟用户行为、进行接口测试的绝佳案例。

2. 核心思路与技术选型:从“人肉点击”到“代码执行”

手动抢票的本质,是用户通过浏览器与票务服务器的Web应用进行交互。这个过程可以拆解为:打开网页 -> 登录账号 -> 搜索场次/车次 -> 选择票档/座位 -> 提交订单 -> 完成支付。自动化脚本的目的,就是用代码精准、快速地模拟这一系列操作。

2.1 技术路径对比:接口请求 vs. 浏览器自动化

实现自动化抢票,主要有两条技术路径,它们各有优劣,选择哪一种取决于目标网站的技术特点。

路径一:直接请求接口(推荐,效率最高)这是最理想、最高效的方式。现代Web应用(包括票务网站)普遍采用前后端分离的架构。你在网页上点击“查询”或“提交”时,浏览器并不会刷新整个页面,而是向服务器的一个特定API接口发送一个HTTP请求(通常是GET或POST),服务器返回JSON格式的数据,前端JavaScript再根据数据更新页面显示。

  • 工作原理:通过浏览器的开发者工具(F12),切换到“网络”(Network)标签页,监控你在网页上的每一个操作所触发的网络请求。找到那个真正向服务器请求票务数据或提交订单的请求,分析它的URL、请求方法(Method)、请求头(Headers)和请求体(Body,特别是包含座位、验证码等信息的表单数据)。
  • 技术实现:使用Python的requests库,直接构造并发送这个HTTP请求,然后解析服务器返回的JSON响应。这完全绕开了浏览器渲染页面的开销,速度极快。
  • 优势:速度最快,资源消耗最低,最接近“秒杀”的底层逻辑。
  • 挑战:需要一定的逆向工程能力来分析接口;接口参数可能加密(如Token、签名);可能遇到复杂的验证码(滑块、点选、短信等)。
  • 适用场景:网站接口逻辑清晰、未做高强度反爬或加密。对于学习而言,从简单的、未加密的接口入手是最好的起点。

路径二:浏览器自动化(通用,模拟真实用户)当网站接口难以分析,或者交互逻辑极其复杂(如需要处理图形验证码、复杂的JavaScript动态渲染)时,可以使用此方法。

  • 工作原理:通过代码控制一个真实的浏览器(如Chrome、Firefox),像真人一样去打开网页、点击按钮、输入文本。工具本身会处理页面的JavaScript执行和渲染。
  • 技术实现:主要使用SeleniumPlaywright库。Selenium是老牌工具,生态成熟;Playwright是后起之秀,由微软开发,支持多浏览器(Chromium, Firefox, WebKit),API更现代,执行速度也更快。
  • 优势:能处理几乎所有Web交互,包括最复杂的动态页面和验证码(虽然不能自动识别,但可以停在验证码页面等待人工干预)。行为上与真人操作无异,不易被简单的反爬策略封锁。
  • 劣势:速度慢,因为需要加载完整的页面和资源;资源占用高(需要运行浏览器实例);稳定性受网页UI变化影响较大。
  • 适用场景:网站反爬策略强,接口加密复杂,或作为初学者入门自动化测试的练习。

实操心得:对于抢票这种争分夺秒的场景,优先尝试路径一(接口请求)。即使最终因为加密等原因需要辅以路径二,核心的“查询余票”和“提交占座请求”也应尽可能用接口完成。可以混合使用:用Selenium打开页面、登录、获取必要的Cookie或Token,然后用requests带着这些凭证去请求抢票接口。

2.2 核心工具库简介

  • requests:Python中最常用的HTTP库,用于发送所有类型的HTTP请求。它是实现接口请求路径的基石。
  • BeautifulSoup/lxml:HTML/XML解析库。当接口返回的是HTML页面而非JSON时(或者在某些环节需要解析页面元素),需要用它们来提取页面中的数据,如场次列表、票价信息等。
  • Selenium:浏览器自动化测试框架。通过WebDriver驱动浏览器。你需要额外下载对应浏览器的WebDriver(如ChromeDriver)。
  • Playwright:新一代的浏览器自动化库。安装时会自动下载所需的浏览器驱动,开箱即用。它在处理现代单页应用(SPA)和异步加载方面表现更佳。
  • json:Python标准库,用于处理接口返回的JSON数据。
  • time/datetime:用于设置延时、定时任务和获取当前时间,控制抢票节奏。
  • threading(可选):多线程库。可以用于同时监控多个场次或车次,但需谨慎使用,避免请求过于频繁被服务器封禁。

3. 实战拆解:构建一个基础抢票脚本

我们以一个虚构的、简化版的票务网站“TicketDemo”为例,演示如何通过分析接口,用requests库实现核心抢票功能。假设我们要抢一场名为“Python开发者大会”的门票。

3.1 第一步:环境准备与目标分析

首先,确保你的Python环境已就绪,并安装必要库:

pip install requests beautifulsoup4 # 如果后续考虑用浏览器自动化,再安装 # pip install selenium # pip install playwright # playwright install chromium

目标分析:打开TicketDemo网站,找到目标演出页面。按F12打开开发者工具,并清空网络记录。进行以下操作,并观察网络请求:

  1. 点击“查询”或“选座”按钮。
  2. 选择票档并点击“提交订单”。

你的目标是找到那个在点击“提交订单”后,向服务器发送的、包含了你所选座位信息的POST请求。这个请求的响应通常会返回一个“订单号”或“排队成功”的信息。

3.2 第二步:逆向工程——分析关键网络请求

假设我们通过分析,找到了提交订单的关键请求:

  • URL:https://api.ticketdemo.com/order/submit
  • 方法: POST
  • 请求头 (Headers):
    • User-Agent: 浏览器标识,需要模拟。
    • Referer: 请求来源页面,通常需要携带。
    • Cookie: 包含你的登录会话信息,这是最关键的。没有有效的Cookie,服务器会认为你未登录。
    • Content-Type:application/json(表明请求体是JSON格式)。
  • 请求体 (Payload):
    { "eventId": "123456", "priceId": "888", "seatNum": 1, "token": "xyz789abc" }
    • eventId: 演出场次ID。
    • priceId: 票价档位ID。
    • seatNum: 购买数量。
    • token: 一个临时的、防重复提交的令牌,可能在页面加载时生成并隐藏在HTML中。

如何获取这些参数?

  1. eventIdpriceId:通常在演出详情页的URL里,或者通过查询余票的接口响应中获得。
  2. token:需要在加载选座或订单确认页面时,从页面的HTML源码或另一个初始化接口的响应中提取。可以用BeautifulSoup解析页面来获取。
  3. Cookie:需要通过模拟登录先获取。登录本身也是一个POST请求,提交用户名和密码,服务器会在响应头中返回Set-Cookie,我们需要保存下来并在后续请求中携带。

3.3 第三步:编写核心代码模块

我们将脚本拆分成几个函数,结构更清晰。

模块一:登录获取Cookie

import requests from bs4 import BeautifulSoup SESSION = requests.Session() # 使用Session可以自动管理Cookie HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } def login(username, password): login_url = 'https://www.ticketdemo.com/login' # 1. 可能先GET一下登录页,获取一些隐藏的csrf token resp = SESSION.get(login_url, headers=HEADERS) soup = BeautifulSoup(resp.text, 'html.parser') csrf_token = soup.find('input', {'name': 'csrf_token'})['value'] # 假设有 # 2. 构造登录数据并POST login_data = { 'username': username, 'password': password, 'csrf_token': csrf_token } login_resp = SESSION.post(login_url, data=login_data, headers=HEADERS) if '登录成功' in login_resp.text or login_resp.status_code == 200: print('登录成功!') # Session对象已经自动保存了Cookie return True else: print('登录失败!') return False

注意事项:登录是第一步,也是最容易失败的一步。很多网站登录流程复杂,有动态加密或滑块验证。如果无法破解,一个“取巧”但仅限个人学习使用的方法是:先手动在浏览器登录,然后从开发者工具的“应用程序”(Application)标签页中复制Cookie字符串,直接用于脚本。但这无法持久化,会话过期后需重新获取。

模块二:获取演出与票档信息我们需要先获取到eventIdpriceId

def get_event_info(event_url): """从活动页面解析出活动ID和票价信息""" resp = SESSION.get(event_url, headers=HEADERS) soup = BeautifulSoup(resp.text, 'html.parser') # 假设活动ID在某个meta标签或JavaScript变量里 # 这里需要根据实际页面结构分析,以下为示例 event_id = soup.find('meta', {'name': 'event-id'})['content'] # 假设票价列表在一个下拉菜单里 price_options = soup.select('select[name="price"] option') price_list = [] for opt in price_options: if opt.get('value'): price_list.append({ 'id': opt['value'], 'name': opt.text.strip(), 'price': opt.get('data-price') }) print(f"找到活动ID: {event_id}") print(f"找到票价选项: {price_list}") return event_id, price_list

模块三:获取提交订单所需的Token

def get_submit_token(seat_selection_url): """进入选座/提交页面,获取防重提交token""" resp = SESSION.get(seat_selection_url, headers=HEADERS) soup = BeautifulSoup(resp.text, 'html.parser') # 假设token隐藏在一个id为`submit_token`的input标签里 token_input = soup.find('input', {'id': 'submit_token'}) if token_input: token = token_input['value'] print(f"获取到提交Token: {token}") return token else: # 也可能通过接口获取 # 例如,页面加载时会请求一个初始化接口 init_url = 'https://api.ticketdemo.com/order/init' init_resp = SESSION.get(init_url, headers=HEADERS) token = init_resp.json().get('data', {}).get('token') return token

模块四:核心抢票——提交订单请求这是最核心的函数,将在开票时间准时循环执行。

import time import json def submit_order(event_id, price_id, token, buy_num=1): """提交订单请求""" submit_url = 'https://api.ticketdemo.com/order/submit' payload = { "eventId": event_id, "priceId": price_id, "seatNum": buy_num, "token": token } # 注意请求头,特别是Content-Type submit_headers = HEADERS.copy() submit_headers.update({ 'Content-Type': 'application/json', 'Referer': 'https://www.ticketdemo.com/checkout' # 提交页面的来源 }) try: response = SESSION.post(submit_url, data=json.dumps(payload), headers=submit_headers, timeout=5) result = response.json() print(f"提交响应: {result}") if result.get('code') == 0 and result.get('data', {}).get('orderId'): print(f"【成功】订单已生成!订单号: {result['data']['orderId']}") return True, result['data']['orderId'] elif result.get('code') == 1001: # 假设1001是无票 print("【失败】票已售罄") return False, 'SOLD_OUT' elif result.get('code') == 1002: # 假设1002是token无效 print("【失败】Token失效,需要重新获取") return False, 'TOKEN_INVALID' else: print(f"【未知响应】: {result}") return False, 'UNKNOWN_ERROR' except requests.exceptions.Timeout: print("【错误】请求超时,网络或服务器问题") return False, 'TIMEOUT' except Exception as e: print(f"【异常】: {e}") return False, 'EXCEPTION'

模块五:主流程与定时触发

def main(): # 1. 登录 if not login('your_username', 'your_password'): return # 2. 获取活动信息 (提前做好) target_event_url = 'https://www.ticketdemo.com/event/123456' event_id, price_list = get_event_info(target_event_url) # 假设我们选择第一个票价档位 target_price_id = price_list[0]['id'] if price_list else None if not event_id or not target_price_id: print("无法获取活动或票价信息") return # 3. 获取初始Token (也可以在开票前瞬间再获取,以防过期) seat_url = f'https://www.ticketdemo.com/seat?eventId={event_id}' token = get_submit_token(seat_url) if not token: print("无法获取提交Token") return # 4. 计算开票时间,并等待 sale_time_str = "2023-10-27 10:00:00" # 假设的开票时间 sale_time = time.mktime(time.strptime(sale_time_str, "%Y-%m-%d %H:%M:%S")) print(f"目标开票时间: {sale_time_str}") print("等待开票...") # 5. 精准定时,提前100毫秒开始循环请求 while True: current_time = time.time() if current_time >= sale_time - 0.1: # 提前100毫秒启动 print("开票时间到!开始抢票...") break time.sleep(0.001) # 毫秒级休眠,减少CPU占用 # 6. 抢票循环 max_retry = 50 # 最大重试次数,避免无限循环 retry_count = 0 order_success = False while not order_success and retry_count < max_retry: retry_count += 1 print(f"尝试第 {retry_count} 次提交...") success, reason = submit_order(event_id, target_price_id, token, 1) if success: order_success = True # 成功,跳出循环 break elif reason == 'TOKEN_INVALID': # Token失效,重新获取一次再尝试 print("Token失效,尝试重新获取...") token = get_submit_token(seat_url) if not token: print("重新获取Token失败,退出。") break time.sleep(0.05) # 短暂等待后继续 elif reason == 'SOLD_OUT': # 售罄,可以退出或尝试其他票档 print("目标票档已售罄,程序退出。") break else: # 其他错误,短暂等待后重试 time.sleep(0.1) # 100毫秒后重试,频率不宜过高 if order_success: print("恭喜你,抢票成功!请尽快在15分钟内完成支付。") else: print("抢票失败,请检查网络或稍后重试。") if __name__ == '__main__': main()

4. 关键优化与提效技巧

一个基础的脚本只能保证“自动执行”,要实现“5倍成功率”的高效体验,还需要以下优化。

4.1 时间同步与网络延迟补偿

服务器时间、你的系统时间、网络传输延迟,这三者之间存在差异。脚本发送请求的“瞬间”,在服务器看来可能已经晚了。

  • 同步服务器时间:在开票前,多次请求票务网站的一个简单接口(如获取服务器时间的接口),计算你的本地时间与服务器时间的平均差值(网络延迟)。在最终抢票时,用这个差值来校准你的触发时间。
  • “预请求”或“长轮询”:有些网站在开票前几分钟会开放一个“排队”或“预备”接口。提前进入这个状态,可能比在准点才发起第一个请求更有优势。这需要仔细分析开票前几分钟的网络请求。
  • 多时间基准:不要只依赖一个time.time()。可以结合datetime.utcnow()以及从多个NTP服务器获取的时间,做一个综合判断,减少单一时钟的误差。

4.2 请求优化与并发策略

  • 精简请求头:只携带必要的请求头。User-Agent,Referer,Cookie,Content-Type通常是必须的。过多的请求头会增加请求体积。
  • 保持连接(HTTP Keep-Alive)requests.Session()会自动复用TCP连接,避免每次请求都进行三次握手,能节省几十到几百毫秒。
  • 谨慎使用多线程/异步:虽然并发请求能提高命中概率,但极易触发服务器的反爬机制(如IP限流、封禁)。个人抢票不建议开大量线程。如果非要使用,2-3个线程针对不同票档不同场次进行尝试是相对安全的策略,且每个线程之间要有随机延时。
  • 代理IP池(高级):如果因为请求过快IP被暂时封锁,可以考虑使用代理IP。但这涉及IP来源的合法性、稳定性和速度,成本较高,且对于个人抢票而言通常过于复杂,不推荐初学者尝试。

4.3 异常处理与鲁棒性增强

脚本必须在各种网络波动、服务器错误的情况下保持稳定。

  • 全面的异常捕获:对requests请求要捕获ConnectionError,Timeout,JSONDecodeError等异常,并给出重试或退出的逻辑。
  • 重试机制:对于网络超时、服务器返回5xx错误等临时性故障,应该实现带间隔(如指数退避)的重试。但像“无票”这种业务逻辑错误,则不应重试。
  • 心跳与状态检查:长时间运行的脚本,可以定期打印一条状态日志,或者检查登录会话是否依然有效(例如,请求一个需要登录的页面),如果失效则尝试重新登录。

4.4 验证码处理策略

这是自动化抢票最大的技术障碍。常见的验证码有图形验证码、滑块验证、点选文字、短信验证码等。

  • 图形验证码(简单数字字母):可以尝试使用OCR库(如ddddocrpytesseract)进行识别,但识别率受图片干扰程度影响很大。
  • 复杂验证码(滑块、点选):目前没有完美的全自动解决方案。常见的应对策略是:
    1. 人工干预:当脚本检测到出现验证码页面时,暂停并弹出提示,等待用户手动完成验证后,脚本再继续执行。这需要结合浏览器自动化(如Selenium)来实现。
    2. 打码平台:调用第三方付费打码平台的API,将验证码图片发送过去,由人工或AI平台识别后返回结果。这会产生费用,且响应时间有不确定性。
    3. 绕过策略:分析验证码触发的条件。有时频繁访问、Cookie异常才会触发。保持合理的请求频率、维护好Cookie的有效性,可能避免或减少验证码的出现。

核心避坑指南不要试图在开票瞬间处理验证码。开票时服务器压力巨大,验证码服务本身也可能响应缓慢,等识别完验证码,票早就没了。最佳实践是:在开票前,通过模拟正常浏览行为(如查看演出详情、模拟点击等),提前完成可能触发的验证码挑战,让账号和IP进入一个“安全”的状态。开票时直接请求核心下单接口,这个接口有时可能不再需要验证码。

5. 常见问题与实战排查记录

在实际操作中,你会遇到各种各样的问题。下面是一些典型问题及排查思路。

5.1 请求被拒绝或返回奇怪数据

  • 现象requests直接返回403/404错误,或者返回的HTML内容是反爬提示(如“请启用JavaScript”、“访问过于频繁”)。
  • 排查
    1. 检查请求头:最重要的User-Agent是否像真实浏览器?Referer是否正确?Cookie是否有效且未过期?用print(response.request.headers)打印出发送的请求头,与浏览器开发者工具里看到的进行对比。
    2. 检查IP行为:你的IP是否因为短时间内请求过多被暂时封禁?尝试用手机热点切换网络,或者等待一段时间再试。
    3. 检查参数:请求参数(特别是tokensign等签名参数)是否完整且格式正确?是否需要在每次请求前动态获取?
    4. 尝试浏览器自动化:如果requests完全无法工作,说明网站可能对非浏览器流量做了严格校验。此时应换用SeleniumPlaywright来模拟。

5.2 成功提交但提示“无票”或“库存不足”

  • 现象:脚本逻辑正确,请求也返回成功(code=0),但数据里提示没票。
  • 排查
    1. 时机问题:你的请求真的在开票那一瞬间发出去了吗?检查时间同步逻辑和网络延迟。可以尝试在开票前1秒就开始以极高频率(如每秒10次)发送请求,但这有被封风险。
    2. 参数问题:确认你提交的eventIdpriceId绝对正确。有时不同渠道、不同链接对应的ID可能不同。
    3. 业务逻辑:有些票务系统会为高等级会员保留一部分票,或者在开票后有一个短暂的“排队”逻辑,并不是严格的“先到先得”。这超出了技术脚本的范畴。

5.3 如何应对网站改版或接口变化?

这是自动化脚本的宿命。票务网站经常更新。

  • 模块化设计:如我们的示例代码,将登录、获取信息、提交订单分成独立函数。当某个环节失效时,只需修改对应的函数。
  • 关键信息外部化:将URL、接口参数名、HTML元素的CSS选择器等容易变化的内容,写在配置文件或字典里,而不是硬编码在代码中。修改时只需改配置。
  • 定期测试:在非抢票时段,定期运行脚本的“探测”功能(如获取演出信息),确保核心接口依然可用。

5.4 法律与道德风险提示

这是最重要的一部分。技术是中立的,但使用技术的方式需要约束。

  • 遵守网站规则:绝大多数票务网站的《用户协议》都明确禁止使用任何自动化工具、机器人程序进行抢票。你的行为可能违反协议。
  • 拒绝商业与黄牛行为:本技术分享仅供个人学习Python自动化技术和解决自身购票需求使用。绝对禁止用于开发、销售抢票软件,或进行大规模、机器化的抢票并加价转售(黄牛行为)。这不仅不道德,在多地也涉嫌违法。
  • 影响系统稳定性:过于频繁的请求会加重服务器负担,影响其他正常用户的体验。
  • 个人使用建议:控制请求频率,模拟人类操作间隔;仅为自己或极少数亲友操作;成功后立即停止脚本。抱着学习和研究的态度去实践,理解其原理和边界。

编写一个自动化抢票脚本,是一次非常综合的编程实践,它涉及网络协议、前端知识、数据解析、异常处理和工程化思维。通过这个项目,你收获的将不仅仅是一张门票,更是解决现实问题的能力。最后,请务必技术向善,将所学用于正途。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 19:43:04

飞腾派4G版搭建PLEX媒体服务器全攻略

1. 飞腾派4G版与PLEX的完美组合作为一名长期折腾家庭媒体中心的玩家&#xff0c;我最近在飞腾派4G版上成功部署了PLEX媒体服务器&#xff0c;这套组合给我带来了不少惊喜。飞腾派作为国产ARM开发板&#xff0c;其4G版本内置了SIM卡槽&#xff0c;这意味着即使在没有固定宽带的环…

作者头像 李华
网站建设 2026/7/17 19:42:20

AI辅助TDD实践:用Superpowers提升测试驱动开发效率

1. 项目概述&#xff1a;当Superpowers遇见TDD&#xff0c;一场开发范式的效率革命如果你是一名开发者&#xff0c;最近可能频繁听到两个词&#xff1a;Superpowers和TDD。前者是新一代AI编码助手中的“超能力”插件集&#xff0c;后者是历史悠久但常被束之高阁的“测试驱动开发…

作者头像 李华
网站建设 2026/7/17 19:37:29

JAVA练习298- 两两交换链表中的节点

题目概览 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xf…

作者头像 李华
网站建设 2026/7/17 19:36:26

2025人形机器人实战指南:从动态平衡到多模态感知的落地能力解析

1. 项目概述&#xff1a;为什么2025年的人形机器人榜单&#xff0c;不是“参数堆砌”&#xff0c;而是“能力落地”的分水岭2025年&#xff0c;人形机器人这个词已经不再飘在科技发布会的PPT里&#xff0c;它开始出现在工厂产线旁、医院康复中心走廊、物流分拣站台边&#xff0…

作者头像 李华
网站建设 2026/7/17 19:35:39

一文读懂Kimi K3核心基础知识

写在前面 欢迎大家关注Rocky的公众号&#xff1a;WeThinkIn 欢迎大家关注Rocky的知乎&#xff1a;Rocky Ding 《三年面试五年模拟》AIGC/LLM/AI Agent算法工程师/开发工程师求职面试秘籍独家资源&#xff1a;【三年面试五年模拟】WeThinkIn/AIGC-Interview-Book&#xff0c;欢迎…

作者头像 李华
网站建设 2026/7/17 19:33:24

小红书笔记被判AI率高限流?把创作AI痕迹降到正常推荐

小红书笔记被判AI率高限流&#xff1f;把创作AI痕迹降到正常推荐 你大概经历过这种郁闷&#xff1a;一篇笔记选题、排版、配图都花了心思&#xff0c;发出去几个小时&#xff0c;浏览量却卡在两位数&#xff0c;赞和收藏几乎为零。你翻回去看数据&#xff0c;曝光一直上不去&a…

作者头像 李华