您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Kepler için notlar
当前为
// ==UserScript== // @name Kepler Script // @author KazuroAkashi // @match https://obs.itu.edu.tr/ogrenci/ // @license MIT // @version 0.0.1.20250106095007 // @namespace https://greasyfork.org/users/1419483 // @description Kepler için notlar // ==/UserScript== (function() { 'use strict'; async function getJWT() { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("GET", "https://obs.itu.edu.tr/ogrenci/auth/jwt"); xhr.onload = () => { if (xhr.readyState == 4 && xhr.status == 200) { resolve(xhr.responseText); } else { reject(xhr.status); } }; xhr.send(); }) } async function getDonemListesi(jwt) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("GET", "https://obs.itu.edu.tr/api/ogrenci/DonemListesi"); xhr.setRequestHeader("Authorization", "Bearer " + jwt); xhr.onload = () => { if (xhr.readyState == 4 && xhr.status == 200) { resolve(JSON.parse(xhr.response)); } else { reject(xhr.status); } }; xhr.send(); }) } async function getSinifListesi(jwt, donemId) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("GET", "https://obs.itu.edu.tr/api/ogrenci/sinif/KayitliSinifListesi/" + donemId); xhr.setRequestHeader("Authorization", "Bearer " + jwt); xhr.onload = () => { if (xhr.readyState == 4 && xhr.status == 200) { resolve(JSON.parse(xhr.response)); } else { reject(xhr.status); } }; xhr.send(); }) } async function getNotListesi(jwt, sinifId) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); xhr.open("GET", "https://obs.itu.edu.tr/api/ogrenci/Sinif/SinifDonemIciNotListesi/" + sinifId); xhr.setRequestHeader("Authorization", "Bearer " + jwt); xhr.onload = () => { if (xhr.readyState == 4 && xhr.status == 200) { resolve(JSON.parse(xhr.response)); } else { reject(xhr.status); } }; xhr.send(); }) } String.prototype.formatStr = String.prototype.formatStr || function () { "use strict"; var str = this.toString(); if (arguments.length) { var t = typeof arguments[0]; var key; var args = ("string" === t || "number" === t) ? Array.prototype.slice.call(arguments) : arguments[0]; for (key in args) { str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]); } } return str; }; const htmlParser = new DOMParser(); function createHTMLElement(str) { const doc = htmlParser.parseFromString(str, "text/html"); return doc.body.firstChild; } function insertBeforeHTMLElement(str, el) { const insert = createHTMLElement(str); el.parentElement.insertBefore(insert, el); } const newCardTemplate = ` <div class="row"> <div class="col-md-12 mb-5"> <div class="card info-graphic info-graphic--service"> <div class="card-body"> <h2>Notlar</h2> {0} </div> </div> </div> </div> `; const newClassTemplate = ` <div class="col-lg-12 mb-3"> <h4>{name}</h4> {notes} <div class="row ml-5"> <h5>Ağırlıklı Ortalama</h5> <div class="ml-5">{average}</div> </div> </div> `; const newNoteTemplate = ` <div class="row ml-5"> <h5>{name} (%{perc})</h5> <div class="ml-5">{note}</div> </div> `; const newClassTemplateTable = ` <div class="col-lg-12 mb-3"> <h4>{name}</h4> <div class="table-vertical table-vertical--unheight"> <table class="table table-striped table-bordered" style="table-layout: fixed"> <tbody> {notes} <tr> <th class="title" style="width: 40%">Ağırlıklı Ortalama</th> <td>{average}</td> </tr> </tbody> </table> </div> </div> `; const newNoteTemplateTable = ` <tr> <th class="title" style="width: 40%">{name} (%{perc})</th> <td>{note}</td> </tr> `; async function printNotlar() { const jwt = await getJWT(); const donemListesi = (await getDonemListesi(jwt)).ogrenciDonemListesi; const sonDonem = donemListesi[donemListesi.length - 1]; const sonDonemId = sonDonem.akademikDonemId; const sinifListesi = (await getSinifListesi(jwt, sonDonemId)).kayitSinifResultList; const addBefore = document.querySelectorAll(".obs > .container-fluid > div > .row")[1]; let classesEl = ""; for (const sinif of sinifListesi) { const sinifNameEn = sinif.bransKodu + sinif.dersKodu + " - " + sinif.dersAdiEN + " (CRN: " + sinif.crn + ")"; const sinifNameTr = sinif.bransKodu + sinif.dersKodu + " - " + sinif.dersAdiTR + " (CRN: " + sinif.crn + ")"; const sinifId = sinif.sinifId; const notListesiObj = (await getNotListesi(jwt, sinifId)); const notListesi = notListesiObj.sinifDonemIciNotListesi; const ortalama = notListesiObj.ortalama; let notesEl = ""; for (const not of notListesi) { const notName = not.degerlendirmeOlcutuAdi; const notPerc = not.degerlendirmeKatkisi; const notValue = not.not; notesEl += newNoteTemplateTable.formatStr({ "name": notName, "perc": notPerc, "note": notValue }); } classesEl += newClassTemplateTable.formatStr({ "name": sinifNameTr, "notes": notesEl, "average": ortalama }); } const cardEl = newCardTemplate.formatStr(classesEl); insertBeforeHTMLElement(cardEl, addBefore); } printNotlar(); })();