b站自动点赞投币

自动b站点赞投币

  1. // ==UserScript==
  2. // @name b站自动点赞投币
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1.0
  5. // @description 自动b站点赞投币
  6. // @author whiteGoose
  7. // @match https://www.bilibili.com/video/BV*
  8. // @match https://www.bilibili.com/bangumi/play/*
  9. // @icon http://www.bilibili.com/favicon.ico
  10. // @require https://code.jquery.com/jquery-3.7.1.min.js
  11. // @require https://cdn.jsdelivr.net/npm/sweetalert2@11.12.2/dist/sweetalert2.all.min.js
  12. // @license MIT
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @grant GM_deleteValue
  16. // @grant GM_listValues
  17. // ==/UserScript==
  18.  
  19. function GetUp() {
  20. let name = $(".up-avatar").attr("href");
  21. // console.log(name);
  22. if (name != undefined) {
  23. name = name.split("/")[3];
  24. return name;
  25. }
  26. }
  27. function init_config(){
  28. let config=GM_getValue("config",undefined)
  29. if(!config){
  30. GM_setValue("config",{"chase_auto_thumsup":true})
  31. config=GM_getValue("config",undefined)
  32. }
  33. let bangumi_md;
  34. let video_type=bv.videoType;
  35. if(video_type=="bangumi"){
  36. bangumi_md=get_bangumi()
  37. if(config.chase_auto_thumsup){
  38. if(is_chasing()){
  39. if(!GM_getValue(bangumi_md)){
  40. GM_setValue(get_bangumi(), [get_bangumi_name(), 0])
  41. }
  42. }
  43. }
  44. }
  45. return config
  46. }
  47.  
  48. function get_bangumi() {
  49. let url = $("#__next > div.home-container > div.main-container > div.plp-l.sticky > div > div.mediainfo_mediaInfoWrap__nCwhA > a").attr("href")
  50. // console.log(url.split("/")[5])
  51. return url.split("/")[5]
  52. }
  53. function get_bangumi_name() {
  54. let name = $("#__next > div.home-container > div.main-container > div.plp-l.sticky > div > div.mediainfo_mediaInfoWrap__nCwhA > div > a.mediainfo_mediaTitle__Zyiqh").text()
  55. // console.log(name)
  56. return name
  57. }
  58.  
  59. function GetUps() {
  60. let name = $(".membersinfo-upcard");
  61. console.log(name.length);
  62. for (var i = 0; i < name.length; i++) {
  63. console.log(name[i].children[0].href.split("/")[3]);
  64. }
  65. return name;
  66. }
  67. function GetUpName() {
  68. let name = $("#mirror-vdcon > div.right-container > div > div.up-panel-container > div.up-info-container > div.up-info--right > div.up-info__detail > div > div.up-detail-top > a.up-name")
  69. name = name.text().trim();
  70. if (name == "") {
  71. name = $("#mirror-vdcon > div.right-container.is-in-large-ab > div > div.up-panel-container > div.up-info-container > div.up-info--right > div.up-info__detail > div > div.up-detail-top > a.up-name");
  72. name = name.text().trim();
  73. }
  74. return name;
  75. }
  76. function AddId() {
  77. let id = GetId();
  78. GetUpName();
  79. if (id == "None") {
  80. if (bv.videoType == "video") {
  81. GM_setValue(GetUp(), [GetUpName(), 0]); //数字0,1,2,3.只点赞,投一个币,投两个币,三连
  82. console.log("已添加");
  83. } else {
  84. GM_setValue(get_bangumi(), [get_bangumi_name(), 0])
  85. console.log("已添加番剧")
  86. }
  87. Init();
  88. }
  89. // console.log(id);
  90. }
  91. function GetId() {
  92. let result;
  93. if (bv.videoType == "video") {
  94. result = GM_getValue(GetUp(), "None");
  95. } else {
  96. result = GM_getValue(get_bangumi(), "None");
  97. }
  98. return result;
  99. }
  100. function DeleteId() {
  101. if (bv.videoType == "video") {
  102. let deleteResult = GM_deleteValue(GetUp());
  103. } else {
  104. let deleteResult = GM_deleteValue(get_bangumi());
  105. }
  106. console.log("已删除");
  107. Init();
  108. }
  109. function GetListId() {
  110. console.log(GM_listValues());
  111. }
  112. function GetListName() {
  113. let list = GM_listValues();
  114. // console.log(list)
  115. let data = [];
  116. for (var i = 0; i < list.length; i++) {
  117. // console.log(GM_getValue(list[i]),list[i]);
  118. if(list[i]=="config"){
  119. continue
  120. }
  121. if (bv.videoType == "video") {
  122. if (list[i].includes("md")) {
  123. continue
  124. }
  125. } else {
  126. if (!list[i].includes("md")) {
  127. continue
  128. }
  129. }
  130. let status = GM_getValue(list[i]);
  131. let result = { 'uid': list[i], 'name': status[0], 'mode': status[1] }
  132. data.push(result)
  133. }
  134. return data;
  135. }
  136. //投币
  137. function toubi(result = null) {
  138. // console.log("tou?");
  139. if(bv.videoType=="video"){
  140. let dianzanr = $("#arc_toolbar_report > div.video-toolbar-left > div.video-toolbar-left-main > div:nth-child(1) > div").attr("class") == "video-like video-toolbar-left-item on";
  141. if (dianzanr == true) return false;
  142. let toubis = $("#arc_toolbar_report > div.video-toolbar-left > div.video-toolbar-left-main > div:nth-child(2) > div");
  143. toubis.click();
  144. setTimeout(function () {
  145. if (result[1] == 1) {
  146. let quantity = $("body > div.bili-dialog-m > div > div > div.mc.clearfix > div.mc-box.left-con");
  147. quantity.click();
  148. }
  149. let confi = $("body > div.bili-dialog-m > div > div > div.coin-bottom > span");
  150. // console.log(confi.text());
  151. confi.click();
  152. }, 1);
  153. }else{
  154. let coin_button=document.querySelector("#ogv_weslie_tool_coin_info")
  155. let enterEvent = new KeyboardEvent("keydown", {
  156. key: "w",
  157. code: "KeyQ",
  158. bubbles: true
  159. });
  160. coin_button.dispatchEvent(enterEvent);
  161. // 触发 keyup 事件
  162. let keyUpEvent = new KeyboardEvent("keyup", {
  163. key: "w",
  164. code: "KeyQ",
  165. bubbles: true
  166. });
  167. coin_button.dispatchEvent(keyUpEvent);
  168. setTimeout(function(){
  169. if (result[1] == 1) {
  170. let quantity = document.querySelector("#__next > div.home-container > div.main-container > div.dialogcoin_coin_dialog_mask__BEw2o > div > div > div.dialogcoin_mc__JNSq7");
  171. console.log(quantity.children[0])
  172. quantity.children[0].dispatchEvent(new MouseEvent("click"))
  173. }
  174. },1)
  175. }
  176. return true;
  177. }
  178. //点赞
  179. function dianzan() {
  180. if(bv.videoType=="video"){
  181. let dianzanr = $("#arc_toolbar_report > div.video-toolbar-left > div.video-toolbar-left-main > div:nth-child(1) > div").attr("class") == "video-like video-toolbar-left-item on";
  182. // console.log(dianzanr);
  183. if (dianzanr == true) return true;
  184. let button = $("#arc_toolbar_report > div.video-toolbar-left > div.video-toolbar-left-main > div:nth-child(1) > div");
  185. if (button == undefined) return false;
  186. button.click();
  187. }else{
  188. let thumsup_button=document.querySelector(".like");
  189. // console.log(thumsup_button)
  190. if(thumsup_button==undefined)return false;
  191. if(thumsup_button.className=="like on")return true;
  192. let enterEvent = new KeyboardEvent("keydown", {
  193. key: "q",
  194. code: "KeyQ",
  195. bubbles: true
  196. });
  197. thumsup_button.dispatchEvent(enterEvent);
  198. // 触发 keyup 事件
  199. let keyUpEvent = new KeyboardEvent("keyup", {
  200. key: "q",
  201. code: "KeyQ",
  202. bubbles: true
  203. });
  204. thumsup_button.dispatchEvent(keyUpEvent);
  205. }
  206. return true;
  207. }
  208. //初始化按钮
  209. function Init() {
  210. let button = $("#gooseAdd");
  211. let button2 = $("#gooseSetting");
  212. let button3 = $("#gooseInfo");
  213. // let buttons=$(".gooseCards");
  214. // if(buttons!="undefined"){
  215. // buttons.each((index,element)=>{
  216. // $(element).remove();
  217. // })
  218. // }
  219. button.remove();
  220. button2.remove();
  221. button3.remove();
  222. SetButton();
  223. }
  224. //设置按钮
  225. function SetButton() {
  226. // let upDiv = $("#mirror-vdcon > div.right-container.is-in-large-ab > div > div.up-panel-container > div.up-info-container > div.up-info--right > div.up-info__btn-panel");
  227. //关注行
  228. let upDiv2 = $("#mirror-vdcon > div.right-container.is-in-large-ab > div > div.up-panel-container > div.up-info-container > div.up-info--right > div.up-info__btn-panel > div");
  229. //up名字行
  230. let upDiv3 = $("#mirror-vdcon > div.right-container.is-in-large-ab > div > div.up-panel-container > div.up-info-container > div.up-info--right > div.up-info__detail > div > div.up-detail-top");
  231. let upDiv1 = $("#mirror-vdcon > div.right-container.is-in-large-ab > div > div.up-panel-container > div.up-info-container > div.up-info--left > div > a > div > div > img");
  232. let now_type = bv.videoType;
  233. let combinit = $(".membersinfo-upcard");
  234. let div4 = $("#mirror-vdcon > div.right-container > div > div.up-panel-container");
  235. let customerDiv = $("<div id='gooseCustomerDiv'></div>");
  236. if (now_type == "bangumi") {
  237. div4 = $("#__next > div.home-container > div.main-container > div.plp-l.sticky > div > div.mediainfo_mediaInfoWrap__nCwhA > div > div.mediainfo_mediaToolbar__8Q7bn");
  238. }
  239. div4.append(customerDiv);
  240. let ups = GetId();
  241. customerDiv.css({
  242. "text-align": "center",
  243. })
  244. let infoButton = InitInfoButton();
  245. customerDiv.append(infoButton);
  246. if (combinit.length != 0) {
  247. console.log(ups)
  248. } else {
  249. if (ups != "None") {
  250. let settingButton = InitSettingButton();
  251. customerDiv.append(settingButton);
  252. }
  253. let button = InitButton();
  254. customerDiv.append(button);
  255. }
  256. }
  257. //获取添加的按钮
  258. function InitButton() {
  259. is_chasing()
  260. let result = GetId();
  261. let value = "";
  262. if (result == "None") {
  263. value = "添加";
  264. } else {
  265. value = "删除";
  266. }
  267. let button = document.createElement("input");
  268. button.setAttribute("id", "gooseAdd");
  269. button.setAttribute("value", value);
  270. button.setAttribute("type", "button");
  271. let styles = "border-radius:6px;border-color:pink;margin-left:10px;height:auto;width:25%;background-color:white;"
  272. button.setAttribute('style', styles);
  273. if (bv.videoType == "bangumi") {
  274. button.style.width = "auto";
  275. }
  276. if (value == "添加") {
  277. $(button).on("click", AddId);
  278. } else {
  279. $(button).on("click", DeleteId);
  280. }
  281. return button;
  282. }
  283. //获取设置按钮
  284. function InitSettingButton() {
  285. let result = GetId()[1];
  286. let value = whatModeIs(result);
  287. let button = document.createElement("input");
  288. button.setAttribute("id", "gooseSetting");
  289. button.setAttribute("value", value);
  290. button.setAttribute("type", "button");
  291. let styles = "border-radius:6px;border-color:pink;margin-left:10px;height:auto;width:25%;background-color:white;"
  292. button.setAttribute('style', styles);
  293. button.addEventListener("click", setting);
  294. return button;
  295. }
  296. //获取信息按钮
  297. function InitInfoButton() {
  298. let button = document.createElement("input");
  299. button.setAttribute("id", "gooseInfo");
  300. button.setAttribute("value", "列表");
  301. button.setAttribute("type", "button");
  302. let styles = "border-radius:6px;border-color:pink;margin-left:10px;height:auto;width:25%;background-color:white;"
  303. button.setAttribute('style', styles);
  304. if (bv.videoType == "bangumi") {
  305. button.style.width = "auto"
  306. button.style.height = "31.98px"
  307. }
  308. button.addEventListener("click", Info);
  309. return button;
  310. }
  311. //信息详情
  312. function Info() {
  313. let text =
  314. `<input type="checkbox" id="chase_auto_thumsup" name="chase_auto_thumsup" value="chase_auto_thumsup">` +
  315. `<label for="chase_auto_thumsup">追番自动选择点赞</label>` +
  316. "<table id='gooseTable'>" +
  317. "<thead>" +
  318. "<tr>" +
  319. `<td>${bv.videoType == "video" ? "uid" : "md"}</td>` +
  320. `<td>${bv.videoType == "video" ? "up名" : "番剧名"}</td>` +
  321. "<td>设置</td>" +
  322. "<td>操作</td>" +
  323. "</tr>" +
  324. "</thead>" +
  325. "<tbody id='gooseUpsBody'>" +
  326. "</tbody>" +
  327. "</table>";
  328. Swal.fire({
  329. title: '自动点赞的列表',
  330. html: text,
  331. showConfirmButton: false,
  332. showCloseButton: true,
  333. })
  334. // console.log($(".like"))
  335. // console.log($(".like").attr("class"))
  336. let config=GM_getValue("config");
  337. $("#chase_auto_thumsup").prop("checked",config.chase_auto_thumsup)
  338. let data = GetListName();
  339. data.forEach((element) => {
  340. let uid = element['uid'];
  341. let name = element['name'];
  342. let mode = whatModeIs(element['mode']);
  343. let tr = `
  344. <tr>
  345. <td class="canclick" id="gooseUid">${uid}</td>
  346. <td class="canclick">${name}</td>
  347. <td class="canclick" id="gooseMode">${mode}</td>
  348. <td>删除</td>
  349. </tr>
  350. `;
  351. $("#gooseUpsBody").append(tr);
  352. $("#gooseTable").css({
  353. "width": "100%",
  354. "border-collapse": "collapse",
  355. "background-color": "#e9e9e9",
  356. })
  357. $("#gooseTable thead tr").css({
  358. "background-color": "lightskyblue",
  359. })
  360. $("#gooseTable tr td").css({
  361. "border": " 1px solid #ccc",
  362. "cursor": "pointer",
  363. })
  364. })
  365. $("#chase_auto_thumsup").click(function(){
  366. let conf=GM_getValue("config")
  367. let now_statu=this.checked
  368. conf.chase_auto_thumsup=now_statu
  369. GM_setValue("config",conf)
  370. })
  371. $("#gooseTable tbody tr").each((index, element) => {
  372. let uid = $(element).children()[0];
  373. let name = $(element).children()[1];
  374. let mode = $(element).children()[2];
  375. let del = $(element).children()[3];
  376. let thisId = $(uid).text()
  377. let thisName = $(name).text();
  378. if (thisId == (bv.videoType == "video" ? GetUp() : get_bangumi())) {
  379. $(element).css({ "background-color": "#bae5ff" })
  380. }
  381. $(uid).click(() => {
  382. // console.log($(uid).text(),$(uid).val())
  383. if (bv.videoType == "video") {
  384. window.open("https://space.bilibili.com/" + $(uid).text(), "_blank")
  385. } else {
  386. window.open("https://www.bilibili.com/bangumi/media/" + $(uid).text(), "_blank")
  387. }
  388. })
  389. $(name).click(() => {
  390. if (bv.videoType == "video") {
  391. window.open("https://space.bilibili.com/" + $(uid).text(), "_blank")
  392. } else {
  393. window.open("https://www.bilibili.com/bangumi/media/" + $(uid).text(), "_blank")
  394. }
  395. })
  396. $(mode).click(() => {
  397. let result = GM_getValue(thisId);
  398. result[1] = (result[1] + 1) % 3;
  399. GM_deleteValue(thisId);
  400. GM_setValue(thisId, [thisName, result[1]]);
  401. $(mode).text(whatModeIs(result[1]))
  402. // console.log(result);
  403. Init();
  404. })
  405. $(del).click(() => {
  406. console.log($(element));
  407. GM_deleteValue($(uid).text());
  408. $(element).remove()
  409. Init();
  410. })
  411. })
  412. }
  413. function whatModeIs(id) {
  414. let mode = "";
  415. switch (id) {
  416. case 0:
  417. mode = bv.videoType=="video"?"只点赞":"点赞";
  418. break;
  419. case 1:
  420. mode = "投一个币";
  421. break;
  422. case 2:
  423. mode = "投两个币";
  424. break;
  425. case 3:
  426. mode = "三连";
  427. break;
  428. }
  429. return mode;
  430. }
  431. //设置 按钮的事件
  432. function setting() {
  433. let list = GetId()
  434. list[1] = (list[1] + 1) % 3;
  435. GM_deleteValue(GetId());
  436. if (bv.videoType == "video") {
  437. GM_setValue(GetUp(), [GetUpName(), list[1]]);
  438. } else {
  439. GM_setValue(get_bangumi(), [get_bangumi_name(),0]);
  440. }
  441. Init();
  442. }
  443. function GetBV() {
  444. let URL = window.location.href.split("/")[4];
  445. return URL;
  446. }
  447. function IsJunmping(BV, send) {
  448. console.log(BV, send);
  449. console.log(BV != GetBV());
  450. if (BV == null) {
  451. console.log("这是刚进网页的时候");
  452. }
  453. if (BV == GetBV() && send != 0) {
  454. console.log("还没跳转哦")
  455. setTimeout(IsJunmping, 3000, BV, send -= 1)
  456. }
  457. if (BV != GetBV()) {
  458. console.log("跳转啦!")
  459. setTimeout(PageInit(), 1);
  460. return true;
  461. }
  462. if (send == 0) {
  463. console.log("你是不是取消了呀?")
  464. return false;
  465. }
  466. console.log("what happend?");
  467. }
  468.  
  469. function is_chasing() {
  470. let chase = $("#ogv-weslie-media-info-follow > span").text()
  471. // console.log(chase)
  472. return chase == "已追番"
  473. }
  474.  
  475. let youbian = false;
  476. let alla = false;
  477. let ended = false;
  478. //页面初始化
  479. function PageInit() {
  480. let mq = new MessageQueue(1000, 10);
  481. console.log("pageinit running")
  482. setTimeout(function () {
  483. mq.Clear()
  484. let BV = GetBV();
  485. let video_type=bv.videoType
  486. let config=GM_getValue("config")
  487. init_config()
  488. Init(); //初始化按钮
  489. //合作视频卡片
  490. let combinit = $(".membersinfo-upcard");
  491. let result;
  492. let max = 0;
  493. if (combinit.length != 0) {
  494. console.log("这是合作视频")
  495. combinit.each((index, element) => {
  496. let up_uid = $(element.children[1].children[0]).attr("href").split("/")[3]
  497. let up_value = GM_getValue(up_uid, "None")
  498. if (up_value != "None") {
  499. if (up_value[1] > max) {
  500. max = up_value[1]
  501. }
  502. result = [up_value[0], max]
  503. }
  504. })
  505. } else {
  506. result = GetId();
  507. }
  508.  
  509. if (result != "None") { //如果被加入了,则投币
  510. switch (result[1]) {
  511. case 0:
  512. mq.Add(dianzan);
  513. break;
  514. case 1:
  515. case 2:
  516. mq.Add(function temptou() {
  517. toubi(result)
  518. });
  519. break;
  520. case 3:
  521. break;
  522. }
  523. }
  524. mq.Run();
  525. }, 4000);
  526. }
  527. class MessageQueue {
  528. functionArray = [];
  529. timeouts;
  530. constructor(timeout, timeouts = 10) {
  531. this.timeout = timeout;
  532. this.timeouts = timeouts;
  533. this.timeouted = 0;
  534. }
  535. Add(func) {
  536. this.functionArray.push(func);
  537. }
  538. Print() {
  539. console.log(this.functionArray);
  540. // this.functionArray.forEach(element => {
  541. // element();
  542. // });
  543. // console.log("print is ending");
  544. }
  545. async Run() {
  546. if (this.isRunning) {
  547. console.log("任务队列已经在运行中,无法重复调用");
  548. return; // 如果正在运行,则返回
  549. }
  550. this.isRunning = true; // 标记为正在运行
  551. console.log("函数列表:", this.functionArray, "超时计数器:", this.timeouted);
  552. while (this.functionArray.length > 0) {
  553. let result;
  554. const currentFunc = this.functionArray[0];
  555. result = currentFunc();
  556. console.log("现在正在运行的函数名为:", currentFunc.name);
  557. if (result === true || result === 1) {
  558. this.timeouted = 0;
  559. this.functionArray.shift(); // 移除已完成的函数
  560. } else {
  561. this.timeouted++;
  562. }
  563. if (this.timeouted === this.timeouts) {
  564. console.log("超时!超时的函数为:", currentFunc.name);
  565. this.isRunning = false; // 结束运行
  566. this.functionArray = [];
  567. return false;
  568. }
  569. let timeout = (this.timeouted * 150) + 1;
  570. await this.delay(timeout); // 延时函数
  571. }
  572.  
  573. console.log("所有任务已完成");
  574. this.isRunning = false; // 结束运行
  575. return true;
  576. }
  577. Clear() {
  578. this.functionArray = [];
  579. this.isRunning = false; // 停止运行标志
  580. this.delay((this.timeouted * 150) + 1)
  581. this.timeouted = 0; // 重置超时计数器
  582. }
  583. delay(ms) {
  584. return new Promise(resolve => setTimeout(resolve, ms));
  585. }
  586. }
  587.  
  588. class BVGet {
  589. bvnow;
  590. videoType; // {0==番剧}
  591. constructor() {
  592. this.reset()
  593. }
  594. reset() {
  595. var now = window.location.pathname.split("/")
  596. this.videoType = now[1];
  597. if (this.videoType == "bangumi") {
  598. this.bvnow = now[3];
  599. }
  600. if (this.videoType == "video") {
  601. this.bvnow = now[2];
  602. }
  603. console.log(this.bvnow)
  604. // console.log(`这个页面的类型是${this.videoType}`)
  605. }
  606. bvGet() {
  607. var bvnow = window.location.pathname.split("/");
  608. if (this.videoType == "bangumi") {
  609. bvnow = bvnow[3];
  610. }
  611. if (this.videoType == "video") {
  612. bvnow = bvnow[2];
  613. }
  614. // console.log(this.bvnow,bvnow);
  615. // console.log(bvnow == this.bvnow)
  616. if (bvnow != this.bvnow) {
  617. this.isJumping();
  618. }
  619. }
  620. isJumping() {
  621. let temp = this.bvnow
  622. this.reset()
  623. if (temp == '') {
  624. // console.log("页面初始化!")
  625. return
  626. }
  627. console.log(`bv已经从${temp}跳转:${this.bvnow}`)
  628. PageInit();
  629. }
  630. run() {
  631. setInterval(() => this.bvGet(), 2000);
  632. }
  633. }
  634. var bv = new BVGet();
  635. (function () {
  636. window.onload = function () {
  637. bv.run();
  638. PageInit();
  639. // console.log(GetUp());
  640. }
  641. })();

QingJ © 2025

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