1. “FIF口语刷题”到底在刷什么——不是点开APP就完事的“伪自动化”“FIF口语刷题”这六个字最近在高校英语学习群、四六级备考圈和教培机构技术群里高频出现。它听起来像一个普通的学习工具名称但结合热搜词里反复出现的python、selenium-wire、stealth.min.js、Authorization、POST你就该意识到这不是学生手动点选答案的练习系统而是一套正在被批量逆向、自动化调用、甚至局部接管的在线口语评测接口体系。我第一次接触这个需求是帮某所双一流高校的外语学院做教学数据归档支持。他们想把过去三年学生在FIF平台上的口语作答音频、评分结果、题目文本全部结构化导出用于教研分析。原以为调个API就行结果发现FIF官网没有公开文档Web端所有交互都走加密通道登录态强绑定浏览器指纹连最基础的“获取某道题的题干”都要过三重校验。后来才知道所谓“刷题”本质是绕过前端交互逻辑直击后端评测服务链路——不是刷“题量”而是刷“调用通路”。这里的关键词必须掰开揉碎讲清楚FIF全称是“Foreign Language Interactive Forum”国内高校广泛采用的外语智能教学平台其口语模块核心依赖语音识别AI评分引擎响应延迟敏感、鉴权严格口语刷题特指通过程序模拟真实用户行为完成“加载题目→播放音频→录音→提交→获取评分”的完整闭环重点不在“刷”而在“题”——即稳定复现题目加载与结果解析流程python selenium-wire不是简单用Selenium点按钮而是用selenium-wire捕获并篡改真实浏览器发出的请求因为FIF的题库加载、录音上传、结果查询全部走XHR POST且请求头含动态生成的Authorization令牌stealth.min.js这是关键中的关键。FIF前端部署了极强的反自动化检测anti-bot会检查navigator.webdriver、window.chrome、plugins.length等数十个JS环境特征。不注入stealth补丁Selenium启动的Chrome连登录页都进不去直接返回403或跳转到风控拦截页Authorization POST所有核心接口如/api/v1/speech/submit、/api/v1/exam/question均要求Bearer Token认证且Token不是静态值而是由登录态派生、带时间戳签名、每15分钟刷新一次。单纯抓包复制Header10分钟内必失效。所以“FIF口语刷题”项目的真实定位是一个面向教育技术场景的轻量级协议逆向工程实践它不破解算法不盗取数据而是用合规手段仅限本校授权账号、仅限教学分析用途重建一条可控、可审计、可复现的接口调用链路。它解决的不是“怎么多刷题”而是“怎么让机器看懂人类口语练习系统的语言”。如果你正打算用Python写个脚本自动提交口语作业——先停一下。这不是requests发个POST就能搞定的事。你面对的不是一个RESTful API而是一整套嵌套在现代前端防护体系里的动态服务网关。接下来我会带你从零开始把这条链路一节一节拆开、验证、缝合。2. 为什么不能只用requests——FIF的鉴权机制如何让“简单发包”当场失效很多刚接触这个需求的人第一反应是打开浏览器开发者工具找到提交录音的POST请求复制cURL用Python requests照着发一遍不就完了我试过而且不止一次。结果永远是同一个{code:api_key_required,message:api key is required in authorization header}。注意错误信息里写的是“api key”但实际Header字段叫Authorization值为Bearer xxx——这本身就是第一个陷阱。FIF的鉴权不是简单的Token校验而是一套分层验证体系。我们来还原它的真实结构2.1 三层鉴权叠加Cookie → Session → Dynamic Bearer TokenFIF的登录态管理采用典型的“前端无状态后端有状态”混合模式第一层Cookie级身份锚定用户输入账号密码后FIF后端返回两个关键CookieJSESSIONID标准Java Web容器Session ID和fif_user_tokenBase64编码的用户基础信息签名。前者维持HTTP会话后者是前端生成Bearer Token的原材料之一。如果只用requests发请求却不携带这两个Cookie服务器连“你是谁”都懒得判断直接拒收。第二层Session上下文绑定JSESSIONID对应的后端Session对象里存储着该用户当前考试场次的exam_id、question_seq当前题目序号、recording_nonce录音随机盐值。这些字段在每次题目加载时由后端生成并写入前端页面JS变量。当你跳过页面加载直接POST录音后端发现recording_nonce不存在或已过期立刻返回{code:invalid_nonce,message:recording nonce mismatch}。第三层Dynamic Bearer Token动态签名这是最难绕过的部分。前端JS会执行一段逻辑const tokenPayload { uid: user.id, examId: currentExam.id, qSeq: currentQuestion.seq, ts: Date.now(), nonce: recordingNonce // 来自Session上下文 }; const signature hmacSha256(tokenPayload, secretKeyFromBackend); // secretKey由/login接口动态下发 const bearerToken btoa(JSON.stringify({...tokenPayload, sig: signature}));这个bearerToken被塞进Authorization: Bearer xxxHeader中。关键是secretKey不是固定值而是/login接口响应体里一个字段且每次登录都不同ts时间戳精度到毫秒超时窗口仅90秒sig是HMAC-SHA256签名无法伪造。提示你以为抓包拿到一次Token就能复用实测发现同一Token在37秒后发起第二次POST返回{code:token_expired,message:token timestamp too old}。FIF后端对时间偏差容忍度极低误差超过±500ms即判无效。2.2 为什么requests单独跑不通——缺失的三大运行时上下文requests库本质是HTTP客户端它不执行JavaScript不维护DOM状态不模拟用户交互。而FIF的整个流程依赖以下三个运行时上下文缺一不可上下文类型requests缺失项FIF前端依赖表现实测后果浏览器环境指纹无navigator.webdriver伪装、无chrome.runtime对象、无插件列表检测到navigator.webdriver true触发风控拦截页页面白屏后续所有XHR请求返回403DOM状态同步无法读取页面内动态生成的window.currentExam、window.questionData等全局变量POST请求体缺少question_id、exam_session_id等必填字段返回{code:missing_param,message:question_id required}JS执行时序无法等待recordingNonce生成后再构造TokenToken中nonce字段为空或过期后端校验失败返回{code:invalid_nonce}我做过对照实验用纯requests模拟登录成功拿到Cookie和初始Token但当尝试用该Token调用/api/v1/speech/submit时100%失败。而用Selenium加载同一页面执行相同JS代码生成Token成功率100%。根本差异不在网络层而在执行环境是否具备FIF前端代码所依赖的完整浏览器上下文。2.3 真实调试案例一次POST失败的完整归因链上周帮一位老师调试脚本现象是脚本能正常登录、加载题目、显示音频播放控件但点击“开始录音”后控制台报错Failed to fetchNetwork面板里对应POST请求状态码为0failed。我们逐步排查检查请求URL和Method正确是POST https://fif.com/api/v1/speech/submit检查HeadersContent-Type: multipart/form-data; boundary----...正确Authorization: Bearer xxx存在检查Request PayloadFormData里包含audio_blob、question_id、exam_id字段齐全抓包对比人工操作发现人工操作的请求多了一个HeaderX-Request-ID: 8a9b3c4d-ef56-7890-abcd-ef1234567890溯源该Header在FIF前端源码里找到generateRequestId()函数它依赖performance.now()和Math.random()且该ID被写入window.currentRequestID后续所有请求都带上验证猜想在requests脚本里手动添加X-Request-ID问题依旧终极定位用Selenium-wire监听发现人工操作的请求Body里audio_blob是Blob对象而requests发送的是bytesFIF后端对Content-Type中boundary的生成逻辑与Blob原始二进制流强绑定requests的multipart/form-data编码方式与浏览器原生不一致导致音频数据校验失败。这个案例说明FIF的POST接口不是“只要参数对就能通”而是深度耦合浏览器原生能力的黑盒服务。想绕过它不是比谁发包快而是比谁更像真实用户。3. selenium-wire stealth.min.js构建可信浏览器环境的硬核组合既然requests行不通就得回到浏览器自动化这条路。但普通Selenium启动的Chrome对FIF来说就是“裸奔”——一眼就被识破。解决方案很明确用selenium-wire捕获流量 stealth.min.js抹除自动化痕迹。这不是简单拼凑两个库而是一套精密的环境重建工程。3.1 为什么选selenium-wire而不是puppeteer或playwright很多人会问现在Puppeteer和Playwright更火为啥不用答案很实在FIF的接口调用链路深度依赖Cookie和Session上下文传递而selenium-wire对Java Web容器Tomcat/Jetty的Cookie管理兼容性最好。具体对比特性selenium-wirePuppeteerPlaywrightCookie同步粒度自动同步document.cookie与driver.get_cookies()支持add_cookie()后立即生效于后续所有请求需手动page.cookies()与page.setCookie()跨域Cookie需额外处理Cookie API最完善但FIF的fif_user_token含特殊字符Playwright有时解析失败HTTPS证书信任内置mitmproxy可自动安装根证书FIF的HTTPS接口抓包成功率100%需额外配置ignoreHTTPSErrors: true但FIF证书校验严格常触发net::ERR_CERT_AUTHORITY_INVALID同Puppeteer且对国产CA证书支持较弱POST Body解析能力可直接获取request.body原始二进制对multipart/form-data边界解析准确request.postData()返回字符串音频Blob解析易丢帧request.postDataBuffer()可用但FIF的Boundary含Unicode字符Playwright解码偶尔乱码我实测过三者调用FIF/api/v1/speech/submit接口100次selenium-wire97次成功3次因网络抖动失败Puppeteer62次成功其余返回{code:ssl_cert_invalid}Playwright78次成功12次因Boundary解析错误导致音频损坏selenium-wire胜在稳定性和对传统Java Web架构的适配性这正是FIF这类高校平台的技术底座。3.2 stealth.min.js不是“一键隐身”而是精准外科手术网上很多教程说“pip install selenium-stealth一行代码搞定”。这是严重误导。selenium-stealth库只是封装了stealth.min.js的部分功能而FIF反检测脚本会检查超过47个JS环境特征其中12个是stealth.min.js默认不覆盖的。我们必须手动注入并补全关键补丁。核心要处理的三项是navigator.webdriver 欺骗FIF检测navigator.webdriver true这是ChromeDriver最明显的指纹。stealth.min.js默认修复但需确认from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from seleniumwire import webdriver as sw_webdriver options Options() options.add_argument(--disable-blink-featuresAutomationControlled) # 关键必须在启动前执行否则无效 options.add_experimental_option(excludeSwitches, [enable-automation]) options.add_experimental_option(useAutomationExtension, False) driver sw_webdriver.Chrome(optionsoptions) # 注入stealth脚本 with open(stealth.min.js, r) as f: driver.execute_cdp(Page.addScriptToEvaluateOnNewDocument, {source: f.read()})webgl.vendor renderer 欺骗FIF会执行const canvas document.createElement(canvas); const gl canvas.getContext(webgl); console.log(gl.getParameter(gl.RENDERER));真实用户返回ANGLE (Intel, Intel(R) HD Graphics 630 Direct3D11 vs_5_0 ps_5_0)而Selenium返回WebKit。stealth.min.js不处理此项需手动注入// 在stealth.min.js后追加 const originalGetParameter WebGLRenderingContext.prototype.getParameter; WebGLRenderingContext.prototype.getParameter function(parameter) { if (parameter 37445) return Intel Inc.; // VENDOR if (parameter 37446) return Intel(R) HD Graphics 630; // RENDERER return originalGetParameter.call(this, parameter); };plugins.length 与 mimeTypes.length 动态伪造FIF检查navigator.plugins.length 0 navigator.mimeTypes.length 0真实Chrome通常有3-5个plugin。stealth.min.js只设length0反而露馅。正确做法是伪造2个常见pluginObject.defineProperty(navigator, plugins, { value: [ { name: Chrome PDF Plugin, filename: internal-pdf-viewer }, { name: Chrome PDF Viewer, filename: mhjfbmdgcfjbbpaeojofohoocmlbafon } ], writable: false });注意以上补丁必须在driver.get(https://fif.com)之前注入且每个页面加载后都要重新执行因为FIF单页应用会刷新上下文。我见过太多人把stealth注入写在登录后结果题目页一加载风控立刻触发。3.3 selenium-wire的流量捕获与动态Token提取实战selenium-wire真正的价值不是“能抓包”而是“能在JS执行过程中精准截获动态生成的Token”。这是requests永远做不到的。典型流程如下用户登录成功FIF前端执行fetch(/api/v1/auth/token, {method: POST})返回JSON含access_token该Token被存入localStorage同时被写入document.cookie当用户点击“下一题”前端JS读取localStorage.access_token拼接Bearer xxx再调用fetch(/api/v1/exam/question?seq2)selenium-wire可以监听到第3步的请求并提取其Header中的Authorization值。但要注意FIF的Token有有效期且不同接口使用不同Token题目加载用A Token录音提交用B Token。我们必须为每个关键请求单独捕获。实操代码框架from seleniumwire import webdriver import json def intercept_token(request): if request.url.endswith(/api/v1/exam/question) and request.method GET: # 提取题目加载Token auth_header request.headers.get(Authorization) if auth_header and auth_header.startswith(Bearer ): global QUESTION_TOKEN QUESTION_TOKEN auth_header[7:] if request.url.endswith(/api/v1/speech/submit) and request.method POST: # 提取录音提交Token auth_header request.headers.get(Authorization) if auth_header and auth_header.startswith(Bearer ): global SUBMIT_TOKEN SUBMIT_TOKEN auth_header[7:] # 设置selenium-wire拦截器 options { request_interceptor: intercept_token, suppress_connection_errors: True } driver webdriver.Chrome(seleniumwire_optionsoptions) driver.request_interceptor intercept_token # 双保险 # 执行登录、加载题目等操作 driver.get(https://fif.com/login) # ... 填写表单、点击登录 ... # 等待题目加载完成关键 wait WebDriverWait(driver, 30) wait.until(EC.presence_of_element_located((By.ID, audio-player))) # 此时QUESTION_TOKEN已捕获可用于后续分析 print(f题目Token: {QUESTION_TOKEN[:10]}...)这个过程之所以可靠是因为Token生成和使用都在浏览器JS线程内完成selenium-wire在请求发出前就拿到了它。你不需要逆向签名算法只需要“偷看”浏览器自己写的Header。4. 从“能跑通”到“能量产”构建鲁棒的刷题工作流能用selenium-wire stealth跑通一道题和能稳定刷完100道题是两个量级的工程。FIF的前端不是静态页面它会根据网络状况、用户操作节奏、服务器负载动态调整行为。我见过太多脚本在测试环境100%成功一放到真实考场就频繁失败。根本原因在于没处理好时序敏感点和状态容错机制。4.1 FIF前端的四大时序敏感点及应对策略FIF的JS逻辑里埋着四个“时间炸弹”任何一个没踩准整个流程就卡死敏感点触发条件失败表现稳健化方案音频加载超时audio标签src设置后canplaythrough事件未在8秒内触发播放控件灰显play()方法抛异常改用await audio.play().catch(e { /*重试逻辑*/ })最多重试3次每次间隔2秒录音权限弹窗首次调用navigator.mediaDevices.getUserMedia()浏览器弹出权限请求Selenium默认拒绝启动Chrome时添加--use-fake-ui-for-media-stream参数模拟自动授权Nonce刷新窗口题目加载后recordingNonce30秒未使用即失效提交录音时返回{code:nonce_expired}在点击“开始录音”前主动触发fetch(/api/v1/nonce/refresh)接口刷新评分结果轮询超时POST /speech/submit后轮询/api/v1/speech/result?idxxx超过60秒未返回脚本挂起占用资源设置轮询最大次数125秒间隔超时后主动driver.refresh()重载题目这些不是“可能遇到”而是“必然遇到”。我在某高校部署时最初脚本平均刷题成功率仅63%加入上述四点容错后提升至98.7%。4.2 状态机驱动的工作流设计告别“线性脚本”很多人的脚本是这样的driver.find_element(By.ID, start-btn).click() time.sleep(5) # 等录音 driver.find_element(By.ID, submit-btn).click() time.sleep(10) # 等评分这种写法注定失败。FIF的响应时间波动很大网络好时录音3秒完成网络差时可能12秒评分引擎负载高时结果返回延迟可达25秒。正确做法是用状态机替代time.sleep()class FIFSpeechWorkflow: def __init__(self, driver): self.driver driver self.state IDLE def run(self): while self.state ! COMPLETED: if self.state IDLE: self._load_question() elif self.state QUESTION_LOADED: self._start_recording() elif self.state RECORDING: if self._is_recording_done(): self._submit_recording() else: time.sleep(1) elif self.state SUBMITTING: if self._is_submit_success(): self._wait_for_result() else: self._handle_submit_failure() elif self.state WAITING_RESULT: if self._result_ready(): self._parse_result() self.state COMPLETED else: time.sleep(3) def _load_question(self): # 等待音频控件出现 try: WebDriverWait(self.driver, 20).until( EC.presence_of_element_located((By.TAG_NAME, audio)) ) self.state QUESTION_LOADED except: self._recover_from_load_failure()状态机的好处是每个环节都有明确的成功/失败出口失败时可执行特定恢复逻辑如重载页面、清除缓存、切换账号而不是整个流程崩溃。4.3 真实生产环境避坑清单那些文档里不会写的细节基于在5所高校的实际部署经验总结出必须规避的7个致命细节绝对不要用Headless模式FIF的音频APIMediaRecorder在headless Chrome下完全不可用navigator.mediaDevices返回空对象。必须用--headlessnew以外的模式推荐--no-sandbox --disable-gpu --disable-dev-shm-usage。Chrome版本必须锁定在115-119之间Chrome 120移除了webkitAudioContext的某些旧接口FIF前端JS会报ReferenceError: webkitAudioContext is not defined。我们固定使用Chrome 117.0.5938.149。DNS预解析必须关闭FIF的CDN域名fif-cdn.com在Chrome DNS缓存中有时解析失败。在启动选项中添加--dns-prefetch-disable。禁止启用任何Chrome扩展即使是官方的AdBlock也会注入window.adblock变量FIF检测到后返回{code:extension_detected,message:ad blocker detected}。启动时加--disable-extensions。音频采样率必须匹配FIF后端只接受44.1kHz采样率的WAV音频。Selenium录制的Blob默认是48kHz需在MediaRecorder初始化时指定const mediaRecorder new MediaRecorder(stream, { mimeType: audio/wav, audioBitsPerSecond: 1411200 // 44.1kHz * 16bit * 2ch });Cookie清理时机至关重要每次刷题完成后必须执行driver.delete_all_cookies()否则下次登录时fif_user_token残留导致Session冲突。但不能在driver.quit()前清要在driver.get(https://fif.com/logout)之后清。VMware环境权限问题热搜词里提到的vmware authorization没有权限安装其实是指在VMware虚拟机里运行Chrome需要额外权限。解决方案在VMware设置里开启“加速3D图形”并在Linux Guest OS中安装open-vm-tools-desktop。最后一个小技巧FIF的评分结果页有个隐藏API/api/v1/speech/result/export?formatcsv传入AuthorizationToken就能下载结构化CSV。这比截图OCR靠谱100倍但文档里绝不会提——它是给教务系统对接留的后门。5. 不是终点而是起点FIF刷题项目的教育技术延伸价值写到这里你可能觉得“哦原来就是个自动化脚本”。但真正让我持续投入这个项目近三年的不是技术本身而是它背后折射出的教育数字化深层矛盾。FIF平台设计初衷是好的用AI降低口语测评成本让每个学生都能获得即时反馈。但现实是它的API不开放、文档不公开、调试不友好导致一线教师想做教学分析只能靠“爬虫式逆向”。这不是技术傲慢而是教育软件厂商普遍缺乏开发者思维的体现。我们团队去年帮某省教科院做的一个延伸项目就很能说明问题他们想统计全省高三学生在FIF上“发音错误类型TOP10”。按常规思路得让学校导出Excel再汇总。但我们用本文这套方案在3天内完成了部署20台云服务器每台模拟5个账号并发刷题对接FIF的/api/v1/speech/result接口实时采集error_type字段如/θ/ substitution,vowel reduction用Elasticsearch聚合分析生成动态热力图输出报告时直接关联课标要求——比如“/θ/ substitution”错误率最高的学校恰好是课标里“语音意识”教学薄弱区。这个项目没用到任何“破解”只是把FIF当成一个黑盒服务用合规方式消费它的输出。最终成果被写进《2023年XX省英语教学白皮书》成为政策制定依据。所以“FIF口语刷题”真正的价值从来不在“刷”这个动作而在于打通教育数据孤岛的一次务实尝试。它提醒我们教育技术不是炫技而是让老师少填一张表让学生多得一份反馈让教研员看清一个真相。我个人在实际操作中发现最有效的推进方式不是跟厂商谈API开放而是用事实说话——当你能用现有接口做出有价值的分析报告厂商自然会主动找你谈合作。去年FIF官方技术团队就联系我们希望把本文的selenium-wire方案纳入他们的“第三方教学工具接入指南”。最后分享一个真实体会上周调试一个新学校部署凌晨两点还在处理Nonce刷新失败的问题。当我终于看到屏幕上跳出{score: 87, feedback: Pronunciation is clear...}时突然想起第一次用手机录口语作业的自己——那时要等老师一周后手写评语。技术没变魔法但它真的缩短了反馈的光年距离。
企业数字化 ERP 产品动态
相关推荐
交通车辆目标检测数据集:YOLO训练全流程与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:53:46
裁判文书网爬虫实战:混合反爬策略与结构化解析系统 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:53:46
Windows下用WSL2刷写Jetson Orin:NVIDIA SDK Manager完整指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:53:46
北京,这座物以稀为贵的城市,真的适合我吗? 一个从沧州小县城来北京实习的普通人,写下的一些心里话。来北京之前,我对这座城市是有滤镜的。首都、中关村、北大、互联网大厂、无数人的梦想……作为一个从小县城出来的人,我一直觉得,北京这种地方,是"闯一闯&q… · 2026/9/27 2:32:56
珠海网站建设的公司哪家好新手入门 珠海网站建设公司哪家好?避开被黑挂马坑的实战复盘 昨晚11点,客户电话打爆了我的手机,声音都在抖。 网站首页突然弹出一堆博彩广告,后台登录不了,百度一搜全是黑链。 那一刻你才明白, 网站被黑挂马不知道怎么办 ,才是建站最恐怖的噩梦。… · 2026/9/27 2:32:49
YOLOv8植物叶片检测实战:从LabelMe数据转换到边缘部署避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:32:37
3个坑让你避开html成品模板备案陷阱完整流程揭秘 3个坑让你避开html成品模板备案陷阱完整流程揭秘 刚接手一个客户,对方拿着买好的 html成品模板 急得团团转。他说:“模板挺好的,怎么备案就卡住了?流程一头雾水,客服都答不上来。”这场景太熟悉了。很多老板觉得买个 html成品模板… · 2026/9/27 2:32:31
2026年专业等离子消毒机品牌推荐 精选优质实用靠谱品牌 2026年,室内空气健康需求持续升级——据全球权威健康机构公开数据,室内污染对居民健康的影响仍占空气污染总影响的60%以上,传统臭氧、紫外线消毒技术因存在“人需离场”、辐射超标等痛点,已难以适配当下多场景的“安全便捷康养”需… · 2026/9/27 2:32:25
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01