您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button that gives you a .m3u8 file for a stream on Twitch or Hitbox.
当前为
// ==UserScript== // @name Stream URL grabber // @description Adds a button that gives you a .m3u8 file for a stream on Twitch or Hitbox. // @include *://www.twitch.tv/* // @include *://m.twitch.tv/* // @include *://www.m.twitch.tv/* // @include *://player.twitch.tv/* // @include *://www.player.twitch.tv/* // @include *://www.hitbox.tv/* // @include *://api.twitch.tv/*?grabber // @include *://api.twitch.tv/*&grabber // @namespace https://greasyfork.org/users/3167 // @run-at document-load // @grant none // @version 5 // ==/UserScript== console.log("Loading streamgrabber..."); if (window.top != window.self) { //don't run on frames or iframes console.log("Skipping frame/iframe..."); return; } var host = window.location.host; function downloadm3u8(link, filename) { document.body.innerHTML = 'Link: '; var fileNameToSaveAs = filename + '.m3u8'; var downloadLink = document.createElement("a"); downloadLink.download = fileNameToSaveAs; downloadLink.innerHTML = fileNameToSaveAs; downloadLink.href = link; document.body.innerHTML = document.body.innerHTML + '<br>'; document.body.appendChild(downloadLink); setTimeout(function() { downloadLink.click(); setTimeout(function() { //window.close(); }, 1000); }, 1000); } if (document.URL.split("grabber").length > 1) { console.log("Grab command detected..."); if (host == "api.twitch.tv" || host == "www.api.twitch.tv") { //var text = document.body.textContent; var text = document.body.innerText; if (document.body.children.length>0) { text = document.body.children[0].innerText; } var json = JSON.parse(text); var user = document.URL.split("api.twitch.tv/api/channels/")[1].split("/")[0]; var token = json['token'] || ''; var signature = json['sig'] || ''; var randomp = Math.round(Math.random() * 9999999); var url = 'http://usher.twitch.tv/api/channel/hls/' + user + '.m3u8?player=twitchweb&&token=' + token + '&sig=' + signature + '&allow_audio_only=true&allow_source=true&type=any&p=' + randomp; console.log("Encoding url..."); var urle = encodeURI(url); console.log(urle); downloadm3u8(urle, user); console.log("Stream grabbed on: " + host); } //return; } else { var hook = function(retries) { console.log("Hooking... Retries left: " + retries); var loaded = false; if (retries > 0) { retries--; if (host == "www.twitch.tv") { var div = document.querySelectorAll('.channel-actions')[0]; if (div == null) { div = document.querySelectorAll('.cn-metabar__more')[0]; } if (div == null) { setTimeout(function() { hook(retries); }, 1000); return; } else { //do var user = document.URL.split("twitch.tv/")[1].split("/")[0]; var clientid = "rp5xf0lwwskmtt1nyuee68mgd0hthrw"; var tokenurl = location.protocol + '//api.twitch.tv/api/channels/' + user + '/access_token?client_id=' + clientid + '&grabber'; var isvideo = document.URL.split("/v/")[1]; if (isvideo != undefined) { tokenurl = location.protocol + '//player.twitch.tv/?!branding&!channelInfo&video=v' + isvideo + '&client_id=' + clientid + '&grabber'; } var clickaction = "window.open('" + tokenurl + "');"; var newspan = document.createElement("span"); newspan.innerHTML = '<div class="js-share-box balloon-wrapper inline-block"><span class="qa-share-box__button share-box__button button button--hollow mg-l-1" onclick="' + clickaction + '" style="cursor:pointer;">Grab stream link</span></div>'; div.appendChild(newspan); console.log("Stream link: " + tokenurl); loaded = true; } } if (host == "www.hitbox.tv") { var div = document.querySelectorAll('.status')[0]; if (div == null) { setTimeout(function() { hook(retries); }, 1000); return } else { //do var user = document.URL.split("hitbox.tv/")[1].split("/")[0]; var url = location.protocol + '//api.hitbox.tv/player/hls/' + user + '.m3u8'; var clickaction = "window.open('" + url + "');"; var newspan = document.createElement("span"); newspan.innerHTML = '<span onclick="' + clickaction + '" style="cursor:pointer;"> Grab stream link</span>'; div.appendChild(newspan); console.log("Stream link: " + url); loaded = true; } } } if (loaded) { console.log("Stream grabber loaded on host: " + host); } else { console.log("Something went wrong when loading on host: " + host); } }; //console.log("Attempting hooks..."); var retries = 3; setTimeout(function() { hook(retries); }, 1000); }