iT邦幫忙

0

前端小試身手(10)--lurl圖床之自動帶入密碼

  • 分享至 

  • xImage
  •  

目錄

前端小試身手(1)--幫「發問/發文頁」新增"編輯"鈕~
前端小試身手(2)--it幫跳轉到最佳解答
前端小試身手(3)--增添系列文目錄
前端小試身手(4)--it幫發文「一眼全覽」
前端小試身手(5)-備份it幫的發問!
前端小試身手(6)--IMG複製大師,懶人專用小腳本
前端小試身手(7)--迷片靜音神隊友,讓你尷尬不再有!
前端小試身手(8)--教你寫出「思想審查警衛」,過濾垃圾雜訊的利器!
前端小試身手(9)--文章縮圖預覽(以codeLove論壇為例)

前情提要

如果有人有在使用D卡西斯版,那麼會發現大多數人,
選擇上傳圖片或影片都是使用lurl,
因為通常都會加密碼,
如果一次要看很多張圖或影片,非常麻煩,影片甚至不能直接下載,更麻煩。

因此我寫了一個外掛腳本,來自動套入Lurl的密碼(大家幾乎都是設定當天日期),
另外也提供了下載按鈕讓各位可以自行下載。
其他功能就不特別提了,有興趣自己看。

腳本連結在此:https://reurl.cc/edLk4b

效果

JS腳本程式碼

// ==UserScript==
// @name         暴力破解lurl密碼(使用日期)
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://lurl.cc/*
// @match        https://www.dcard.tw/f/sex/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=lurl.cc
// @grant        none
// ==/UserScript==

// 獲取當前頁面的網址
var currentUrl = window.location.href;

// 檢查網址是否以 'https://www.dcard.tw/f/sex/' 開頭
if (currentUrl.startsWith('https://www.dcard.tw/f/sex/')) {
  DcardEvent();
}else {
    LurlEvent();
}


function DcardEvent(){



// 找到頁面上的所有 <a> 元素
var links = document.querySelectorAll('a');

// 遍歷所有 <a> 元素
for (var i = 0; i < links.length; i++) {
    var link = links[i];

    // 註冊點擊事件
    link.addEventListener('click', function (event) {
        // 獲取被點擊的 <a> 元素的 href 屬性
        var href = event.currentTarget.getAttribute('href');

        // 檢查 href 屬性是否以 'https://lurl.cc/' 開頭
        if (href && href.startsWith('https://lurl.cc/')) {
            event.preventDefault(); // 阻止連結的默認操作

            var WebTitle = document.title;
            // 在這裡執行你的自定義事件 XYZ
            console.log('點擊了連結並觸發 XYZ 事件');
               window.open(href + '?title=' + encodeURIComponent(WebTitle), '_blank');
        }
    });
}


}



function LurlEvent(){



    let queryString = window.location.search;
    let urlParams = new URLSearchParams(queryString);
    let pageTitle = urlParams.get('title');


function downloadURI(uri, name) {
   fetch(uri).then((response) => response.blob())
   .then((blobresp) => {
       var blob = new Blob([blobresp], {type: "octet/stream"});
       var url = window.URL.createObjectURL(blob);

       var link = document.createElement("a");
       link.download = name;
       link.href = url;
       document.body.appendChild(link);
       link.click();
       document.body.removeChild(link);
       delete link;
   })
}

function DownloadBtn(){
let TureUrl=document.querySelector('source').src


// 創建一個<a>元素
var link = document.createElement('a');
link.setAttribute('class', 'btn btn-primary');
link.setAttribute('style', 'color: white; float: right;');
link.setAttribute('href', TureUrl); // 在這裡設定x的值
link.setAttribute('download', pageTitle + ".mp4"); // 在這裡設定檔案名稱

// 設定<a>元素的文本內容
link.innerText = '下載影片';

// 找到要插入的<h2>元素
var h2Element = document.querySelector('h2');

// 插入<a>元素到<h2>元素的內部
h2Element.appendChild(link);

link.addEventListener('click',function(e){
    e.preventDefault();

    let fileUrl=e.target.href;
    let fileName=e.target.download;

    downloadURI(fileUrl, fileName);

})

}


window.addEventListener('load', function(){
     var videoElement = document.querySelector('video');


    if (videoElement) {
        // 如果頁面包含<video>元素
        DownloadBtn();
    } else {
        console.log('頁面不包含<video>元素');
    }
});



// 从当前页面的URL中提取特定部分来构建Cookie名称


let cookieName=getCookieNameFromURL()

// 获取当前的psc_t2Ic0 Cookie值
function getPscCookieValue() {
  var cookies = document.cookie.split('; ');
  for (var i = 0; i < cookies.length; i++) {
    var cookie = cookies[i].split('=');
    if (cookie[0] === cookieName) {
      return cookie[1];
    }
  }
  return null;
}

var stopCondition = "成功";

function checkStopCondition() {
  var stopElement = document.querySelector("#back_top > div.container.NEWii_con > section:nth-child(6) > div > div > h2 > span");
  return stopElement.textContent.includes(stopCondition);
}

function padZero(number) {
  return (number < 10 ? '0' : '') + number;
}

function simulateCookieModification() {
  var currentCookieValue = getPscCookieValue();

  if (!checkStopCondition()) {
    // 确保当前Cookie值存在且是数字
    if (currentCookieValue !== null && !isNaN(parseInt(currentCookieValue))) {
      var currentValue = parseInt(currentCookieValue);

      // 增加日期
      if (currentValue >= 101 && currentValue <= 1231) {
        currentValue++; // 增加一天
        if (currentValue % 100 > 31) {
          currentValue = (Math.floor(currentValue / 100) + 1) * 100 + 1; // 下一个月的第一天
        }

        // 更新Cookie值并添加零
        var paddedValue = padZero(currentValue);
        document.cookie = cookieName + "=" + paddedValue;
        console.log("目前进度: " + paddedValue);

        // 设置定时器,在1秒后刷新页面
        setTimeout(function() {
          location.reload();
        }, 1000);
      }
    }
  } else {
    console.log("已停止循环,找到符合条件的内容");
  }
}

function getCookieNameFromURL() {
  var url = window.location.href;
  var match = url.match(/https:\/\/lurl.cc\/(\w+)/);
  if (match && match[1]) {
    return "psc_" + match[1];
  }
  return null;
}


function tryToday(){


// 获取包含日期信息的文本
var dateText = document.querySelector("#form_password > div:nth-child(9) > div > span").textContent;

// 使用正则表达式匹配日期部分(yyyy-mm-dd hh:mm:ss)
var datePattern = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var match = dateText.match(datePattern);

if (match) {
  // 提取月份和日期部分
  var year = match[1];
  var month = match[2];
  var day = match[3];

  // 将月份和日期部分组合成 "mmdd" 格式
  var formattedDate = month + day;

  console.log("提取的日期部分:" + formattedDate);
} else {
  console.log("未找到日期信息。");
}

 document.cookie = cookieName + "=" + formattedDate;


location.reload()
}

    tryToday()

}

注意!等待,請使用window.addEventListener('load', function()

為什麼會出現bug就是因為window.onload或是document.onload
甚至是ready都不符合我們的需求!

要等頁面跑完,
是使用他媽的監聽事件的:load!

window.addEventListener('load', function(){

//請使用這串
//程式碼放在這邊執行

})


這個文章提供了兩招,但都沒用,完全沒有寫到addEvent的load
是一個大地雷,要非常注意!

確認影片名字

當點連結的時候
直接抓取網頁title 並確定去除不合法符號 複製起來
然後呢再當作檔案名稱
最後復原剪貼簿內容

視窗彈出 使用sweet alert

通知已經下載中
然後按鈕disable十秒內不能再按 也許加入等待動畫特效

下載原理

文章來源

function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    // If you don't know the name or want to use
    // the webserver default set name = ''
    link.setAttribute('download', name);
    link.href = uri;
    document.body.appendChild(link);
    link.click();
    link.remove();
}

傳送D卡標題當名字


// 獲取當前頁面的網址
var currentUrl = window.location.href;

// 檢查網址是否以 'https://www.dcard.tw/f/sex/' 開頭
if (currentUrl.startsWith('https://www.dcard.tw/f/sex/')) {
  
  DcardEvent()
  
}


function DcardEvent(){



// 找到頁面上的所有 <a> 元素
var links = document.querySelectorAll('a');

// 遍歷所有 <a> 元素
for (var i = 0; i < links.length; i++) {
    var link = links[i];

    // 註冊點擊事件
    link.addEventListener('click', function (event) {
        // 獲取被點擊的 <a> 元素的 href 屬性
        var href = event.currentTarget.getAttribute('href');

        // 檢查 href 屬性是否以 'https://lurl.cc/' 開頭
        if (href && href.startsWith('https://lurl.cc/')) {
            event.preventDefault(); // 阻止連結的默認操作

            var WebTitle = document.title;
            // 在這裡執行你的自定義事件 XYZ
            console.log('點擊了連結並觸發 XYZ 事件');
               window.open(href + '?title=' + encodeURIComponent(WebTitle), '_blank');
        }
    });
}


}
    

重新設定撥放器


function Newplayer(){
let TureUrl=document.querySelector('source').src

// 取得現有的 video 元素
var existingVideo = document.querySelector('video');

// 創建新的 video 元素
var newVideo = document.createElement('video');

// 設定新 video 元素的屬性和特性
newVideo.src = TureUrl; // 設定新 video 的來源
newVideo.controls = true; // 新 video 加入控制選項
newVideo.autoplay = true; // 如有需要,啟用自動播放
newVideo.width = 640; // 設定新 video 的寬度
newVideo.height = 360; // 設定新 video 的高度
newVideo.preload = 'metadata'; // 設定 preload 屬性為 'metadata'
newVideo.classList.add('vjs-tech'); // 添加 class 屬性
newVideo.setAttribute('data-setup', '{"aspectRatio":"16:9"}'); // 設定 data-setup 屬性
newVideo.id = 'vjs_video_3_html5_api'; // 設定 id 屬性
newVideo.tabIndex = -1; // 設定 tabindex 屬性
newVideo.setAttribute('role', 'application'); // 設定 role 屬性

// 用新的 video 元素替換現有的 video 元素
existingVideo.parentNode.replaceChild(newVideo, existingVideo);



// 获取具有 id 为 vjs_video_3 的 div 元素
var videoContainer = document.getElementById('vjs_video_3');

// 移除 oncontextmenu 和 controlslist 属性
videoContainer.removeAttribute('oncontextmenu');
videoContainer.removeAttribute('controlslist');


// 获取所有具有 class 为 vjs-control-bar 的元素
var controlBars = document.querySelectorAll('.vjs-control-bar');

// 遍历所有匹配的元素并删除它们
controlBars.forEach(function(controlBar) {
    controlBar.parentNode.removeChild(controlBar);
});
}

toast套件使用

https://ithelp.ithome.com.tw/upload/images/20231018/20134378QeGQUv32Ck.png

示範頁面點這

簡單好用欸!基本上也可以自己設定其他class,方便做CSS。

boostrap的toast

https://ithelp.ithome.com.tw/upload/images/20231018/2013437887wsTN2wEx.png
效果普通,後來不採用。

原生的自己寫w3cschool

https://ithelp.ithome.com.tw/upload/images/20231018/20134378ldhU4Uf33S.png

教學點這邊

沒想到真的是寶藏網站,sanakbar這東西真有趣,動手玩創意可以考慮來練習這個!
超級實用的呀!
我以為我已經做完有趣的小東西了,沒想到應該還有遺失XD
太讚惹。

solid toast

效果超強各種樣式,已經寫好一堆模板了,似乎也可以找CDN來實作。

官方網站
https://ithelp.ithome.com.tw/upload/images/20231018/20134378L5gVXBm5wk.png

video套件 (沒有使用但滿cool的)

https://ithelp.ithome.com.tw/upload/images/20231018/20134378HQVxfqpbgT.png

官網點這邊

備註廢話:

事實上我已經寫出暴力破解,原理是把365天的日期都套進去跑,
不過我看lurl最多的保存期限也只有一個月,
也就是說沒必要跑一年,另外,大家通常也都不會亂設定密碼,
都是用日期。

如果是設定那種1111或1234那也我懶得去解。
啊。反正就套用上傳日期,不是的話,那基本上就算惹吧!(´・ω・)つ

心得筆記

不知道為啥有一段code不能發 IT幫這邊一直說是禁止字元 反正不重要
這次的腳本技術含量也很深刻呢
需要直接把人家video的元素都直接換掉 也有使用一些cookie的技術真的挺cool
沒想到小試身手這麼快就來到第十篇!越來越刺激了各位夥伴XD

讓我們一起走到老學到老ㄅ!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言