.:. 草榴社區 » 技術討論區 » (更新)iOS Safari下载视频教程
本頁主題: (更新)iOS Safari下载视频教程字體大小 寬屏顯示 只看樓主 最新點評 熱門評論 時間順序
蓝莓山药


級別:新手上路 ( 8 )
發帖:301
威望:58 點
金錢:4251 USD
貢獻:0 點
註冊:2026-02-24

(更新)iOS Safari下载视频教程

複製代碼:更新日志
  1. 2026-09-09 v1.0 初版
  2. 2026-09-10 v1.1 修复长按无效果的问题, 更新源码及快捷指令;
  3.                   已下载t66y.js的请在文件app里删除该文件, 快捷指令已换链接, 请重新下载并替换, 再运行快捷指令
  4. 2026-09-11 代码无修改, 添加隐藏预览的操作说明(在第4点底部)
複製代碼

感谢@黢黑 @贡献+1 大佬的指正


下面是详细步骤


1. 需要安装3个app:

文件

快捷指令

Userscipts


2. 打开Userscipts app

点击下方的Userscripts App Documents, 记住当前目录所在的位置







比如我的位置在"我的iPhone"


3. 运行快捷指令写入js文件至Userscipts主目录

https://www.icloud.com/shortcuts/a8b2cb39481d4d0286d7023d891684a7

添加指令, 直接点击该指令就会运行, 会提示保存到哪里





选择上面记住的位置, 并点右上角的Open(打开)即可

按上面第2步再看下目录里是否有t66y.js, 没有的话表示捷径没执行成功




4. Safari随便点个带视频的帖子

地址栏最左边点开小图标, 选择管理扩展



把Userscripts点亮



点Userscripts



确保草榴视频下载这个js是亮的就行



刷新下当前帖子, 视频下方出现下载图标就是成功了, 长按箭头选下载链接文件即可下载.



若长按后自动全屏播放视频, 可在长按的瞬间点右上角隐藏预览, 比较考验手速.

有不要求手速的做法: 访问如下链接, 长按任意蓝色链接, 右上角点隐藏预览即可(链接预览是系统全局的, 识别到链接是视频就会自动开始播放)
https://developer.apple.com/documentation/webkit/wkwebview/allowslinkpreview


5. 最后附上源码

複製代碼
  1. ==UserScript==
  2. // @name         草榴视频下载
  3. // @match        *://*/htm_mob/*.html
  4. // @match        *://*/read.php*
  5. // @version      1.1
  6. // @description  草榴添加视频下载图标
  7. // @run-at       document-end
  8. // @grant        none
  9. // ==/UserScript==
  10. (function() {
  11. 'use strict';
  12. // ------------------- 视频下载图标 -------------------
  13. const addDownloadButton = (v, url) => {
  14.     // 防止重复添加
  15.     if (v.dataset.downloadAdded) return;
  16.     if (!url || !/^https?:\/\/.*/i.test(url)) return;
  17.     const a = document.createElement("a");
  18.     // 直接指向视频地址
  19.     // 保留 href,方便 iOS Safari 长按处理
  20.     a.href = url;
  21.     a.rel = "noopener";
  22.     a.title = "下载视频";
  23.     a.setAttribute("aria-label", "下载视频");
  24.     // 禁止短按,只保留 Safari 原生长按菜单
  25.     a.addEventListener("click", e => {
  26.         e.preventDefault();
  27.     });
  28.     // Safari 风格的下载图标
  29.     // pointer-events: none 让整个触摸区域都落在 <a> 上
  30.     a.innerHTML = `
  31.         <svg
  32.             pointer-events="none"
  33.             viewBox="0 0 24 24"
  34.             width="20"
  35.             height="20"
  36.             fill="none"
  37.             stroke="currentColor"
  38.             stroke-width="2"
  39.             stroke-linecap="round"
  40.             stroke-linejoin="round"
  41.             aria-hidden="true">
  42.             <path d="M12 3v12"></path>
  43.             <path d="m7 10 5 5 5-5"></path>
  44.             <path d="M5 21h14"></path>
  45.         </svg>
  46.     `;
  47.     // 下载图标放在视频下方,居中
  48.     a.style.display = "inline-flex";
  49.     a.style.alignItems = "center";
  50.     a.style.justifyContent = "center";
  51.     // 实际可点击区域稍大,但视觉上仍只有一个小图标
  52.     a.style.width = "32px";
  53.     a.style.height = "32px";
  54.     // 跟随当前页面文字颜色
  55.     a.style.color = "inherit";
  56.     a.style.textDecoration = "none";
  57.     // 保留 Safari 原生长按行为
  58.     a.style.webkitTouchCallout = "default";
  59.     a.style.userSelect = "none";
  60.     // 图标容器
  61.     const wrap = document.createElement("div");
  62.     wrap.style.display = "flex";
  63.     wrap.style.justifyContent = "center";
  64.     wrap.style.alignItems = "center";
  65.     wrap.style.height = "32px";
  66.     wrap.style.margin = "0";
  67.     wrap.appendChild(a);
  68.     // 放在 video 下方
  69.     if (v.parentNode) {
  70.         v.parentNode.insertBefore(wrap, v.nextSibling);
  71.     }
  72.     v.dataset.downloadAdded = "1";
  73. };
  74. // ------------------- 获取视频地址 -------------------
  75. const getVideoURL = v => {
  76.     const realSrc =
  77.         v.getAttribute('data-src') ||
  78.         v.getAttribute('src') ||
  79.         v.currentSrc;
  80.     if (!realSrc || realSrc.startsWith('data:')) {
  81.         return null;
  82.     }
  83.     return realSrc;
  84. };
  85. // ------------------- 初始化已有视频 -------------------
  86. document.querySelectorAll("video").forEach(v => {
  87.     const realSrc = getVideoURL(v);
  88.     if (realSrc) {
  89.         addDownloadButton(v, realSrc);
  90.     }
  91. });
  92. // ------------------- 动态新增视频节点 -------------------
  93. new MutationObserver(ms => {
  94.     ms.forEach(m => {
  95.         m.addedNodes.forEach(n => {
  96.             if (n.tagName === "VIDEO") {
  97.                 const realSrc = getVideoURL(n);
  98.                 if (realSrc) {
  99.                     addDownloadButton(n, realSrc);
  100.                 }
  101.             }
  102.             if (n.querySelectorAll) {
  103.                 n.querySelectorAll("video").forEach(v => {
  104.                     const realSrc = getVideoURL(v);
  105.                     if (realSrc) {
  106.                         addDownloadButton(v, realSrc);
  107.                     }
  108.                 });
  109.             }
  110.         });
  111.     });
  112. }).observe(document.documentElement, {
  113.     childList: true,
  114.     subtree: true
  115. });
  116. })();
複製代碼



PS:

已有脚本扩展(比如Tampermonkey/Stay/wBlock等)或带脚本功能的第三方浏览器的大佬们,
可以直接复制源码(记得手动在首行行首加// ,不知为啥被吃掉了), 就不用操作捷径和文件了.
选Userscripts因为免费开源无内购+纯脚本(可惜不带编辑器功能).


[ 此貼由蓝莓山药重新編輯:2026-09-11 13:11 ]

赞(67)
DMCA / ABUSE REPORT | TOP Posted: 09-09 23:11 發表評論
.:. 草榴社區 » 技術討論區

電腦版 手機版 客戶端 DMCA
用時 0.02(s) x3, 10-12 10:12