Post Action

将当前页面的网址发送到指定的服务器,服务器地址信息需要再代码中修改以适合自己使用!

  1. // ==UserScript==
  2. // @name Post Action
  3. // @namespace https://github.com/RANSAA
  4. // @version 0.0.6
  5. // @description 将当前页面的网址发送到指定的服务器,服务器地址信息需要再代码中修改以适合自己使用!
  6. // @author sayaDev
  7. // @license MIT License
  8. // @icon data:image/png;base64,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
  9.  
  10. // @match http://*/*
  11. // @match *://*/*
  12.  
  13. // @require https://update.greasyfork.org/scripts/494214/1432041/TKBaseSDK.js
  14.  
  15. // @grant unsafeWindow
  16. // @grant GM_openInTab
  17. // @grant GM_xmlhttpRequest
  18.  
  19.  
  20. // @connect self //添加需要跨域不弹出用户选择页面的标注
  21. // @connect localhost
  22. // @connect 127.0.0.1
  23. // @connect *
  24.  
  25.  
  26. // @compatible chrome
  27. // @compatible edge
  28. // @compatible firefox
  29. // @compatible opera
  30. // @compatible safari
  31.  
  32.  
  33. // @noframes
  34. // ==/UserScript==
  35. /**
  36. * 目前支持的参数:
  37. * url: 当前页面网址
  38. * title:当前页面标题
  39. * four_color_av_m3u8:四色AV中的m3u8视频地址
  40. **/
  41.  
  42.  
  43.  
  44.  
  45. /**
  46. * 配置信息,可更具需求更改配置
  47. **/
  48. const SERVER_CONFIG = {
  49. host: "127.0.0.1", //服务器地址
  50. port: "80", //服务器端口,直接使用”“不指定端口
  51. method: "POST", //请求方式
  52. scheme: "http", //协议类型
  53. taskAdd: "task/add", //yt-dlp 任务添加API Query Path路劲地址
  54. };
  55.  
  56.  
  57.  
  58. /**
  59. * 将参数组装成JSON格式
  60. * 获取当前需要的所有属性
  61. * url:当前页面的url地址
  62. * title:当前网页的标题
  63. * four_color_av_m3u8:四色AV中播放页面中的m3u8链接--值为可选
  64. **/
  65. function loadParameterJSON(){
  66. // //示例
  67. // var json = {
  68. // jsonrpc:'2.0',
  69. // method:'aria2.addUri',
  70. // id:url,
  71. // params:[
  72. // [url],
  73. // ]
  74. // }
  75. // return JSON.stringify(json)
  76.  
  77.  
  78. //当前网页地址
  79. let url = window.location.href;
  80. //当前网页标题
  81. let title = document.title;
  82. //四色AV中的m3u8链接
  83. let four_color_av_m3u8 = getFourColorAVM3u8Url();
  84.  
  85. let json = {
  86. "url": url,
  87. "title": title,
  88. "four_color_av_m3u8":four_color_av_m3u8
  89. };
  90. return JSON.stringify(json)
  91. }
  92.  
  93.  
  94.  
  95. (function() {
  96. 'use strict';
  97. TKBaseSDK.initToast();
  98. addSendServerButton();
  99. })();
  100.  
  101.  
  102.  
  103.  
  104. // -------------------------------Setup UI-------------------------------
  105. function addSendServerButton(){
  106. //添加style
  107. TKBaseSDK.addButtonStyle();
  108.  
  109. //创建Send URL按钮
  110. let sendURL = TKBaseSDK.createListItemButton("Send URL");
  111. //定义的是事件被触发后要做的事情
  112. sendURL.addEventListener("click", function() {
  113. sendLocationURL();
  114. });
  115.  
  116. //创建Copy URL按钮
  117. let copyURL = TKBaseSDK.createListItemButton("Copy URL");
  118. //定义的是事件被触发后要做的事情
  119. copyURL.addEventListener("click", function() {
  120. copyLocationURL();
  121. });
  122.  
  123. //创建Copy M3u8按钮
  124. let copyM3u8 = TKBaseSDK.createListItemButton("Copy M3U8");
  125. //定义的是事件被触发后要做的事情
  126. copyM3u8.addEventListener("click", function() {
  127. copyM3u8Link();
  128. });
  129.  
  130. //创建Copy yt-dlp-n按钮
  131. let copyYtDlpN = TKBaseSDK.createListItemButton("Copy yt-dlp-n");
  132. //定义的是事件被触发后要做的事情
  133. copyYtDlpN.addEventListener("click", function() {
  134. copyYtDlpM3u8Link();
  135. });
  136.  
  137. //创建Copy yt-dlp按钮
  138. let copyYtDlp = TKBaseSDK.createListItemButton("Copy yt-dlp");
  139. //定义的是事件被触发后要做的事情
  140. copyYtDlp.addEventListener("click", function() {
  141. copyYtDlpLocationLink();
  142. });
  143.  
  144.  
  145. //创建Copy Magnet按钮
  146. let copyMagnet = TKBaseSDK.createListItemButton("Copy Magnet");
  147. copyMagnet.addEventListener("click", function() {
  148. copyMagnetLinks();
  149. });
  150.  
  151.  
  152.  
  153. let list = document.createElement("TKButtonList");
  154. list.className = "TKButtonListStyle";
  155. list.appendChild(sendURL);
  156. //list.appendChild(copyURL);
  157. list.appendChild(copyM3u8);
  158. list.appendChild(copyYtDlpN);
  159. list.appendChild(copyYtDlp);
  160. list.appendChild(copyMagnet);
  161. document.body.appendChild(list);
  162. }
  163.  
  164. // -------------------------------Setup UI-------------------------------
  165.  
  166.  
  167.  
  168. // -------------------------------Action-------------------------------
  169.  
  170. /**
  171. * 发送数据当前页面的URL到指定服务器
  172. */
  173. function sendLocationURL()
  174. {
  175. console.log(`Send Server`);
  176.  
  177. //服务器的地址
  178. var serverUrl = SERVER_CONFIG.scheme + "://" + SERVER_CONFIG.host + ":" + SERVER_CONFIG.port + "/" + SERVER_CONFIG.taskAdd;
  179. if (SERVER_CONFIG.port === "" ) {
  180. serverUrl = SERVER_CONFIG.scheme + "://" + SERVER_CONFIG.host + "/" + SERVER_CONFIG.taskAdd;
  181. }
  182.  
  183.  
  184. //发送的参数数据
  185. let data = loadParameterJSON();
  186. console.log(`serverUrl: ${serverUrl}`);
  187. console.log(`parameter: ${data}`);
  188.  
  189.  
  190. //GM_xmlhttpRequest方式请求
  191. GM_xmlhttpRequest({
  192. method: SERVER_CONFIG.method,
  193. url: serverUrl,
  194. headers: {
  195. 'Content-Type': 'application/json; charset=utf-8',
  196. },
  197. data: data,
  198. onload: function(response) {
  199. console.log(response);
  200. console.log(`readyState:${response.readyState}`);
  201. console.log(`status:${response.status}`);
  202. console.log(`statusText:${response.statusText}`);
  203. console.log(`responseHeaders:\n${response.responseHeaders}`);
  204. console.log(`responseText:${response.responseText}`);
  205. if (response.status === 200) {
  206. console.log(`Send URL Success: ${url}`);
  207. TKBaseSDK.showToast("当前URL地址发送成功!",1);
  208. } else {
  209. console.log(`Send URL Error: ${url} statusText: ${response.statusText}`);
  210. TKBaseSDK.showToast("当前URL地址发送失败!",0);
  211. }
  212. },
  213. onerror: function(response) {
  214. // 请求发生错误时执行
  215. console.error("Request failed:", response);
  216. let msg = `发送失败,Send Server服务地址:${response.finalUrl}`;
  217. console.log(msg);
  218. TKBaseSDK.showToastWtihTime(msg, 0, 4000);
  219. }
  220. });
  221. }
  222.  
  223. /**
  224. * 拷贝当前网页地址
  225. **/
  226. function copyLocationURL(){
  227. //当前网页地址
  228. let url = window.location.href;
  229. TKBaseSDK.copyToClipBoard(url);
  230. TKBaseSDK.showToast("复制成功!",1);
  231. }
  232.  
  233.  
  234. /**
  235. * 获取并拷贝m3u8链接
  236. **/
  237. function copyM3u8Link(){
  238. let m3u8Url = getFourColorAVM3u8Url();
  239. if (m3u8Url === "") {
  240. TKBaseSDK.showToast("复制失败,没有找到M3U8链接!",0);
  241. TKBaseSDK.copyToClipBoard("");
  242. }else{
  243. TKBaseSDK.showToast("复制成功!",1);
  244. //拷贝到剪切板
  245. TKBaseSDK.copyToClipBoard(m3u8Url);
  246. }
  247. }
  248.  
  249. /**
  250. * 获取四色AV中的m3u8链接地址
  251. **/
  252. function getFourColorAVM3u8Url(){
  253. // Define a regular expression to match the playUrl variable pattern
  254. const playUrlPattern = /var playUrl\s*=\s*"([^"]+)"/;
  255.  
  256. // Get all script tags on the page
  257. const scripts = Array.from(document.getElementsByTagName('script'));
  258.  
  259. // Look for the script containing the playUrl variable
  260. const matchedScript = scripts.find(script => playUrlPattern.test(script.textContent));
  261.  
  262. var m3u8Url = ""
  263.  
  264. // If found, extract the URL
  265. if (matchedScript) {
  266. const match = matchedScript.textContent.match(playUrlPattern);
  267. m3u8Url = match && match[1];
  268. console.log('四色AV站点:m3u8 URL:', m3u8Url);
  269. } else {
  270. console.warn('四色AV站点:m3u8 URL could not be found.');
  271. }
  272.  
  273. return m3u8Url
  274. }
  275.  
  276.  
  277.  
  278. /**
  279. * 获取四色AV中视频的标题
  280. **/
  281. function getFourColorAVTitle(){
  282. var title = ""
  283.  
  284. // 获取包含 h1 元素的 div.main 元素
  285. const mainDiv = document.querySelector('.wrap > .main');
  286. // 确认 main 元素存在
  287. if (mainDiv) {
  288. // 在 mainDiv 内查找 h1 元素
  289. const h1Element = mainDiv.querySelector('h1');
  290.  
  291. // 确认 h1 元素存在
  292. if (h1Element) {
  293. // 获取 h1 元素的文本内容
  294. const h1Content = h1Element.textContent.trim();
  295. console.log('四色AV站点:查找h1 内容为:', h1Content);
  296. title = h1Content
  297. } else {
  298. console.warn('四色AV站点:查找视频标题时未找到 h1 元素!');
  299. // title = "test---222"
  300. }
  301. } else {
  302. console.warn('四色AV站点:查找视频标题时未找到 .main 元素!');
  303. // title = "test-333"
  304. }
  305.  
  306. return title
  307. }
  308.  
  309.  
  310. /**
  311. * 拷贝四色AV中的标题与m3u8链接,并且组装yt-dlp-n命令
  312. * 格式: yt-dlp-n "视频标题" "m3u8视频地址"
  313. **/
  314. function copyYtDlpM3u8Link(){
  315. // let m3u8Url = getFourColorAVM3u8Url();
  316. // let title = getFourColorAVTitle();
  317. let m3u8Url = filterVideoLink();
  318. let title = filterVideoTitle();
  319.  
  320. if (m3u8Url === "" || title === "") {
  321. TKBaseSDK.showToast("yt-dlp-n下载命令复制失败,没有找到视频链接!",0);
  322. TKBaseSDK.copyToClipBoard("");
  323. }else{
  324. TKBaseSDK.showToast("yt-dlp-n下载命令复制成功!",1);
  325.  
  326. //拷贝到剪切板
  327. let cmd = "yt-dlp-n " + "\"" + title + "\"" + " \"" + m3u8Url + "\"" + "\n\n";
  328. TKBaseSDK.copyToClipBoard(cmd);
  329. }
  330. }
  331.  
  332.  
  333. /**
  334. * 过滤获取当前视频指定的名称
  335. **/
  336. function filterVideoTitle(){
  337. //默认获取四色AV中视频的标题
  338. var title = getFourColorAVTitle();
  339. //获取当前站点的域名
  340. let hostname = document.location.hostname
  341. //当前网站路径
  342. let pathname = document.location.pathname
  343.  
  344. //所有直接以网页标题作为title的域名集合
  345. const titleSet = new Set([
  346. "beeg.com",
  347. ]);
  348. if (pathname != "/") { //不是网站的主页才可以获取视频的标题
  349. if ( titleSet.has(hostname) ) {
  350. title = document.title;
  351. }
  352. }
  353.  
  354.  
  355. // 处理文件名中的特殊字符
  356. title = sanitizeFileName(title);
  357.  
  358. return title
  359. }
  360.  
  361.  
  362. /**
  363. * 过滤获取视频的指定链接
  364. **/
  365. function filterVideoLink(){
  366. //默认获取四色AV中视频的m3u8链接
  367. var videoURL = getFourColorAVM3u8Url();
  368. if (videoURL === "") {
  369. TKBaseSDK.showToast("没有找到M3U8链接,直接使用当前网页地址作为视频链接!",0);
  370. videoURL = document.location.href;
  371. }
  372. return videoURL
  373. }
  374.  
  375.  
  376.  
  377.  
  378.  
  379. /**
  380. * 拷贝当前网页链接, 并组装yt-dlp命令
  381. * 格式:yt-dlp "网页地址"
  382. **/
  383. function copyYtDlpLocationLink(){
  384. let url = window.location.href;
  385.  
  386. TKBaseSDK.showToast("yt-dlp下载命令复制成功!",1);
  387. //拷贝到剪切板
  388. let cmd = "yt-dlp " + "\"" + url + "\"" + "\n\n";
  389. TKBaseSDK.copyToClipBoard(cmd);
  390.  
  391. }
  392.  
  393.  
  394.  
  395. /**
  396. * 功能:拷贝当前页面的所有magnet磁力链接
  397. **/
  398. function copyMagnetLinks(){
  399. const magnetLinks = getMagnetLinks();
  400. // 转换成换行分隔的字符串
  401. const magnetLinksString = magnetLinks.join('\n');
  402. if (magnetLinksString === "" ) {
  403. TKBaseSDK.showToast("Copy Mangnet失败,没有找到磁力链接!",0);
  404. TKBaseSDK.copyToClipBoard("");
  405. }else{
  406. TKBaseSDK.showToast("Copy Mangnet成功!",1);
  407. //拷贝到剪切板
  408. TKBaseSDK.copyToClipBoard(magnetLinksString);
  409. }
  410. }
  411.  
  412.  
  413. /**
  414. * 获取页面中的所有magnet磁力链接
  415. **/
  416. function getMagnetLinks(){
  417. // 从整个 HTML 文档中提取磁力链接
  418. const htmlContent = document.documentElement.innerHTML;
  419. const magnetRegex = /magnet:\?xt=urn:[a-zA-Z0-9:]+/g;
  420. const magnetLinks = Array.from(new Set(htmlContent.match(magnetRegex) || []));
  421. console.log(magnetLinks);
  422. return magnetLinks;
  423. }
  424.  
  425.  
  426.  
  427. /**
  428. * 功能:将字符串中不能作为文件名的字符替换成"_",并且如果存在英文的双引号"替换成英文的单引号'
  429. * replace(/"/g, '“'); //正则表达式
  430. * replaceAll('"', '“'); //直接替换函数
  431. **/
  432. function sanitizeFileName(filename) {
  433. //使用正则表达式将"替换成'
  434. var name = filename;
  435. name = name.replace(/"/g, "'"); //注意:这儿使用的正则表达式无法将"替换成',然后再调用这个函数的外部直接对字符串操作又可以,不知道是什么原因。所以直接使用replaceAll方法进行替换。
  436. name = name.replaceAll('"', "'");
  437. name = name.replaceAll(':', ":");
  438. name = name.replaceAll('”', "'");
  439.  
  440. //将不能作为文件名的字符替换为:_
  441. name = name.replace(/[:]+/g, '_'); // -osx
  442. // name = name.replace(/[\/\\:*?"<>|]+/g, '_'); // win
  443.  
  444. return name
  445. }
  446.  
  447.  
  448.  
  449. /**
  450. * 功能:将字符串中不能作为路径的字符替换成”_“
  451. **/
  452. function sanitizePath(path) {
  453. return path.replace(/[\/\\:*?"<>|]+/g, '_'); // 替换为单个下划线
  454. }
  455.  
  456.  
  457.  
  458. // -------------------------------Action-------------------------------
  459.