// ==UserScript==
// @name Wisdom Interpreter
// @namespace http://tampermonkey.net/
// @version 2024-06-09-5
// @description Python Runner for AI, You can use it to run python code in the web
// @author WuJunkai2004
// @license MIT
// @match *://yiyan.baidu.com
// @match *://tongyi.aliyun.com/qianwen/
// @match *://gemini.google.com/*
// @match *://chatgpt.com/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=baidu.com
// @grant none
// ==/UserScript==
function get_site_info(){
let url = window.location.href;
let support = [
{
'site': 'yiyan',
'id': '#DIALOGUE_CONTAINER_ID',
"cmd": "for_baidu;"
},{
'site': 'tongyi',
'id': '#chat-content',
"cmd": "for_aliyun;"
},{
'site': 'gemini',
'id': '.content-wrapper',
"cmd": "for_gemini;"
},{
"site": "chatgpt.com",
"id": ".pb-9",
"cmd": "for_chatgpt;"
}
]
for(let site of support){
if(url.includes(site.site)){
return site;
}
}
}
let observer = null;
async function inject_runner(){
observer = new MutationObserver((mutationsList, mutationObserver) => {
// insert element
// debounce
let last_time = localStorage.getItem('last_time') || null;
last_time = last_time ? parseInt(last_time) : null;
if(last_time){
clearTimeout(last_time);
}
// run the code
last_time = setTimeout(eval(get_site_info().cmd), 2000);
localStorage.setItem('last_time', last_time);
}).observe(document.querySelector(get_site_info().id), {
childList: true,
subtree: true,
characterData: true
});
}
async function inject_stdlib(){
let script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/gh/WuJunkai2004/Python-Runner-Plugin@delta/brython_stdlib.js';
script.onload = inject_runner;
document.body.appendChild(script);
}
async function inject_brython(){
if(window.location.href.includes('chatgpt.com')){
// 注入meta标签
// <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'nonce-fad90428-621b-47e4-815c-cd1e204b5312' 'sha256-RvbVrdDS11FSnQaULCOgXPA5u0nMP2Im1d2pGiRBGC4=' 'sha256-eMuh8xiwcX72rRYNAGENurQBAcH7kLlAUQcoOri3BIo=' http://localhost:8787">
let meta = document.createElement('meta');
meta.httpEquiv = 'Content-Security-Policy';
let content = "script-src-elem 'self' 'nonce-642953da-fa5b-45a4-84c7-afc8d603da9a' 'sha256-RvbVrdDS11FSnQaULCOgXPA5u0nMP2Im1d2pGiRBGC4=' 'sha256-eMuh8xiwcX72rRYNAGENurQBAcH7kLlAUQcoOri3BIo=' auth0.openai.com challenges.cloudflare.com chatgpt.com/ces https://*.chatgpt.com https://*.chatgpt.com/ https://*.oaistatic.com https://api.openai.com https://apis.google.com https://chat.openai.com https://chatgpt.com/ https://chatgpt.com/backend-anon https://chatgpt.com/backend-api https://chatgpt.com/graphql https://chatgpt.com/public-api https://chatgpt.com/voice https://docs.google.com https://jidori.g1.internal.services.openai.org https://js.live.net/v7.2/OneDrive.js https://oaistatic.com https://snc.apps.openai.com https://snc.chatgpt.com/backend/se https://tcr9i.chat.openai.com https://tcr9i.chatgpt.com/ https://www-onepick-opensocial.googleusercontent.com wss://*.chatgpt.com wss://*.chatgpt.com/ http://localhost:8787";
meta.content = content;
await sleep(1000);
document.head.appendChild(meta);
}
let script = document.createElement('script');
script.src = 'https://cdn.jsdelivr.net/gh/WuJunkai2004/Python-Runner-Plugin@delta/brython.min.js';
script.onload = inject_stdlib;
document.body.appendChild(script);
}
async function sleep(ms){
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function get_dialogue_container(){
let first_time = true;
let container = null;
let id = get_site_info().id;
do{
container = document.querySelector(id);
if(first_time != true){
await sleep(1000);
} else {
first_time = false;
}
}while(!container);
return container;
}
function generate_run_svg(size){
//M3 2 L26 16 L3 30 L5 26 L22 16 L5 6 L5 26 L3 30 Z
//it is for 32*32
return `M${size*0.09375} ${size*0.0625} L${size*0.8125} ${size*0.5} L${size*0.09375} ${size*0.9375} L${size*0.15625} ${size*0.8125} L${size*0.6875} ${size*0.5} L${size*0.15625} ${size*0.1875} L${size*0.15625} ${size*0.8125} L${size*0.09375} ${size*0.9375} Z`
}
function for_baidu(){
console.log('baidu');
function insert_after(new_node, target_node){
let parent = target_node.parentNode;
if(parent.lastChild == target_node){
parent.appendChild(new_node);
} else {
parent.insertBefore(new_node, target_node.nextSibling);
}
};
let code_block = document.querySelectorAll('.language-python');
for(let code of code_block){
let is_done = code.getAttribute('is-done') || null;
if(is_done){
continue;
}
code.setAttribute('is-done', true);
// add the display block
let id = Math.random().toString(36).slice(-8);
let result = code.parentNode.cloneNode(true);
result.setAttribute('id', id);
result.querySelectorAll('.code-copy').forEach(element => element.remove());
result.querySelector('.code-lang').innerText = 'output';
result.querySelector('tbody').innerHTML = '';
result.querySelector('tbody').setAttribute('id', id + '_output');
result.setAttribute('hidden', true);
insert_after(result, code.parentNode);
// get the code script
let tr_list = code.getElementsByTagName('tr');
let code_text = `def print(*args,sep=' ', end='\\n', file='', flush='', init=False):\n` +
' from browser import document\n' +
' text = " " + sep.join(list(map(str, args)))\n' +
' if init:\n' +
` document['${id}_output'].innerHTML = ''\n` +
' return\n' +
` document['${id}'].hidden = False\n` +
` document['${id}_output'].innerHTML += text + end\n` +
'print(init=True)\n'
for(let tr of tr_list){
code_text += tr.innerText.slice(1) + '\n';
}
// show the run cpy_button
let cpy_button = code.getElementsByClassName('code-copy')[0];
let run_button = cpy_button.cloneNode(true);
run_button.addEventListener('click', () => {
console.log(code_text);
try{
window.__BRYTHON__.runPythonSource(code_text, id);
} catch(e) {
document.getElementById(id + '_output').innerHTML += '\n Error: 因错误而退出\n';
document.getElementById(id).hidden = false;
console.log(e);
}
});
run_button.querySelector('path').setAttribute('d', generate_run_svg(32));
run_button.getElementsByClassName('code-copy-text')[0].innerText = '运行代码';
insert_after(run_button, cpy_button);
}
}
function for_aliyun(){
function insert_after(new_node, target_node){
let parent = target_node.parentNode;
if(parent.lastChild == target_node){
parent.appendChild(new_node);
} else {
parent.insertBefore(new_node, target_node.nextSibling);
}
};
let code_block = document.querySelectorAll('.tongyi-ui-highlighter');
for(let code of code_block){
let is_done = code.getAttribute('is-done') || null;
if(is_done){
continue;
}
code.setAttribute('is-done', true);
// 排除掉不是python的代码块
if(code.querySelector('span').innerText !== "Python"){
continue;
}
// 添加显示结果的代码块
let id = Math.random().toString(36).slice(-8);
let result = code.parentNode.cloneNode(true);
result.setAttribute('id', id);
result.querySelectorAll('.tongyi-ui-highlighter-copy-btn').forEach(element => element.remove());
result.querySelector('.tongyi-ui-highlighter-lang').innerHTML = 'Output';
result.querySelector('code').innerHTML = '';
result.querySelector('code').setAttribute('id', id + '_output');
result.setAttribute('hidden', true);
insert_after(result, code.parentNode);
// get the code script
let text_list = code.querySelector('code').innerText.split('\n');
let code_text = `def print(*args,sep=' ', end='\\n', file='', flush='', init=False):\n` +
' from browser import document\n' +
' text = " " + sep.join(list(map(str, args)))\n' +
' if init:\n' +
` document['${id}_output'].innerHTML = ''\n` +
' return\n' +
` document['${id}'].hidden = False\n` +
` document['${id}_output'].innerHTML += text + end\n` +
'print(init=True)\n';
for(let line_id=1; line_id<=text_list.length; line_id++){
let id_len = line_id.toString().length;
code_text += text_list[line_id-1].slice(id_len) + '\n';
}
// show the run cpy_button
let cpy_button = code.querySelector('svg');
let run_button = cpy_button.cloneNode(true);
run_button.setAttribute('style', 'margin-left: 10px;');
run_button.querySelector('path').setAttribute('d', generate_run_svg(12));
run_button.addEventListener('click', () => {
console.log(code_text);
try{
window.__BRYTHON__.runPythonSource(code_text, id);
} catch(e) {
document.getElementById(id + '_output').innerHTML += '\n Error: 因错误而退出\n';
document.getElementById(id).hidden = false;
console.log(e);
}
});
insert_after(run_button, cpy_button);
console.log('done');
}
}
function for_chatgpt(){
function insert_after(new_node, target_node){
let parent = target_node.parentNode;
if(parent.lastChild == target_node){
parent.appendChild(new_node);
} else {
parent.insertBefore(new_node, target_node.nextSibling);
}
};
let code_block = document.querySelectorAll('pre');
for(let code of code_block){
let is_done = code.getAttribute('is-done') || null;
if(is_done){
continue;
}
code.setAttribute('is-done', true);
// 排除掉不是python的代码块
if(code.querySelector('span').innerText !== 'python'){
continue;
}
// 添加显示结果的代码块
let id = Math.random().toString(36).slice(-8);
let result = code.cloneNode(true);
result.setAttribute('id', id);
result.querySelector('span').nextElementSibling.remove()
result.querySelector('span').innerText = 'output';
let code_text = `def print(*args,sep=' ', end='\\n', file='', flush='', init=False):\n` +
' from browser import document\n' +
' text = " " + sep.join(list(map(str, args)))\n' +
' if init:\n' +
` document['${id}_output'].innerHTML = ''\n` +
' return\n' +
` document['${id}'].hidden = False\n` +
` document['${id}_output'].innerHTML += text + end\n` +
'print(init=True)\n';
code_text += code.querySelector('code').innerText + '\n';
result.querySelector('code').innerHTML = '';
console.log(code_text);
}
}
(async function() {
'use strict';
await get_dialogue_container();
console.log('Python Runner for AI is running...');
await inject_brython();
})();