巨量下载

巨量广告视频下载

  1. // ==UserScript==
  2. // @name 巨量下载
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.2.4
  5. // @description 巨量广告视频下载
  6. // @author hayasol657
  7. // @run-at document-start
  8. // @license MIT License
  9. // @grant GM_download
  10. // @include *://cc.oceanengine.com/*
  11. // @inject-into page
  12. // @require https://gf.qytechs.cn/scripts/440006-mono/code/mono.js?version=1026867
  13. // ==/UserScript==
  14.  
  15. (function () {
  16. var mono = window['mono-descargar'];
  17. var failover = mono.FAIL_TO_DEFAULT;
  18. var $ = mono.jQuery;
  19. var md5 = mono.md5;
  20. var onRequest = mono.onRequest;
  21. var filename = mono.filename;
  22.  
  23. var metaCache = {};
  24. var metaDict = {};
  25. var metaMap = { materials: 'material', items: 'douyin' };
  26. onRequest(({url, resp}) => {
  27. if (!resp) return;
  28. if (url.indexOf(`creative_radar_api/v1/video/info`) !== -1) {
  29. var data = JSON.parse(resp).data
  30. if (Object.keys(data).length > 0) {
  31. metaCache = data;
  32. }
  33. return
  34. }
  35. for (const key of Object.keys(metaMap)) {
  36. var prefix = `creative_radar_api/v1/${metaMap[key]}`;
  37. if (!url.includes(`${prefix}/info`) &&
  38. !url.includes(`${prefix}/list`)) continue;
  39. var res = JSON.parse(resp);
  40. if (res?.data && typeof res.data === 'object' && 'vid' in res.data) {
  41. res.data = { [key]: [res.data] };
  42. }
  43. if (res?.data && typeof res.data === 'object' &&
  44. key in res.data && res.data[key].length > 0) {
  45. const feeds = res.data[key];
  46. for (var i = 0; i < feeds.length; i++) {
  47. const id = feeds[i].vid;
  48. if (metaDict[id]) continue;
  49. feeds[i].id = id;
  50. metaDict[id] = feeds[i];
  51. }
  52. }
  53. }
  54. });
  55.  
  56. var updateItems = async (items) => {
  57. if (items.length <= 0) return;
  58. return new Promise((resolve, reject) => {
  59. var videos = items.map((im) => {
  60. return {vid: im.meta.vid, mid: `${im.meta.material_id}`}
  61. })
  62. $.ajax({
  63. url: "https://cc.oceanengine.com/creative_radar_api/v1/video/info",
  64. type: 'POST',
  65. contentType: "application/json",
  66. data: JSON.stringify({ "video_infos": videos, "water_mark": 'ad' }),
  67. success: function (data) {
  68. if (data?.data && Object.keys(data?.data).length > 0) {
  69. items.forEach(item => {
  70. item.url = data.data[item.meta.material_id].video_url;
  71. item.meta.video = data.data[item.meta.material_id];
  72. item.meta.cover = data.data[item.meta.material_id].cover_url;
  73. item.meta.title = item.meta.bestTitle || item.meta.item_title;
  74. item.meta.name = filename(item.meta.title || document?.title);
  75. });
  76. }
  77. resolve(items)
  78. },
  79. error: function (error) {
  80. reject(error)
  81. },
  82. });
  83. });
  84. }
  85.  
  86. var getItemByMeta = (meta) => {
  87. if (!meta || !meta.id) return null;
  88. if ($(`[mono-dsg-id=${meta.id}]`).length > 0) return null;
  89. return { id: meta.id, url: "", meta };
  90. }
  91.  
  92. var detail = async (style) => {
  93. const mid = Object.keys(metaDict)[0];
  94. const realMid = Object.keys(metaCache)[0];
  95. const item = getItemByMeta(metaDict[mid])
  96. if (item) {
  97. item.meta.material_id = realMid;
  98. var $el = $(`.${style}`).find(".cc-video-player");
  99. if ($el.length > 0) {
  100. await updateItems([item]);
  101. if (!item.url) return []
  102. item.container = $el[0];
  103. item.mid = mid;
  104. return [item];
  105. }
  106. }
  107. return [];
  108. }
  109.  
  110. var list = async () => {
  111. const items = []
  112. for (const [id, meta] of Object.entries(metaDict)) {
  113. const imgUrl = new URL(meta.head_image_uri);
  114. const item = getItemByMeta(meta);
  115. if (item) {
  116. var $el = $(`.poster-image[style*='${imgUrl.pathname}']`).parent();
  117. if ($el.length > 0) {
  118. item.container = $el[0];
  119. item.mid = meta.material_id
  120. items.push(item);
  121. }
  122. }
  123. if (items.length >= 10) break;
  124. }
  125.  
  126. if (items.length > 0) {
  127. await updateItems(items);
  128. }
  129.  
  130. return items.filter(item => item.url);
  131. }
  132.  
  133. var parser = async function () {
  134. var url = new URL(window.location.href);
  135. var lists = [
  136. "/inspiration/creative-radar/video",
  137. "/inspiration/douyin/content"
  138. ];
  139. var ccdetail = "/inspiration/creative-radar/detail/";
  140. var dydetail = "/inspiration/douyin-detail/";
  141. if (lists.includes(url.pathname)) {
  142. return await list();
  143. } else if (url.pathname.indexOf(ccdetail) > -1) {
  144. return await detail('radar-detail-preview-box');
  145. } else if (url.pathname.indexOf(dydetail) > -1) {
  146. return await detail('creative-douyin-detail-info');
  147. } else {
  148. throw failover;
  149. }
  150. }
  151.  
  152. if (mono?.init) mono.init({ parser });
  153. })()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址