VectorLMS

try to take over the world!

当前为 2023-08-05 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name VectorLMS
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.0
  5. // @description try to take over the world!
  6. // @author savetheplanet07, wu5bocheng
  7. // @match https://*.vectorlmsedu.com/training/*
  8. // @icon https://cmu-pa.vectorlmsedu.com/favicon.ico
  9. // @license MIT
  10. // ==/UserScript==
  11. //Vector LMS Auto Task Completion Script. Sequentially runs tracking_start and tracking_finish for each course_item (i.e. video) on the page.
  12.  
  13. function asyncWaitSeconds(seconds) {
  14. return new Promise((resolve, reject) => {
  15. setTimeout(() => {
  16. resolve();
  17. }, seconds * 1000);
  18. });
  19. }
  20.  
  21. async function main() {
  22. let TOC_items = document.getElementsByClassName("TOC_item");
  23. let TOC_unwatched_videos = [];
  24.  
  25. //scrape the /training/launch/course_work/COURSEID page for video data
  26. for (let i = 0; i < TOC_items.length; i++) {
  27. try {
  28. let data_entry = {}
  29. data_entry.element = TOC_items[i];
  30. data_entry.isVideo = TOC_items[i].querySelector(".fa-play") != null;
  31. data_entry.href = TOC_items[i].getAttribute("href");
  32. data_entry.title = TOC_items[i].querySelector(".lead").innerText;
  33. let len = TOC_items[i].getAttribute("href").split("?")[0].split("/").length;
  34. data_entry.work_id = TOC_items[i].getAttribute("href").split("?")[0].split("/")[len - 1];
  35. data_entry.item_id = TOC_items[i].getAttribute("href").split("?")[0].split("/")[len - 2];
  36. if (!data_entry.isVideo) {
  37. continue;
  38. }
  39. data_entry.time_min = parseInt(TOC_items[i].querySelector(".span_link").innerText.split(" ")[1]) + .5;
  40. data_entry.completed = false;
  41. TOC_unwatched_videos.push(data_entry);
  42. } catch (err) {
  43. console.log("Error scraping TOC item: " + TOC_items[i].innerText);
  44. console.log(err);
  45. }
  46. }
  47. for (let i = 0; i < TOC_unwatched_videos.length; i++) {
  48. let unwatched_video = TOC_unwatched_videos[i];
  49. //request the tracking start
  50. let tracking_start_url = "https://cmu-pa.vectorlmsedu.com/rpc/v2/json/training/tracking_start?course_item_id=" + unwatched_video.item_id + "&course_work_id=" + unwatched_video.work_id;
  51. const tracking_start_response = await fetch(tracking_start_url);
  52. let tracking_start_data = await tracking_start_response.json();
  53. unwatched_video.work_hist_id = tracking_start_data.course_work_hist_id;
  54. console.log("Video time tracking started for video: " + unwatched_video.title);
  55. //delay for video length
  56. console.log("Waiting for the length of the video, " + unwatched_video.time_min * 60 + " seconds...");
  57. await asyncWaitSeconds(unwatched_video.time_min * 60);
  58. //request the tracking finish
  59. let tracking_finish_url = "https://cmu-pa.vectorlmsedu.com/rpc/v2/json/training/tracking_finish?course_work_hist_id=" + unwatched_video.work_hist_id + "&_=" + (Date.now() + unwatched_video.time_min * 60 * 1000).toString();
  60. const tracking_finish_response = await fetch(tracking_finish_url);
  61. let tracking_finish_data = await tracking_finish_response.json()
  62. unwatched_video.completed = !(tracking_finish_data.tracking_status); //0 is completed, 1 is not completed, 2 is previously completed (but we filtered those)
  63. if (unwatched_video.completed) {
  64. console.log("Completed Video: " + unwatched_video.title);
  65. unwatched_video.element.querySelector(".IconSquare").innerHTML = '<div style="height: 33px; width: 33px" class="IconSquare u-border-radius-4 u-overflow-hidden u-pos-relative" aria-hidden="true"><span><div class="color-overlay u-bg-tertiary-light"></div></span><div class="u-absolute-center u-text-center "><span class="fa fa-check fa-fw u-color-tertiary"></span></div></div>'; //Set Completed Checkbox
  66. unwatched_video.element.querySelector(".hidden-xs").innerHTML = '<div class="badge u-text-capitalize u-border-radius-10 u-m-0 u-bg-tertiary-light u-color-tertiary-darker">Completed</div>'; //Set Completed Badge
  67. }
  68. else {
  69. console.log("Failed to Complete Video: " + unwatched_video.title);
  70. }
  71. }
  72. location.reload();
  73. }
  74. main().then();