Skip to content

Instantly share code, notes, and snippets.

View Explosion-Scratch's full-sized avatar

--Explosion-- Explosion-Scratch

View GitHub Profile

Copy ChatGPT Transcript as markdown

javascript:void (async () => { let { default: TD } = await import("https://cdn.skypack.dev/turndown");  let json = [   ...document.querySelectorAll(".text-base"), ].map((i) => ({   html: i.innerHTML,   text: i.innerText,   markdown: new TD().turndown(i),   isPrompt: !i.querySelector(".prose"), }));  window.open(   URL.createObjectURL(     new Blob(       [         json           .map((i) =>             i.isPrompt ? `**Prompt**: ${i.text}` : `**ChatGPT**: ${i.markdown}`           )           .join("\n\n"),       ],       { type: "text/plain" }     )   ) ); })()

Google answer

Get a quick answer from google for any question

(async function answer(q) {
  var html = await fetch(
    `https://cors.explosionscratc.repl.co/google.com/search?q=${encodeURI(q)}`,
@Explosion-Scratch
Explosion-Scratch / Import and export chrome search engines.md
Created April 2, 2022 16:10
Import and export chrome search engines

Chrome 100, working import / export:

Note: All the other answers weren't working so here's a strategy to debug if this ever stops working:

  1. Hijack chrome.send and then add a search engine and watch the logs:
let oldsend = chrome.send;
chrome.send = (...args) => {
   console.log("[chrome.send], message: %o, arguments: %o", args[0], args[1]);
 chrome.send(...args);
@Explosion-Scratch
Explosion-Scratch / GraphQL Requires.js
Created March 16, 2022 20:06
Require data from another resolver to complete the current resolver
// Full function: NOTE: RESOLVERS is a global variable here, make sure if is if you reuse this
const requires = (deps, cb) => {
return async (parent) => {
for (let dep of deps) {
let thing = dep.split('.').slice(1);
if (!parent[thing]) {
if (!deepGet(dep, RESOLVERS)) {
throw new Err(`Property ${dep} expected on parent`);
}
let fn = deepGet(dep, RESOLVERS);
@Explosion-Scratch
Explosion-Scratch / Algebra solver (latex).js
Created March 16, 2022 14:33
Solve Algebra - Microsoft mathsolver
async function solve(latex) {
let json = await fetch("https://apis.explosionscratc.repl.co/fetch", {
method: "POST",
body: JSON.stringify({
url: "https://mathsolver.microsoft.com/cameraexp/api/v1/solvelatex",
args: {
headers: {
"accept": "application/json",
"content-type": "application/json",
},
//Can't use CORS proxy, I did it too much so they blocked that IP
await fetch("https://www.notion.so/api/v3/search", {
body: JSON.stringify({
type: "BlocksInSpace",
query: /* Your query here */,
spaceId: /* Find it in www.notion.so cookies */,
limit: 20,
filters: {
isDeletedOnly: false,
excludeTemplates: false,
javascript:function searchFor(e){return new Promise(t=>{fetch("https://2qwlvlxzb6-2.algolianet.com/1/indexes/*/queries",{headers:{accept:"*/*","content-type":"application/x-www-form-urlencoded","x-algolia-api-key":"2663c73014d2e4d6d1778cc8ad9fd010","x-algolia-application-id":"2QWLVLXZB6"},body:JSON.stringify({requests:[{indexName:"libraries",params:`query=${encodeURIComponent(e)}`}]}),method:"POST"}).then(e=>e.json()).then(e=>{return e.results[0].hits[0]}).then(t)})}searchFor(prompt("What library do you want to search for?")).then(e=>prompt(`${e.name} (${e.github.user}/${e.github.repo}): ${50===e.description.slice(0,50).length?e.description.slice(0,50)+"...":e.description}`,`https://cdnjs.cloudflare.com/ajax/libs/${e.objectID}/${e.version}/${e.filename}`));
//Non minified
searchFor(prompt("What library do you want to search for?")).then((result) =>
prompt(
`${result.name} (${result.github.user}/${result.github.repo}): ${result.description.slice(0, 50).length === 50 ? result.description.slice(0, 50) +
@Explosion-Scratch
Explosion-Scratch / Import and export search engines.js
Created December 16, 2021 00:13
Import and export search engines (Chrome 93)
function exportSE() {
let searchEngines = document.querySelector("body > settings-ui").shadowRoot.querySelector("#main").shadowRoot.querySelector("settings-basic-page").shadowRoot.querySelector("#basicPage > settings-section.expanded > settings-search-page").shadowRoot.querySelector("#pages > settings-subpage > settings-search-engines-page").shadowRoot.querySelector("#activeEngines").shadowRoot.querySelector("iron-list").querySelectorAll("settings-search-engine-entry")
searchEngines = [...searchEngines].map(({shadowRoot: $el})=>({
title: $el.querySelector("#name-column").innerText,
keyword: $el.querySelector("#keyword-column").innerText,
url: $el.querySelector("#url-column").innerText,
}))
downloadData("search_engines.json", JSON.stringify(searchEngines, null, 2))
@Explosion-Scratch
Explosion-Scratch / matrix.js
Last active May 6, 2023 04:46
MATRIX EFFECT YAY
// Init
function matrix({
selector = "canvas",
el = null,
color = "#0e0",
font = "15pt monospace",
fps = 40,
size = 20,
width = null,
height = null,
@Explosion-Scratch
Explosion-Scratch / Socket.io + express starter pack.js
Created December 5, 2021 00:44
I just use this same code so much, so I'm going to paste it here
const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const io = new Server(server);
// Tell when user connects/disconnects
io.on('connection', (socket) => {
console.log('a user connected');
@Explosion-Scratch
Explosion-Scratch / Password generator using master password.js
Created November 28, 2021 23:40
Generates passwords using a master password and the domain name.
(async () => {
// canary.discord.com ⇒ discord.com
let hashed = await hash(`${location.hostname.split(".").slice(-2).join(".")} $ ${await passwd()}`);
navigator.clipboard.writeText(hashed);
[...document.querySelectorAll("input[type='password']")].forEach(i => (i.value = hashed));
//Async hashes using crypto API 😎
async function hash(string) {
// SHA-256 is better but generates too long passwords.
var buffer = await crypto.subtle.digest("SHA-1", new TextEncoder().encode(string));
//Make it have some symbols and stuff