虎牙Plus

虎牙自动领取任务经验、开宝箱,复制直播流链接,简化页面,去广告

目前为 2020-05-04 提交的版本。查看 最新版本

  1. 'use strict';
  2. // ==UserScript==
  3. // @name 虎牙Plus
  4. // @namespace http://tampermonkey.net/
  5. // @icon https://www.google.com/s2/favicons?domain=huya.com
  6. // @version 0.2.4
  7. // @description 虎牙自动领取任务经验、开宝箱,复制直播流链接,简化页面,去广告
  8. // @author Francis
  9. // @match *://*.huya.com/*
  10. // @grant GM_setClipboard
  11. // ==/UserScript==
  12.  
  13. let $;
  14.  
  15. function addUi(){
  16. let style = document.createElement('style');
  17. style.appendChild(document.createTextNode(`
  18. span.copy-stream-link:after {
  19. display: block;
  20. position: absolute;
  21. content: "";
  22. right: -20px;
  23. top: 6px;
  24. width: 18px;
  25. height: 18px;
  26. overflow: hidden;
  27. background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA4RpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0YjMyYjVhNy1jMThjLTg2NDItYjRlMy04NzdmMjFiZjkzZTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MEJCNDhFNEIxMDZBMTFFN0IzQUNGNTM3RTZBMjEyRTQiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MEJCNDhFNEExMDZBMTFFN0IzQUNGNTM3RTZBMjEyRTQiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MmFlNTQ3NDgtZjlmZS04NjQwLTg0ZTgtMmY4ZTcwYjc2YTkyIiBzdFJlZjpkb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6NWE5YjI1YjQtZmE1ZC0xMWU2LWI1MmYtYWM2NWYxZGRlZjQ2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KzIZ1wAAAz9JREFUeNqslm1IU1EYx5/dzSW+pWVZppimzV7pzZWVIhGFZiIEgmFlREGmH4qEJOhFqEVf+tCXviiCZC/4Icga0ocwIyURcmnO2ZIyM9+auqnb1NnzXM5sm7u719wffrC7c+7zP+fc55zzyDQN+0BEMiQNOYYcQBKRCNZmQr4iH5A6pBGZ8xVM4aONQwqRMmbiTVEMGkgpM9cgVYhDKKg3xSPNSIUPM29KZO80sxiSDDOQj0gK/L9SWIx0McMjSD0SCUsXxXiDHBUyVCG1iBL8JyWLqfI0lCPVSCj4WWtDN4ekxp6uZh7zWXpmid9sYfpzSkhbfwHU6/JBJuNSekZbCn+bOysUbJ+V+dNsTYgKspNvQmRQPMw4bKDt0gCaXcOmSgXLpER/GMnwC+2NLYD09eeBkylganoMajuuQt94u3PLpJNhlj/MgpUrISf5FsSF7+GfLfZheKIrhpHJ767dsshwv1gwGm3YstUwav3ltT0ufDea3eZNSeO2ATQrAdNUr2fXVDJM8j3yFZC76Q6sCk6AZ58vQ7/5i1u7OuYkZMQX4aD4JASzbRBq2i7h4Pq8hdvIuRzECxQdugUKd1ZB7PIdEKgIg/ztD/nfzizMSS6HQwkl82a2GQs8b78iZEaKEDy8t0ZlQmZSGci5gH+7WB4EedseQH33fdgVfYIfkFPTDismSCkMTRhB7LYwsRPfTQOWLrDOmPkldVUAFwjZqhseveegTl8OvWOfxNLBREva7a1laOIb1OiK+GwTU0PPI+gafislmQ1k2CTUSilNCUBZJ6SOwXpo6q2WunuayPCVrx5/pn6gaRGMWfth4bIbQGu4K3bJu+o1Gb5jN7WgaP89bruI++rn/H+UkS86r+PRZZdqRh6NHBvePbHetKz0TWnGJK1B4zYACSIPh/zw2Rh60LEjLtrXG/bZSdBjclhsQ6AbeLkYs1akmCbnvA9nkVN0BIq9OWEfgZa+p4sxo5gFzMPtxtcjeTQRP95UdhZTL1TTaJFcKTOVOLNcFtNn1aZlt3/rEsxaWQyt1LqUlkCNnEOMizAysnfUrssotfKmyrmSVdEHkePs7tzgUeobWalPafteqOJ26q8AAwB8rQG0tt5ioQAAAABJRU5ErkJggg==);
  28. background-size: 18px 18px;
  29. }
  30.  
  31. span.copy-stream-link.copy-success:after {
  32. display: block;
  33. }
  34.  
  35. .huya-plus-btn{
  36. display: block;
  37. padding:0 10px;
  38. color:#FFF;
  39. background:#ffa801;
  40. border-radius:10px;
  41. margin-right: 30px;
  42. user-select: none;
  43. }
  44. `));
  45.  
  46. document.head.appendChild(style);
  47.  
  48. let copyStreamLinkNode = document.createElement('div');
  49. copyStreamLinkNode.style = "cursor: pointer;display:inline-flex;vertical-align:top;";
  50. const openWithPlayerBtn = isMacOS() ? `<span class="huya-plus-btn open-with-iina" style="position: relative;">使用IINA打开</span>`: `<span class="huya-plus-btn open-with-potplayer" style="position: relative;">使用PotPlayer打开</span>`;
  51. copyStreamLinkNode.innerHTML = `<span class="huya-plus-btn copy-stream-link" style="position: relative;">复制直播流</span>${openWithPlayerBtn}`;
  52. document.querySelector('.host-title').appendChild(copyStreamLinkNode);
  53.  
  54. document.querySelector('.copy-stream-link').onclick = e=>{
  55. GM_setClipboard(getStreamUrl());
  56. showCopySuccessIcon();
  57. };
  58.  
  59. $(".open-with-iina").click(()=>{
  60. openStreamWithIINA(getStreamUrl());
  61. });
  62.  
  63. $(".open-with-potplayer").click(()=>{
  64. openStreamWithPotPlayer(getStreamUrl());
  65. });
  66. }
  67.  
  68. function getStreamUrl(){
  69. let config = unsafeWindow.hyPlayerConfig;
  70. let info = config.stream.data[0].gameStreamInfoList[0]
  71. return `${info.sHlsUrl}/${info.sStreamName}.${info.sHlsUrlSuffix}?${info.sHlsAntiCode}`;
  72. }
  73.  
  74. function isMacOS(){
  75. var UserAgent = navigator.userAgent.toLowerCase();
  76. return /mac os/.test(UserAgent);
  77. }
  78.  
  79. function showCopySuccessIcon(){
  80. $('span.copy-stream-link').addClass('copy-success');
  81. setTimeout(()=>{$('span.copy-stream-link').removeClass('copy-success');},1000)
  82. }
  83.  
  84. function autoReceiveBoxReward(){
  85. let rewardBtns = $(".player-box-list .player-box-stat3").filter((i,it)=>$(it).css("visibility") === 'visible');
  86. if(rewardBtns.size() > 0){
  87. let btn = $(rewardBtns[0]);
  88. btn.click();
  89. let waitComplete = ()=>{
  90. if(btn.css("visibility") === 'hidden'){
  91. $("#player-box").hide();
  92. console.log("开启宝箱");
  93. autoReceiveBoxReward();
  94. } else {
  95. setTimeout(waitComplete,1000);
  96. }
  97. };
  98. setTimeout(waitComplete,1000);
  99. }
  100. }
  101.  
  102. function autoReceiveTaskXP(){
  103. let taskBtns = $(".tasks .status .status-get");
  104. if(taskBtns.size() > 0){
  105. $.each(taskBtns,(_,btn)=>{
  106. $(btn).click();
  107. });
  108. console.log(`自动领取经验,本次完成${taskBtns.length}个任务`)
  109. }
  110. }
  111.  
  112. function cleanPage(){
  113. $(".room-gg-chat").remove();
  114. $(".room-footer").remove();
  115. }
  116.  
  117. function completeChatTask(){
  118. const taskInfo = $(".tasks .tit").filter((i,it)=>$(it).text() === '在1场直播中发送弹幕');
  119. const taskDone = taskInfo.siblings(".status").find(".status-ing") === 0;
  120. if(!taskDone){
  121. chat('[送花]')
  122. }
  123. }
  124.  
  125. function chat(msg){
  126. $("#pub_msg_input").val(msg).keyup();
  127. $("#msg_send_bt").click();
  128. }
  129.  
  130. function pageLoaded(){
  131. $ = unsafeWindow.$
  132. if($){
  133. if($(".tasks .status").size() == 0){
  134. $(".nav-user-title").mouseenter()
  135. }
  136. return $(".box-icon-word").size() > 0 && $(".tasks .status").size() > 0
  137. }
  138. return false;
  139. }
  140.  
  141. function openStreamWithPotPlayer(streamUrl){
  142. openStreamWithPlayer("PotPlayer://", streamUrl);
  143. }
  144.  
  145. function openStreamWithIINA(streamUrl){
  146. openStreamWithPlayer("iina://weblink?url=", streamUrl)
  147. }
  148.  
  149. function openStreamWithPlayer(playerUrlSchema, streamUrl){
  150. window.open(`${playerUrlSchema}${streamUrl}`, "_self")
  151. }
  152.  
  153. async function waitLoad(){
  154. return new Promise(function(resolve,reject){
  155. let w = ()=>{
  156. if(pageLoaded()){
  157. resolve();
  158. } else {
  159. setTimeout(w,1000);
  160. }
  161. }
  162. w();
  163. });
  164. }
  165.  
  166. let timer;
  167. (async function() {
  168. let intervalInMills = 10 * 60 * 1000 + 100;
  169. let task = ()=>{
  170. autoReceiveBoxReward();
  171. autoReceiveTaskXP();
  172. };
  173. await waitLoad();
  174.  
  175. cleanPage();
  176. completeChatTask();
  177. addUi();
  178. task();
  179. if(timer) clearInterval(timer);
  180. timer = setInterval(task,intervalInMills);
  181. })();

QingJ © 2025

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