[Quicker] 蓝奏云API - 源码归档

news/2026/1/17 7:44:26/文章来源:https://www.cnblogs.com/luoluoluo22/p/19423590

动作:蓝奏云API

封装蓝奏云解析逻辑,支持解析文件直链、名称和大小。

更新时间:2025-12-30 23:02
原始文件:LanzouApi.cs

核心代码

//css_ref System.Windows.Forms.dll
//css_ref System.Drawing.dll
//css_ref Microsoft.Web.WebView2.Core.dll
//css_ref System.Web.dll
//css_ref System.Net.Http.dllusing System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.Web.WebView2.Core;
using Newtonsoft.Json.Linq;
using Quicker.Public;public static void Exec(IStepContext context)
{if (Thread.CurrentThread.GetApartmentState() != ApartmentState.STA){throw new Exception("请将模块执行线程设置为 [后台线程 (STA独立线程)]");}StringBuilder log = new StringBuilder();string filePath = context.GetVarValue("file_path")?.ToString();string link = context.GetVarValue("link")?.ToString();string pwd = context.GetVarValue("pwd")?.ToString();string cookie = context.GetVarValue("cookie")?.ToString();log.AppendLine($"[*] 任务启动: {DateTime.Now:HH:mm:ss}");// --- 逻辑分支:上传 vs 下载 ---if (!string.IsNullOrWhiteSpace(filePath)){log.AppendLine("[*] 检测到文件路径,进入上传模式...");if (string.IsNullOrWhiteSpace(cookie)) throw new Exception("上传模式需要提供 Cookie (phpdisk_info)。");try {string shareLink = TryHttpUpload(filePath, cookie, context, log);context.SetVarValue("share_link", shareLink);context.SetVarValue("text", shareLink);log.AppendLine($"[SUCCESS] 上传并获取链接成功: {shareLink}");} catch (Exception ex) {log.AppendLine($"[ERROR] 上传失败: {ex.Message}");throw;}}else if (!string.IsNullOrWhiteSpace(link)){log.AppendLine("[*] 检测到链接,进入解析下载模式...");if (!link.StartsWith("http")) link = "https://" + link;bool httpSuccess = false;try {log.AppendLine("[*] 正在尝试 HTTP 引擎解析 (Fast Path)...");httpSuccess = TryHttpParse(link, pwd, context, log);} catch (Exception ex) {log.AppendLine($"[!] HTTP 引擎解析受阻: {ex.Message}");}if (!httpSuccess) {log.AppendLine("[*] 自动切换至 WebView2 浏览器引擎 (Robust Path)...");try {var result = RunWebViewMachine(link, pwd, log, context);if (result != null) {context.SetVarValue("text", result.DirectUrl);context.SetVarValue("file_name", result.FileName);log.AppendLine("[SUCCESS] WebView2 引擎成功补位。");}} catch (Exception ex) {log.AppendLine($"[CRITICAL] 所有路径均不可达: {ex.Message}");context.SetVarValue("debug_log", log.ToString());throw;}}}else{throw new Exception("错误:未提供链接或待上传文件路径。");}context.SetVarValue("debug_log", log.ToString());
}#region 引擎三:上传模式 (Upload Engine)
private static string TryHttpUpload(string filePath, string cookie, IStepContext context, StringBuilder log)
{if (!File.Exists(filePath)) throw new FileNotFoundException("找不到待上传的文件。");// 规范化 Cookieif (!cookie.Contains("phpdisk_info=")) cookie = "phpdisk_info=" + cookie;string folderId = context.GetVarValue("folder_id")?.ToString() ?? "-1";string ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";var handler = new HttpClientHandler { UseCookies = false };using (var client = new HttpClient(handler)){client.DefaultRequestHeaders.Add("User-Agent", ua);client.DefaultRequestHeaders.Add("Cookie", cookie);client.DefaultRequestHeaders.Add("Referer", "https://pc.woozooo.com/mydisk.php");client.DefaultRequestHeaders.Add("Origin", "https://pc.woozooo.com");log.AppendLine($"[*] 开始模拟 HTML5 上传: {Path.GetFileName(filePath)}");using (var content = new MultipartFormDataContent()){content.Add(new StringContent("1"), "task");content.Add(new StringContent("2"), "ve");content.Add(new StringContent("2"), "vie");content.Add(new StringContent(folderId), "folder_id");content.Add(new StringContent("WU_FILE_0"), "id");content.Add(new StringContent(Path.GetFileName(filePath)), "name");var fileContent = new ByteArrayContent(File.ReadAllBytes(filePath));fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");content.Add(fileContent, "upload_file", Path.GetFileName(filePath));// 1. 发送上传请求 (使用抓包确认的域名和接口)var response = client.PostAsync("https://pc.woozooo.com/html5up.php", content).Result;string resJson = response.Content.ReadAsStringAsync().Result;if (!resJson.Trim().StartsWith("{")) {string snippet = resJson.Length > 500 ? resJson.Substring(0, 500) : resJson;log.AppendLine($"[DEBUG] 响应内容: {snippet}");throw new Exception("上传接口未返回 JSON。请确认 Cookie 是否包含 phpdisk_info、ylogin 和 uag。");}var obj = JObject.Parse(resJson);if (obj["zt"]?.ToString() != "1"){throw new Exception($"上传业务报错: {obj["info"] ?? obj["text"]}");}string fileId = obj["text"]?[0]?["id"]?.ToString();if (string.IsNullOrEmpty(fileId)) {// 有时候 id 在 info 里或 text 是字符串fileId = obj["text"]?.ToString();}if (string.IsNullOrEmpty(fileId)) throw new Exception("上传成功但未提取到文件ID。");log.AppendLine($"[+] 上传成功,文件ID: {fileId}。正在获取分享链接...");// 2. 获取分享链接 (task=18)var postData = new FormUrlEncodedContent(new Dictionary<string, string> {{ "task", "18" },{ "file_id", fileId }});var shareResp = client.PostAsync("https://pc.woozooo.com/doupload.php", postData).Result;string shareJson = shareResp.Content.ReadAsStringAsync().Result;if (!shareJson.Trim().StartsWith("{")) {log.AppendLine($"[DEBUG] 获取分享链接响应异常: {shareJson.Substring(0, Math.Min(shareJson.Length, 100))}");return $"https://www.lanzouy.com/{fileId}"; // 兜底返回基础链接}var shareObj = JObject.Parse(shareJson);if (shareObj["zt"]?.ToString() == "1"){return shareObj["info"]?["url"]?.ToString();}else{log.AppendLine($"[!] 获取分享链接失败: {shareObj["info"]}");// 某些情况下虽然 task=18 失败,但文件已经在那了,可以构造基础链接return $"https://www.lanzouy.com/{fileId}";}}}
}
#endregion#region 引擎一:HTTP 解析模式
private static bool TryHttpParse(string link, string pwd, IStepContext context, StringBuilder log)
{const string UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";var cookieContainer = new CookieContainer();var handler = new HttpClientHandler { CookieContainer = cookieContainer, AllowAutoRedirect = false,AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate};using (var client = new HttpClient(handler)){client.DefaultRequestHeaders.Add("User-Agent", UA);client.DefaultRequestHeaders.Add("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8");string html = GetHtmlWithRetry(client, link, log, cookieContainer);string pageTitle = Regex.Match(html, @"<title>(.*?)</title>").Groups[1].Value.Replace(" - 蓝奏云", "").Trim();var iframeMatch = Regex.Match(html, @"iframe.*?src=""(/fn\?[^""]+)""");string currentUrl = link;if (iframeMatch.Success){string iframeUrl = $"https://{new Uri(link).Host}{iframeMatch.Groups[1].Value}";var req = new HttpRequestMessage(HttpMethod.Get, iframeUrl);req.Headers.Add("Referer", link);var fnResp = client.SendAsync(req).Result;html = fnResp.Content.ReadAsStringAsync().Result;currentUrl = iframeUrl;}string cleanHtml = Regex.Replace(html, @"//.*|/\*[\s\S]*?\*/|<!--[\s\S]*?-->", "");string wp_sign = Regex.Match(cleanHtml, @"var\s+(?:wp_sign|skdklds|wsk_sign|aihidcms|ciucjdsdc)\s*=\s*'([a-zA-Z0-9+/=_ -]{30,})';").Groups[1].Value;if (string.IsNullOrEmpty(wp_sign))wp_sign = Regex.Match(cleanHtml, @"var\s+\w+\s*=\s*'([a-zA-Z0-9+/=_ -]{40,})';").Groups[1].Value;string ajaxdata = Regex.Match(cleanHtml, @"var\s+ajaxdata\s*=\s*'([^']+)';").Groups[1].Value;string fid = Regex.Match(cleanHtml, @"/ajaxm\.php\?file=(\d+)").Groups[1].Value;if (string.IsNullOrEmpty(fid))fid = Regex.Match(cleanHtml, @"var\s+f_id\s*=\s*'([^']+)';|var\s+fid\s*=\s*'([^']+)';").Groups.Cast<Group>().LastOrDefault(g => g.Success)?.Value;if (string.IsNullOrEmpty(wp_sign) || string.IsNullOrEmpty(fid)) return false;var uri = new Uri(currentUrl);string ajaxUrl = $"{uri.Scheme}://{uri.Host}/ajaxm.php?file={fid}";var postData = new Dictionary<string, string> {{ "action", "downprocess" }, { "signs", ajaxdata }, { "websignkey", ajaxdata },{ "websign", "" }, { "sign", wp_sign }, { "kd", "1" }, { "ves", "1" }, { "p", pwd }};var ajaxReq = new HttpRequestMessage(HttpMethod.Post, ajaxUrl);ajaxReq.Content = new FormUrlEncodedContent(postData);ajaxReq.Headers.Add("Referer", currentUrl);ajaxReq.Headers.Add("X-Requested-With", "XMLHttpRequest");var ajaxResp = client.SendAsync(ajaxReq).Result;string json = ajaxResp.Content.ReadAsStringAsync().Result;var obj = JObject.Parse(json);if (obj["zt"]?.ToString() == "1"){string directLink = obj["dom"]?.ToString() + "/file/" + obj["url"]?.ToString();string fileName = obj["inf"]?.ToString();if (string.IsNullOrEmpty(fileName) || fileName == "0") fileName = pageTitle;var traceReq = new HttpRequestMessage(HttpMethod.Get, directLink);traceReq.Headers.Add("Referer", currentUrl);traceReq.Headers.Add("Cookie", "down_ip=1");var traceResp = client.SendAsync(traceReq).Result;string finalUrl = (traceResp.StatusCode == HttpStatusCode.Redirect || traceResp.StatusCode == HttpStatusCode.Found || traceResp.StatusCode == HttpStatusCode.MovedPermanently)? traceResp.Headers.Location.ToString() : directLink;context.SetVarValue("text", finalUrl);context.SetVarValue("file_name", fileName);log.AppendLine($"[HTTP-SUCCESS] 解析成功: {fileName}");return true;}return false;}
}private static string GetHtmlWithRetry(HttpClient client, string url, StringBuilder log, CookieContainer cc, int depth = 0)
{if (depth > 3) throw new Exception("WAF 安全验证死循环。");var response = client.GetAsync(url).Result;string html = response.Content.ReadAsStringAsync().Result;if (html.Contains("acw_sc__v2")){var arg1Match = Regex.Match(html, @"arg1='([0-9A-Z]+)'");if (arg1Match.Success){string acw = CalcAcwScV2(arg1Match.Groups[1].Value);cc.Add(new Uri(url), new Cookie("acw_sc__v2", acw));return GetHtmlWithRetry(client, url, log, cc, depth + 1);}}return html;
}private static string CalcAcwScV2(string arg1)
{int[] v1 = { 15, 35, 29, 24, 33, 16, 1, 38, 10, 9, 19, 31, 40, 27, 22, 23, 25, 13, 6, 11, 39, 18, 20, 8, 14, 21, 32, 26, 2, 30, 7, 4, 17, 5, 3, 28, 34, 37, 12, 36 };char[] v2 = new char[v1.Length];for (int i = 0; i < arg1.Length && i < v1.Length; i++) {for (int j = 0; j < v1.Length; j++) { if (v1[j] == i + 1) { v2[j] = arg1[i]; break; } }}string hexArg = new string(v2); string xorKey = "3000176000856006061501533003690027800375";StringBuilder sb = new StringBuilder();for (int i = 0; i < hexArg.Length && i < xorKey.Length; i += 2) {int b1 = Convert.ToInt32(hexArg.Substring(i, 2), 16);int b2 = Convert.ToInt32(xorKey.Substring(i, 2), 16);sb.Append((b1 ^ b2).ToString("x2"));}return sb.ToString();
}
#endregion#region 引擎二:WebView2 模式
public static ParsingResult RunWebViewMachine(string url, string pwd, StringBuilder log, IStepContext context)
{ParsingResult result = null;using (var form = new Form()){form.Text = "Lanzou Parser Fallback";form.ShowInTaskbar = false;form.Size = new Size(100, 100);form.Location = new Point(-32000, -32000); var panel = new Panel { Dock = DockStyle.Fill };form.Controls.Add(panel);CoreWebView2Controller controller = null;CoreWebView2 webview = null;bool isDone = false;bool isNavFiles = false;Action<string, string> finalize = (raw, name) => {if (isDone) return; isDone = true;string final = raw;try {using (var h = new HttpClientHandler { AllowAutoRedirect = false })using (var c = new HttpClient(h)) {c.DefaultRequestHeaders.Add("Referer", webview.Source); c.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36");var r = c.GetAsync(raw).GetAwaiter().GetResult();if (r.Headers.Location != null) final = r.Headers.Location.ToString();}} catch {}result = new ParsingResult { DirectUrl = final, FileName = name };context.SetVarValue("text", final);context.SetVarValue("file_name", name);form.Invoke(new Action(() => form.Close()));};form.Shown += async (s, e) => {try {var env = await CoreWebView2Environment.CreateAsync(null, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Quicker_Lanzou_WV2"));controller = await env.CreateCoreWebView2ControllerAsync(panel.Handle);webview = controller.CoreWebView2;webview.WebResourceResponseReceived += async (ss, ee) => {if (isDone || isNavFiles) return;if (ee.Request.Uri.Contains("ajaxm.php")) {try {var stream = await ee.Response.GetContentAsync();using (var sr = new StreamReader(stream)) {var data = JObject.Parse(await sr.ReadToEndAsync());if (data["zt"]?.ToString() == "1") {isNavFiles = true;webview.Navigate(data["dom"]?.ToString() + "/file/" + data["url"]?.ToString());}}} catch {}}};webview.DownloadStarting += (ss, ee) => { ee.Cancel = true; finalize(ee.DownloadOperation.Uri, webview.DocumentTitle.Replace(" - 蓝奏云", "").Trim()); };webview.Navigate(url);await Task.Run(async () => {int sc = 0;while(!isDone && sc++ < 45) {await Task.Delay(1600);if(isDone) break;form.Invoke(new Action(async () => {if(isDone || webview == null) return;try {string js = $@"(function() {{let ifr = document.querySelector('iframe');if(!window._eb && ifr && ifr.src.includes('fn?')) {{ window._eb=true; location.href=ifr.src; return 'Jump'; }}let doc = ifr?.contentDocument || document;let b = Array.from(doc.querySelectorAll('a,button,span')).find(el => el.innerText.match(/电信下载|联通下载|普通下载/));if(b) {{const e = (n) => b.dispatchEvent(new MouseEvent(n, {{ bubbles:true, cancelable:true, view:window }}));e('mousedown'); setTimeout(() => {{ e('mouseup'); e('click'); }}, 100);return 'Click:' + b.innerText;}}return 'Scan';}})()";await webview.ExecuteScriptAsync(js);} catch {}}));}});} catch (Exception) { form.Close(); }};Application.Run(form);return result;}
}
#endregionpublic class ParsingResult { public string DirectUrl { get; set; } public string FileName { get; set; } }

动作配置 (JSON)

{"ActionId": "46d5af77-9a62-45a2-91ee-ee1117c5455c","Title": "蓝奏云API","Description": "封装蓝奏云解析逻辑,支持解析文件直链、名称和大小。","Icon": "fa:Solid_CloudDownloadAlt:#0080FF","References": ["Microsoft.Web.WebView2.Core.dll","System.Windows.Forms.dll","System.Drawing.dll","System.Web.dll","System.Runtime.dll"],"Variables": [{"Key": "link","IsLocked": false,"Type": 0,"Desc": "蓝奏云链接","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "pwd","IsLocked": false,"Type": 0,"Desc": "提取码","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "text","IsLocked": false,"Type": 0,"Desc": "直链","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "file_name","IsLocked": false,"Type": 0,"Desc": "文件名","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "file_size","IsLocked": false,"Type": 0,"Desc": "文件大小","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "debug_log","IsLocked": false,"Type": 0,"Desc": "调试日志","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "file_path","IsLocked": false,"Type": 0,"Desc": "待上传文件路径","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "cookie","IsLocked": false,"Type": 0,"Desc": "登录 Cookie (phpdisk_info)","DefaultValue": null,"SaveState": false,"ParamName": null},{"Key": "folder_id","IsLocked": false,"Type": 0,"Desc": "文件夹ID (默认-1)","DefaultValue": "-1","SaveState": false,"ParamName": null},{"Key": "share_link","IsLocked": false,"Type": 0,"Desc": "上传后的分享链接","DefaultValue": null,"SaveState": false,"ParamName": null}]
}

使用方法

  1. 确保您已安装 动作构建 (Action Builder) 动作。
  2. 将本文提供的 .cs.json 文件下载到同一目录
  3. 选中 .json 文件,运行「动作构建」即可生成并安装动作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1098074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

京东多智能体综合设计——多源异构数据采集与融合应用综合实践

这个项目属于哪个课程 2025数据采集与融合技术实践组名、项目简介 组名:暴虎项目需求:“京东多智能体挑战赛”旨在推动人工智能(AI)技术在实际生产与生活场景中的应用创新,探索多智能体在复杂业务场景下的协同决策能…

QQ音乐加密mgg,ogg转mp3下载

问题背景 想要下载QQ音乐有版权的歌曲,发现下载的是加密的mgg格式,需要先解密成ogg再转换成mp3格式 问题的困难 为了能听歌单的音乐,尝试了以下三条路线找那种能一键导入歌单,根据歌单下载的(不是完全一致的音源都…

一个合格的程序员必读经典书籍(含下载链接PDF)

计算机程序设计艺术 《计算机程序设计艺术》(The Art of Computer Programming)是由计算机科学先驱 Donald E. Knuth 编写的一部殿堂级著作,被誉为算法与程序设计领域的“圣经”。全书以极其严谨的数学推导为基础,…

APS1604M-SQR-ZR产品特点

品牌&#xff1a;AP MEMORY 免费样品申请&#xff1a;中国区一级代理商&#xff1a;深圳市贝乐实业股份有限公司这款psram具备高速、低引脚数接口特性。它拥有4个I/O引脚&#xff0c;能够以SPI(串行外设接口)或QPI(四元外设接口)模式运行&#xff0c;频率最高可达14…

async 和 await 详细解析

Python async 和 await 详细解析 async 和 await 是 Python 3.5 及以上版本引入的异步编程核心语法&#xff0c;用于实现「非阻塞式」代码执行&#xff0c;解决传统同步编程中高IO等待&#xff08;如网络请求、数据库操作、文件读写&#xff09;导致的资源浪费问题&#xff0c;…

基于Springboot智慧旅游管理系统【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

全域适配,精准输出,这款组合导航重新定义精准数据

没有组合导航&#xff0c;飞行记录仪只是一个记录模糊数据的盒子&#xff0c;无法在发生事故后精准复盘;有了组合导航&#xff0c;飞行记录仪才能称之为“黑匣子”&#xff0c;能精准、完整、无断点的提供精准飞行数据。今天&#xff0c;这款组合导航将带你重新定义什么是绝对可…

微爱帮监狱寄信云存储技术实现方案

一、安全分层存储架构# 1. 智能分层存储引擎 class SecureCloudStorage:"""监狱通信数据分层存储系统"""def __init__(self):# 存储层配置self.layers {hot: {type: ssd,provider: aliyun_essd,encryption: AES-256-GCM,retention: 7天,cost_fa…

小白也能学会的PyTorch安装教程GPU版|Miniconda-Python3.10上手指南

小白也能学会的PyTorch安装教程GPU版&#xff5c;Miniconda-Python3.10上手指南 在深度学习的世界里&#xff0c;第一步往往不是写模型&#xff0c;而是——环境装不上。 你是不是也经历过这样的场景&#xff1a;跟着教程敲命令&#xff0c;结果 pip install torch 装完一跑…

程序员不怕BUG,怕的是老到没人要

一、跨年夜的生产环境&#xff1a;当所有人都在庆祝&#xff0c;只有你在值班最后一个需求终于上线了。办公室里只剩下你和服务器指示灯交替闪烁。手机屏幕上&#xff0c;朋友圈正在进行一场盛大的跨年直播——海岛的日落、山顶的日出、家庭的团聚、情侣的拥吻。而你&#xff0…

dbt+DataOps+StarRocks:构建一体化数据治理与智能分析平台实践

作者&#xff1a;胡翔&#xff0c;SJM Resorts 企业方案设计高级经理、dbt- starrocksContributor本文内容整理自 SJM Resorts 企业方案设计高级经理、dbt-starrocks Contributor 胡翔在 StarRocks Connect 2025 上的演讲。文章将主要围绕三个方面展开&#xff1a;dbt 在数据建…

Conda与Pip混合使用指南|Miniconda-Python3.10环境下PyTorch安装策略

Conda与Pip混合使用指南&#xff5c;Miniconda-Python3.10环境下PyTorch安装策略 在深度学习项目开发中&#xff0c;一个常见的场景是&#xff1a;你刚接手同事的代码仓库&#xff0c;满怀期待地运行 pip install -r requirements.txt&#xff0c;结果却卡在了 torch 安装环节…

SCI检索号怎么看?

SCI检索号是什么&#xff1f;它根据什么来分配&#xff0c;有哪些作用&#xff1f;SCI检索号和DOI号有什么区别&#xff1f;下面淘淘学术来给大家详细讲解这些问题。一、SCI检索号的基本概念SCI论文检索号是WOS数据库中对所收录SCI论文的身份编码&#xff0c;具有唯一性和不可替…

jmeter设置中文页面的办法?

打开 JMeter(确保已正确安装并启动,启动文件为 bin/jmeter.bat 或 bin/jmeter.sh)。 在顶部菜单栏中找到 Options(选项),点击展开下拉菜单。 在下拉菜单中选择 Choose Language(选择语言),此时会显示支持的语…

PyTorch安装教程GPU版:Miniconda-Python3.10镜像一键配置深度学习环境

PyTorch GPU环境一键搭建&#xff1a;MinicondaPython3.10镜像实战指南 在深度学习项目启动阶段&#xff0c;最让人头疼的往往不是模型设计&#xff0c;而是环境配置——“为什么你的代码在我机器上跑不起来&#xff1f;”这个问题几乎困扰过每一位AI开发者。依赖冲突、CUDA版本…

确保移动端适配良好以符合谷歌移动优先索引

确保移动端适配良好以符合谷歌移动优先索引 在今天的数字生态中&#xff0c;用户打开网页的第一选择早已不再是台式机浏览器。StatCounter 的数据显示&#xff0c;全球超过 55% 的网络流量来自手机和平板设备。这一转变不仅改变了用户的浏览习惯&#xff0c;也彻底重塑了搜索引…

Java毕设项目推荐-基于SpringBoot+vue招投标系统的设计与实现招标项目发布、投标文件提交、在线评标、合同管理全流程数字化招标方、投标方、评标专家、监管机构【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

HTTP中GET接口测试

JMeter GET接口测试极简笔记建基础:测试计划→右键加线程组→线程组右键加【HTTP请求】配请求:选GET,填域名/IP、接口路径,参数直接填参数面板(名+值)加元件:HTTP请求右键加【查看结果树】,再加HTTP信息头(UT…

在http中请求和响应包括几部分

HTTP 请求报文包含3部分:请求行、请求头、请求体(可选,GET请求一般无请求体)。 HTTP 响应报文包含3部分:状态行、响应头、响应体。

在禅道中如何新增测试用例?

在禅道中新增测试用例有单个 / 批量创建和导入创建两种主要方式,具体操作如下: 单个 / 批量创建 进入禅道系统,点击 “测试”-“用例”,选择 “建用例”。 在建用例页面,选择对应的产品、需求模块、用例类型、适用…