-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathznanija-solver.user.js
12 lines (11 loc) · 8.38 KB
/
znanija-solver.user.js
1
2
3
4
5
6
7
8
9
10
11
12
// ==UserScript==
// @name Znanija Solver
// @namespace http://tampermonkey.net/
// @version 1.0.0
// @description Solves Znanija questions
// @author scar17off
// @match https://znanija.com/*
// @icon https://znanija.com/favicon.ico
// @grant none
// ==/UserScript==
(()=>{"use strict";class e{constructor(e){this.letters=e}async getAnswer(e){throw new Error("getAnswer must be implemented by provider")}}class t extends e{constructor(){super(),this.systemMessage='Ти бот для надання відповідей на запитання в znanija. \nВідповідай максимально коротко, без форматування та зайвих слів.\nНе використовуй списки, зірочки чи інші спеціальні символи.\nНе пиши "Відповідь:", "Ось відповідь:" тощо.\nНе розбивай текст на пункти.\n\nДля математичних задач та задач з фізики/хімії:\n1. Спочатку напиши "Дано:"\n2. Потім "Розв\'язання:"\n3. В кінці "Відповідь:"\n\nДля завдань з категоризації слів:\n1. Просто напиши номер категорії і слова через кому\n2. Кожну категорію з нового рядка\n3. Не додавай пояснень\n\nДля всіх інших типів задач - просто пиши відповідь без додаткових слів.\n\nПриклади:\nПитання: Put the words in the correct category: dog cat house apartment bird fish\n1. dog, cat\n2. house, apartment\n3. bird, fish\n\nПитання: Знайти площу трикутника зі сторонами 3, 4 та 5\nДано:\na = 3\nb = 4\nc = 5\n\nРозв\'язання:\np = (a + b + c)/2 = 6\nS = √(p(p-a)(p-b)(p-c))\nS = √(6(6-3)(6-4)(6-5))\nS = √(6·3·2·1) = 6\n\nВідповідь: 6 кв.од.\n\nПитання: What do people hang on their doors during Christmas?\nPeople hang wreaths on their doors during Christmas.\n\nЯкщо отримуєш питання з контекстом "Моя відповідь:", не пиши "Відповідь:" на початку, просто дай правильну відповідь.'}async getAnswer(e,t,n=[],o="gpt-4o"){const r=[{role:"system",content:this.systemMessage}];if(n&&n.length>0){const e=n.map((e=>({type:"image_url",image_url:{url:e}})));r.push({role:"user",content:e})}r.push({role:"user",content:e});const a=await fetch("https://gpt24-ecru.vercel.app/api/openai/v1/chat/completions",{method:"POST",headers:{"Content-Type":"application/json","User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"},body:JSON.stringify({messages:r,stream:!0,model:o,temperature:.7,presence_penalty:0,frequency_penalty:0,top_p:1})});if(!a.ok)throw new Error(`API request failed: ${a.statusText}`);const s=a.body.getReader();let i="",c="";for(;;){const{value:e,done:n}=await s.read();if(n)break;c+=(new TextDecoder).decode(e);const o=c.split("\n");c=o.pop()||"";for(const e of o)if(e.startsWith("data: ")){const n=e.slice(6);if("[DONE]"===n)continue;try{const e=JSON.parse(n);e.choices[0].delta.content&&(i+=e.choices[0].delta.content,t&&t(i))}catch(e){continue}}}return i}}!function(){const e=new t;let n="";function o(){return document.querySelector("#slate-editable")}function r(){n="";const e=o();e&&(e.focus(),e.dispatchEvent(new KeyboardEvent("keydown",{key:"a",code:"KeyA",ctrlKey:!0,bubbles:!0,cancelable:!0})),setTimeout((()=>{e.dispatchEvent(new KeyboardEvent("keydown",{key:"Backspace",code:"Backspace",bubbles:!0,cancelable:!0}))}),50))}async function a(e){const t=e.slice(n.length);n=e,t&&(function(e){const t=new ClipboardEvent("paste",{bubbles:!0,cancelable:!0,clipboardData:new DataTransfer});t.clipboardData.setData("text/plain",e);const n=o();n&&(n.focus(),n.dispatchEvent(t))}(t),await new Promise((e=>setTimeout(e,50))))}setTimeout((function(){const t=setInterval((()=>{document.querySelector("#gpt24-answer-button")?clearInterval(t):document.querySelector(".Toolbar__toolbar--I6NTy")&&(function(){const t=document.querySelector(".Toolbar__toolbar--I6NTy");if(!t)return;const n=document.createElement("div");n.className="sg-vertical-separator sg-vertical-separator--gray-50",n.setAttribute("role","separator"),n.setAttribute("aria-orientation","vertical"),n.style.marginRight="0px",t.appendChild(n);const s=function(){const e=(new DOMParser).parseFromString('\n <div style="display: flex; align-items: center; gap: 4px;">\n <div class="OutsideClickController-module__wrapper--3MKCa">\n <div data-testid="tooltip_container" class="Tooltip-module__brn-tooltip-container--za0fg">\n <div role="button" class="Tooltip-module__brn-tooltip-children--Wa25k" tabindex="-1" aria-haspopup="false" aria-expanded="false">\n <button id="gpt24-answer-button" \n data-testid="rich_text_editor_toolbar_gpt24_button" \n class="sg-button sg-button--m sg-button--transparent sg-button--icon-only" \n aria-label="GPT24 Answer">\n <span class="sg-button__hover-overlay"></span>\n <span class="sg-button__icon sg-button__icon--m">\n <div aria-hidden="true" \n class="sg-icon sg-icon--adaptive sg-icon--x24" \n style="font-family: \'Roboto\', sans-serif; font-weight: bold; font-size: 14px; display: flex; align-items: center; justify-content: center;">\n AI\n </div>\n </span>\n <span class="sg-button__text"></span>\n </button>\n </div>\n </div>\n </div>\n <select id="gpt24-model-select" \n class="sg-button sg-button--m sg-button--transparent" \n style="cursor: pointer; text-transform: none; padding: 0 8px; display: flex; align-items: center; justify-content: center; text-align: center; text-align-last: center; background: transparent; color: #323c45; font-weight: bold; border: none;">\n <option value="gpt-4o" style="background: white; color: #323c45; font-weight: bold;">GPT-4</option>\n <option value="gpt-4o-mini" style="background: white; color: #323c45; font-weight: bold;">GPT-4 Mini</option>\n <option value="gpt-4o-turbo" style="background: white; color: #323c45; font-weight: bold;">GPT-4 Turbo</option>\n </select>\n </div>',"text/html").body.firstChild,t=document.createElement("style");return t.textContent="\n .brn-answer-editor-layer__content {\n width: 790px !important;\n }\n #gpt24-model-select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: 20px;\n }\n #gpt24-model-select:focus {\n outline: none;\n }\n #gpt24-model-select option {\n border-radius: 8px;\n padding: 4px 8px;\n }\n #gpt24-model-select optgroup {\n border-radius: 8px;\n }\n ",document.head.appendChild(t),e}();t.appendChild(s);const i=s.querySelector("#gpt24-answer-button"),c=s.querySelector("#gpt24-model-select");i.addEventListener("click",(()=>{const t=function(){const e=document.querySelector('.brn-answer-editor-layer__aside-content[data-testid="answer_editor_layer_aside"]');if(!e)return null;const t=e.querySelector(".sg-text.sg-text--text-gray-70")?.innerText;if(!t)return null;const n=[],o=e.querySelector(".brn-main-attachment img");return o?.src&&n.push(o.src),e.querySelectorAll(".brn-attachments__thumbnail img.brn-image").forEach((e=>{e.src&&!n.includes(e.src)&&n.push(e.src)})),{text:t.replace("Задание","").trim(),images:n}}();if(t){const n=c.value;r(),async function(t,n){console.log("Processing question:",t,"with model:",n);try{const s=o();if(!s)return;s.focus(),r(),await new Promise((e=>setTimeout(e,100)));const i=async e=>{await a(e)};await e.getAnswer(t.text,i,t.images,n)}catch(e){console.error("Error getting answer:",e),await a("Error: Failed to get answer")}}(t,n)}}))}(),clearInterval(t))}),1e3)}),1e3)}()})();