// Get current URL const url = window.location.href; // Get time function getCurrentUTCTimeFormatted() { const now = new Date(); const year = now.getUTCFullYear(); const month = String(now.getUTCMonth() + 1).padStart(2, '0'); const day = String(now.getUTCDate()).padStart(2, '0'); const hours = String(now.getUTCHours()).padStart(2, '0'); // Get the hours (00-23) in UTC const minutes = String(now.getUTCMinutes()).padStart(2, '0'); // minutes (00-59) in UTC const seconds = String(now.getUTCSeconds()).padStart(2, '0'); // seconds (00-59) in UTC return `${year}${month}${day}${hours}${minutes}${seconds}`; } const time = getCurrentUTCTimeFormatted(); // Get safe URL string function urlSafeF(url) { return url.replace(/[:\/?=@&(),+*%#]/g, '-'); } const urlsafe = urlSafeF(url); // Get DocType const doctype = document.doctype; let doctypeString = ""; if (doctype) { doctypeString = `\n`; } else { doctypeString = ""; } // Get webpage const output = doctypeString + document.documentElement.outerHTML; const blob = new Blob([output], { type: 'text/plain' }); const url1 = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url1; a.download = time + "-" + urlsafe; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url1); // Download URL to text file const blob1 = new Blob([url + "\n"], { type: 'text/plain' }); const blobUrl = URL.createObjectURL(blob1); const a1 = document.createElement('a'); a1.href = blobUrl; a1.download = time + "-" + urlsafe + ".txt"; document.body.appendChild(a1); a1.click(); document.body.removeChild(a1); URL.revokeObjectURL(blobUrl); read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 1; xdotool type "const base64String = \"Ly8gR2V0IGN1cnJlbnQgVVJMCmNvbnN0IHVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwoKLy8gR2V0IHRpbWUKZnVuY3Rpb24gZ2V0Q3VycmVudFVUQ1RpbWVGb3JtYXR0ZWQoKSB7CiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgY29uc3QgeWVhciA9IG5vdy5nZXRVVENGdWxsWWVhcigpOwogICAgY29uc3QgbW9udGggPSBTdHJpbmcobm93LmdldFVUQ01vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgY29uc3QgZGF5ID0gU3RyaW5nKG5vdy5nZXRVVENEYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICBjb25zdCBob3VycyA9IFN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTsgLy8gR2V0IHRoZSBob3VycyAoMDAtMjMpIGluIFVUQwogICAgY29uc3QgbWludXRlcyA9IFN0cmluZyhub3cuZ2V0VVRDTWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpOyAvLyBtaW51dGVzICgwMC01OSkgaW4gVVRDCiAgICBjb25zdCBzZWNvbmRzID0gU3RyaW5nKG5vdy5nZXRVVENTZWNvbmRzKCkpLnBhZFN0YXJ0KDIsICcwJyk7IC8vIHNlY29uZHMgKDAwLTU5KSBpbiBVVEMKICAgIHJldHVybiBgJHt5ZWFyfSR7bW9udGh9JHtkYXl9JHtob3Vyc30ke21pbnV0ZXN9JHtzZWNvbmRzfWA7Cn0KY29uc3QgdGltZSA9IGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCk7CgovLyBHZXQgc2FmZSBVUkwgc3RyaW5nCmZ1bmN0aW9uIHVybFNhZmVGKHVybCkgewogICAgcmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csICctJyk7Cn0KY29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7CgovLyBHZXQgRG9jVHlwZQpjb25zdCBkb2N0eXBlID0gZG9jdW1lbnQuZG9jdHlwZTsKbGV0IGRvY3R5cGVTdHJpbmcgPSAiIjsKaWYgKGRvY3R5cGUpIHsKICAgIGRvY3R5cGVTdHJpbmcgPSBgPCFET0NUWVBFICR7ZG9jdHlwZS5uYW1lfT5cbmA7Cn0gZWxzZSB7CiAgICBkb2N0eXBlU3RyaW5nID0gIiI7Cn0KCi8vIEdldCB3ZWJwYWdlCmNvbnN0IG91dHB1dCA9IGRvY3R5cGVTdHJpbmcgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MOwpjb25zdCBibG9iID0gbmV3IEJsb2IoW291dHB1dF0sIHsgdHlwZTogJ3RleHQvcGxhaW4nIH0pOwpjb25zdCB1cmwxID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKYS5ocmVmID0gdXJsMTsKYS5kb3dubG9hZCA9IHRpbWUgKyAiLSIgKyB1cmxzYWZlOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpOwphLmNsaWNrKCk7CmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7ClVSTC5yZXZva2VPYmplY3RVUkwodXJsMSk7CgovLyBEb3dubG9hZCBVUkwgdG8gdGV4dCBmaWxlCmNvbnN0IGJsb2IxID0gbmV3IEJsb2IoW3VybCArICJcbiJdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTsKY29uc3QgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYjEpOwpjb25zdCBhMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKYTEuaHJlZiA9IGJsb2JVcmw7CmExLmRvd25sb2FkID0gdGltZSArICItIiArIHVybHNhZmUgKyAiLnR4dCI7CmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYTEpOwphMS5jbGljaygpOwpkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGExKTsKVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKTs=\";const decodedString = atob(base64String);eval(decodedString);"; xdotool key Return # "xdotool type" = takes a while, so remove comments and stuff from the JS code export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 1; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return # dev tools console: "allow pasting" was previously typed and entered # Turn off request from remote access to inputs KDE/Plasma popup $ sudo mv -n /usr/share/applications/org.freedesktop.impl.portal.desktop.kde.desktop /usr/share/applications/.org.freedesktop.impl.portal.desktop.kde.desktop # Doesn't work? # https://old.reddit.com/r/kde/comments/1dlspdf/how_to_remove_remote_control_request_prompt/ # Does work :) # https://invent.kde.org/plasma/xdg-desktop-portal-kde/-/merge_requests/326 # run $ flatpak permission-set kde-authorized remote-desktop org.kde.krdpserver yes # $ flatpak permission-set kde-authorized remote-desktop "" yes # No memento, for URLs containing "?" basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://10.0.0.231:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://10.0.0.231:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj # Upper to lowercase ('tr "[:upper:]" "[:lower:]"') is needed for the # com,example/case lookup thing, but replay incorrectly links to # example.com/case even if the original URL was example.com/CASE # Memento, for URLs not containing "?" basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://10.0.0.231:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://10.0.0.231:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > "$basepath/dl/$time-$urlsafe.cdxj"; membase="$basepath/dl/m/$(date +%s)"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; cp -n "$basepath/dl/$time-$urlsafe.cdxj" "$membase"; cp -n "$basepath/dl/$time-$urlsafe.txt" "$membase"; cp -n "$basepath/dl/$time-$urlsafe" "$membase" The key is "charset utf-8;". /etc/nginx/sites-available/default ---> map $http_content_type $to { "~^text/html" "text/html; charset=utf-8"; } <--- /etc/nginx/conf.d/ipfs.conf ---> server { listen 443 ssl; listen [::]:443 ssl; server_name 10.0.0.229; ssl_certificate /etc/ssl/private/ssigned.crt; ssl_certificate_key /etc/ssl/private/ssigned.key; charset utf-8; location ~ ^/(ipfs|ipns) { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Content-Type $to; proxy_cache_bypass $http_upgrade; allow all; } } <--- # Memento, for URLs not containing "?" localip=10.0.0.231; basepath="/srv/http/selenium"; export DISPLAY=:1; flatpak permission-set kde-authorized remote-desktop org.kde.krdpserver yes; flatpak permission-set kde-authorized remote-desktop "" yes; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Delete; xdotool key Return; sleep 2; xdotool type " "; sleep 0.2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > "$basepath/dl/$time-$urlsafe.cdxj"; membase="$basepath/dl/m/$(date +%s)"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; cp -n "$basepath/dl/$time-$urlsafe.cdxj" "$membase"; cp -n "$basepath/dl/$time-$urlsafe.txt" "$membase"; cp -n "$basepath/dl/$time-$urlsafe" "$membase"; filesf() { basedir="$membase"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; }; cid="$(curl -sLk -XPOST -H "Content-Type: multipart/form-data" $(filesf) "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false" | tail -n1 | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid/memento/$time&arg=/memento/$time"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/memento/srccid/$cid"; curl -sLk https://$localip/cgi-bin/taildh?id=$cid; echo $cid; echo $cid | xsel -ib # filesf fails with " " in filename # load page as max zoomed out and scroll down (28 space-bar scrolls) Previous version of this file, "devtools.txt": /ipfs/bafkreihax245t36jyatxf6jeiemgcsq3hurnveyxxoretxurblgay7uveq #!/bin/bash localip=10.0.0.231; basepath="/srv/http/selenium"; export DISPLAY=:1; flatpak permission-set kde-authorized remote-desktop org.kde.krdpserver yes; flatpak permission-set kde-authorized remote-desktop "" yes; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Delete; xdotool key Return; sleep 2; xdotool type " "; sleep 0.2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > "$basepath/dl/$time-$urlsafe.cdxj"; membase="$basepath/dl/m/$(date +%s)"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$basepath/dl/$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi cp -n "$basepath/dl/$time-$urlsafe.cdxj" "$membase"; cp -n "$basepath/dl/$time-$urlsafe.txt" "$membase"; cp -n "$basepath/dl/$time-$urlsafe" "$membase"; filesf() { basedir="$membase"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; }; cid="$(curl -sLk -XPOST -H "Content-Type: multipart/form-data" $(filesf) "https://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false" | tail -n1 | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid/memento/$time&arg=/memento/$time"; curl -sLk -XPOST "https://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/memento/srccid/$cid"; curl -sLk https://$localip/cgi-bin/taildh?id=$cid; echo $cid; echo $cid | xsel -ib; bafkreiep4bgox2ykh2gwqyysr47tgyzaqhsgpsdjfk65i5wwhqtpzbxcma # No memento, for URLs containing "?" localip=localhost; basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj # No memento, for URLs containing "?" # If www.example.com/path, remove "www." because ipwb will lookup "com,example)/path" with no www. localip=localhost; basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; xdotool windowactivate $(xdotool search --name "Brave" | sort -n | head -1); sleep 0.1; xdotool key ctrl+t; sleep 0.1; xdotool type "$url"; xdotool key Return; sleep 2; xdotool key ctrl+shift+j; sleep 2; xdotool key Tab; sleep 2; echo "const base64String = \"Y29uc3QgdXJsPXdpbmRvdy5sb2NhdGlvbi5ocmVmO2Z1bmN0aW9uIGdldEN1cnJlbnRVVENUaW1lRm9ybWF0dGVkKCl7Y29uc3Qgbm93PW5ldyBEYXRlKCk7Y29uc3QgeWVhcj1ub3cuZ2V0VVRDRnVsbFllYXIoKTtjb25zdCBtb250aD1TdHJpbmcobm93LmdldFVUQ01vbnRoKCkrMSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGRheT1TdHJpbmcobm93LmdldFVUQ0RhdGUoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IGhvdXJzPVN0cmluZyhub3cuZ2V0VVRDSG91cnMoKSkucGFkU3RhcnQoMiwnMCcpO2NvbnN0IG1pbnV0ZXM9U3RyaW5nKG5vdy5nZXRVVENNaW51dGVzKCkpLnBhZFN0YXJ0KDIsJzAnKTtjb25zdCBzZWNvbmRzPVN0cmluZyhub3cuZ2V0VVRDU2Vjb25kcygpKS5wYWRTdGFydCgyLCcwJyk7cmV0dXJuIGAke3llYXJ9JHttb250aH0ke2RheX0ke2hvdXJzfSR7bWludXRlc30ke3NlY29uZHN9YDt9Y29uc3QgdGltZT1nZXRDdXJyZW50VVRDVGltZUZvcm1hdHRlZCgpO2Z1bmN0aW9uIHVybFNhZmVGKHVybCl7cmV0dXJuIHVybC5yZXBsYWNlKC9bOlwvPz1AJigpLCsqJSNdL2csJy0nKTt9Y29uc3QgdXJsc2FmZSA9IHVybFNhZmVGKHVybCk7Y29uc3QgZG9jdHlwZT1kb2N1bWVudC5kb2N0eXBlO2xldCBkb2N0eXBlU3RyaW5nPSIiO2lmKGRvY3R5cGUpe2RvY3R5cGVTdHJpbmc9YDwhRE9DVFlQRSAke2RvY3R5cGUubmFtZX0+XG5gO31lbHNle2RvY3R5cGVTdHJpbmc9IiI7fWNvbnN0IG91dHB1dD1kb2N0eXBlU3RyaW5nK2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7Y29uc3QgYmxvYj1uZXcgQmxvYihbb3V0cHV0XSx7dHlwZTondGV4dC9wbGFpbid9KTtjb25zdCB1cmwxPVVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7Y29uc3QgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7YS5ocmVmPXVybDE7YS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7YS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7VVJMLnJldm9rZU9iamVjdFVSTCh1cmwxKTtjb25zdCBibG9iMT1uZXcgQmxvYihbdXJsKyJcbiJdLHt0eXBlOid0ZXh0L3BsYWluJ30pO2NvbnN0IGJsb2JVcmw9VVJMLmNyZWF0ZU9iamVjdFVSTChibG9iMSk7Y29uc3QgYTE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO2ExLmhyZWY9YmxvYlVybDthMS5kb3dubG9hZD10aW1lKyItIit1cmxzYWZlKyIudHh0Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGExKTthMS5jbGljaygpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYTEpO1VSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybCk7\";const decodedString = atob(base64String);eval(decodedString);" | xsel -ib; xdotool key ctrl+shift+v; xdotool key Return; sleep 2; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj Previous: ar://81Cf_57RXDk0gkQPQnoIARYHj2uaSXRaUS7Z2hLfUK4 ipfs://bafkreidvskzd6o7nqwivzoez26if5u7ckejj7eza2vypxrogi4coxloa74 # Userscript // ==UserScript== // @name Auto Downloader 1 // @namespace http://tampermonkey.net/ // @version 0.1 // @description Automatically download a file // @match *://*/* // @grant GM_download // ==/UserScript== // Get time function via duck.ai function getCurrentUTCTimeFormatted() { const now = new Date(); const year = now.getUTCFullYear(); // Get the full year (YYYY) in UTC const month = String(now.getUTCMonth() + 1).padStart(2, '0'); // Get the month (01-12) in UTC const day = String(now.getUTCDate()).padStart(2, '0'); // Get the day (01-31) in UTC const hours = String(now.getUTCHours()).padStart(2, '0'); // Get the hours (00-23) in UTC const minutes = String(now.getUTCMinutes()).padStart(2, '0'); // Get the minutes (00-59) in UTC const seconds = String(now.getUTCSeconds()).padStart(2, '0'); // Get the seconds (00-59) in UTC return `${year}${month}${day}${hours}${minutes}${seconds}`; } const time = getCurrentUTCTimeFormatted(); // Get current URL const url = window.location.href; // Bash: urlsafe=$(echo "$url" | sed "s/:\|\/\|?\|=\|@\|&\|(\|)\|,\|+\|*\|%\|#/-/g") // Get safe URL string, converted to JS via duck.ai function urlSafeF(url) { return url.replace(/[:\/?=@&(),+*%#]/g, '-'); } const urlsafe = urlSafeF(url); // Download URL to text file, mostly via duck.ai const blob = new Blob([url + "\n"], { type: 'text/plain' }); const blobUrl = URL.createObjectURL(blob); GM_download({ url: blobUrl, name: `${time}-${urlsafe}.txt`, saveAs: false // Set to true if you want to prompt the user for a save location }); setTimeout(() => { URL.revokeObjectURL(blobUrl); }, 1000); // Download webpage GM_download(url, time + "-" + urlsafe + ".txt"); // Get DocType const doctype = document.doctype; let doctypeString = ""; if (doctype) { doctypeString = `\n`; } else { doctypeString = ""; } // Get webpage const output = doctypeString + document.documentElement.outerHTML; const blob1 = new Blob([output], { type: 'text/plain' }); const url1 = URL.createObjectURL(blob1); const a = document.createElement('a'); a.href = url1; a.download = time + "-" + urlsafe; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url1); // Next, in Bash: //localip=localhost; basepath="/srv/http/selenium"; newest="$(ls /srv/http/selenium/dl -t | head -n2 | tail -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; urlsafe="$(echo $newest | sed "s/^...............//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj // alert("Run this in Bash ---> localip=localhost; basepath=\"\/srv\/http\/selenium\"; newest=\"$(ls \/srv\/http\/selenium\/dl -t | head -n2 | tail -n1)\"; newpath=\"$basepath\/dl\/$newest\"; cid=\"$(curl -sLk -XPOST -F file=@$newpath \"http:\/\/$localip:5001\/api\/v0\/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false\" | jq .Hash | sed \"s\/\\\"\/\/g\")\"; curl -sLk -XPOST \"http:\/\/$localip:5001\/api\/v0\/files\/cp?arg=\/ipfs\/$cid&arg=\/created\/cid\/$cid\"; time=\"$(echo $newest | sed \"s\/-.*\/\/g\")\"; urlsafe=\"$(echo $newest | sed \"s\/^...............\/\/g\")\"; url=\"$(cat \"$basepath\/dl\/$time-$urlsafe.txt\")\"; arr=\"$(echo \"$url\" | sed \"s\/^https\\?:\\\/\\\/\/\/g\" | sed \"s\/\\\/.*\/\/g\" | sed \"s\/\\.\/ \/g\")\"; echo \"$(echo \"${arr[@]}\" | sed \"s\/^www \/\/g\" | tr \' \' \'\\n\' | tac | tr \'\\n\' \' \' | sed \"s\/ $\/\/g\" | sed \"s\/ \/,\/g\")$(echo \"$url\" | sed \"s\/^https\\?:\\\/\\\/[^\\\/]*\/)\/g\" | tr \"[:upper:]\" \"[:lower:]\") $time {\\\"locator\\\": \\\"urn:ipfs\/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku\/$cid\\\", \\\"status_code\\\": \\\"200\\\", \\\"mime_type\\\": \\\"text\/html;charset=UTF-8\\\", \\\"original_uri\\\": \\\"$url\\\", \\\"title\\\": \\\"$(cat \"$basepath\/dl\/$time-$urlsafe\" | htmlq --text title)\\\"}\" > $basepath\/dl\/$time-$urlsafe.cdxj; echo $basepath\/dl\/$time-$urlsafe.cdxj"); /********** *********** **********/ // Fucky shit happening at https://rateyourmusic.com/artist/olivier_delbosc - the // only site/page where this script didn't work. For that, ctrl+shift+j to open // dev tools, then paste in: /* // Get current URL const url = window.location.href; // Get time function getCurrentUTCTimeFormatted() { const now = new Date(); const year = now.getUTCFullYear(); // Get the full year (YYYY) in UTC const month = String(now.getUTCMonth() + 1).padStart(2, '0'); // Get the month (01-12) in UTC const day = String(now.getUTCDate()).padStart(2, '0'); // Get the day (01-31) in UTC const hours = String(now.getUTCHours()).padStart(2, '0'); // Get the hours (00-23) in UTC const minutes = String(now.getUTCMinutes()).padStart(2, '0'); // Get the minutes (00-59) in UTC const seconds = String(now.getUTCSeconds()).padStart(2, '0'); // Get the seconds (00-59) in UTC return `${year}${month}${day}${hours}${minutes}${seconds}`; } const time = getCurrentUTCTimeFormatted(); // Get safe URL string function urlSafeF(url) { return url.replace(/[:\/?=@&(),+*%#]/g, '-'); } const urlsafe = urlSafeF(url); // Get DocType const doctype = document.doctype; let doctypeString = ""; if (doctype) { doctypeString = `\n`; } else { doctypeString = ""; } // Get webpage const output = doctypeString + document.documentElement.outerHTML; const blob = new Blob([output], { type: 'text/plain' }); const url1 = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url1; a.download = time + "-" + urlsafe; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url1); // Download URL to text file const blob1 = new Blob([url + "\n"], { type: 'text/plain' }); const blobUrl = URL.createObjectURL(blob1); const a1 = document.createElement('a'); a1.href = blobUrl; a1.download = time + "-" + urlsafe + ".txt"; document.body.appendChild(a1); a1.click(); document.body.removeChild(a1); URL.revokeObjectURL(blobUrl); */ # cURL with UA, rearrange ?v=a&b=a&n=a -> ?b=a&n=a&v=a = alphabetical localip=localhost; basepath="/srv/http/selenium"; export DISPLAY=:1; read -p "url: " url; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; time="$(TZ=UTC date -u +%Y%m%d%H%M%S)"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/$time-$urlsafe.txt"; curl "$url" -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36' > "$basepath/dl/$time-$urlsafe"; newest="$(ls /srv/http/selenium/dl -t | head -n1)"; newpath="$basepath/dl/$newest"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; time="$(echo $newest | sed "s/-.*//g")"; url="$(cat "$basepath/dl/$time-$urlsafe.txt")"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); base_url="${url%%\?*}"; query_string="${url#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url") $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj # note 1: # user agent and asc order need for # https://www.google.com/async/hpba?yv=3&cs=0&ei=tey8aP20MsXXkPIP1qiM6A4&async=_basejs:/xjs/_/js/k%3Dxjs.hd.en.3Rf3segfjKU.2018.O/am%3DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAEAAQAAAEAQEAAAAAAAIBAAEAAAAAAAAAAAARAAEAEAAAAAAAAAAAAAAQAAAAAAAGCAAEIAQAQBgEAAAAAAAAAAAAABAAAQAAAAADAD8MTACAIAACQAAAAAAAAAAFwAACQAAAAIAAAAAAAAAAAAAAAABAAAAAAACAAAAAQAAFAAAAAAAAAAAAAAAAgAAAAAAAAAAAgAgAAIAAAAAAAAAAAAAAAAAAADQAwAAAAAAAAAAAAAAAAAAAHAAAEIAAABgiKIBAAAAAAAA0AEg8IAhBQUAAAAAAAAAAAAAAAAAAECAgmAuJBAQIAAAAAAAAAAAAAAAAAAAAAAAQKgmFho/dg%3D0/br%3D1/rs%3DACT90oF0ZgB4A-NYOTGhGkXXIs0-u9qBRQ,_basecss:/xjs/_/ss/k%3Dxjs.hd.G1XUVsdso3U.L.B1.O/am%3DEAKUCgQAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAABEBAAAAAAxDYIQAAAAAOAACkAAAAAEAACAAAAEAAAEAAAAAAAAAAEEAAAwAIAAQgsCgAEIAQAQBAUAAAgAAABAgQAAAJgAwAAEgCCAEAAAAAI4EMABAYIAAAAKABEAAACAAAAAAAAAAAoIAAAgAAAAAAAAABAAACCAAXQQgIFQBJBwAJEBEAAAAAEAAgIAAAAIAAAAFgQAAEBAQA3gCBBwAAIAgCAADSAwAUABAAAAgEAAAAAAAAADACAAYAwAJgiKIBAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAEAAgAAiAFAAAAAAAAAAAAAAAAAAAAAAAAAAQA/br%3D1/rs%3DACT90oGrzTZmi-mgQgHIcDXROhEYGwa2OA,_basecomb:/xjs/_/js/k%3Dxjs.hd.en.3Rf3segfjKU.2018.O/ck%3Dxjs.hd.G1XUVsdso3U.L.B1.O/am%3DEAKUCgQAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAgAAAAAAABEBAQAAAExTcIQAAAAAOBACkAAAAAEAACAAAREAEAEAAAAAAAAAAEEAAQwAIAAQguCgAEIAQAQBgUAAAgAAABAgQAABJgAwAAEgCDAH8MTACI4EMCRAYIAAAAKABFwAACQAAAAIAAAAAoIAAAgAAAAABAAABAAACCAAXQQgIFQBJBwAJEBEAAAAAEgAgIAAAAIAAAgFgQAIEBAQA3gCBBwAAIAgCAADSAwAUABAAAAgEAAAAAAAAAHACAEYAwAJgiKIBAAAAAAAA0AEg8IAhBQUAAAAAAAAAAAAAAAAAAECAgmAuJFAQIAAAAAAAAAAAAAAAAAAAAAAAQKgmFho/d%3D1/ed%3D1/dg%3D0/br%3D1/ujg%3D1/rs%3DACT90oEj-eOTueLlVa8uvSJOEep86fwhbQ,_fmt:prog,_id:_tey8aP20MsXXkPIP1qiM6A4_7&sp_imghp=false&sp_hpep=2&sp_hpte=0&vet=10ahUKEwi946WXzMWPAxXFK0QIHVYUA-0Qj-0KCBU..i # note 2: # for text/plain, the header part in # "locator": "urn:ipfs/bafkreiapgxontxk3mbbepeo52acwhev5wwy23tprwi3moxhihinhjhi5cm/bafkreihjzjrokrv6qal2h7ljlchczotqfuypki7s7rgbxv2xyb2siwdqb4" # must have "Content-Type: text/plain": # $ ipfs cat bafkreiapgxontxk3mbbepeo52acwhev5wwy23tprwi3moxhihinhjhi5cm # HTTP/1.1 200 OK # Date: Sun, 07 Sep 2025 03:22:54 GMT # Content-Type: text/plain; charset=utf-8 # Transfer-Encoding: chunked # Connection: keep-alive # Server: cloudflare # x-frame-options: DENY # x-content-type-options: nosniff # x-xss-protection: 1;mode=block # Cache-Control: public, max-age=14400 # Age: 144 # cf-cache-status: HIT # last-modified: Sun, 07 Sep 2025 03:20:29 GMT # Vary: accept-encoding # CF-RAY: 97b3159919917c2c-DEN # ipwb version # works on URLs containing "?" or "&" $ echo To be used with SingleFile extension for Brave Browser, a running ipfs daemon, and ipwb for replay. For: text/html grabs.; localip=localhost; basepath="/srv/http/selenium"; cd "$basepath/dl"; newest="$(ls -t1 | head -n1)"; url="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ url: " | sed "s/\s*$//g" | sed "s/.*\s//g")"; timestr="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ saved date: " | sed "s/\s*$//g" | sed "s/^ saved date: //g")"; time="$(TZ=UTC date -d "$timestr" +%Y%m%d%H%M%S)"; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/$time-$urlsafe.txt"; cat "$newest" > "$basepath/dl/$time-$urlsafe"; newpath="$basepath/dl/$time-$urlsafe"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url2=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); if [[ "$url" == *\?* || "$url" == *\&* ]]; then base_url="${url2%%\?*}"; query_string="${url2#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url"; else echo "$url2"; fi) $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/$time-$urlsafe.cdxj; echo $basepath/dl/$time-$urlsafe.cdxj # no ipwb version # only works on basic URLs with no "?" or "&", such as example.com/a/b/c $ echo To be used with SingleFile extension for Brave Browser and a running ipfs daemon. For: text/html grabs.; localip=localhost; basepath="/srv/http/selenium"; cd "$basepath/dl"; newest="$(ls -t1 | head -n1)"; url="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ url: " | sed "s/\s*$//g" | sed "s/.*\s//g")"; timestr="$(grep -i -A2 "^ Page saved with SingleFile" "$newest" | grep -i "^ saved date: " | sed "s/\s*$//g" | sed "s/^ saved date: //g")"; time="$(TZ=UTC date -d "$timestr" +%Y%m%d%H%M%S)"; unixtime=$(date +%s); mkdir "m/$unixtime"; urlsafe="$(echo "$url" | sed "s/:\|\/\|?\|=\|&\|(\|)\|,\|@\|+\|*\|%\|#/-/g")"; urllen=$(echo -n $time-$urlsafe | wc --bytes); if [ $urllen -gt 200 ]; then urlsafe="$(echo "$urlsafe" | perl -pE "s/^(.{200}).*/\1.URL2LONG/g")"; fi; echo "$url" > "$basepath/dl/m/$unixtime/$time-$urlsafe.txt"; cat "$newest" > "$basepath/dl/m/$unixtime/$time-$urlsafe"; newpath="$basepath/dl/m/$unixtime/$time-$urlsafe"; cid="$(curl -sLk -XPOST -F file=@$newpath "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&pin=false" | jq .Hash | sed "s/\"//g")"; curl -sLk -XPOST "http://$localip:5001/api/v0/files/cp?arg=/ipfs/$cid&arg=/created/cid/$cid"; arr="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/.*//g" | sed "s/\./ /g")"; echo "$(echo "${arr[@]}" | sed "s/^www //g" | tr ' ' '\n' | tac | tr '\n' ' ' | sed "s/ $//g" | sed "s/ /,/g")$(url2=$(echo "$url" | sed "s/^https\?:\/\/[^\/]*/)/g" | tr "[:upper:]" "[:lower:]"); if [[ "$url" == *\?* || "$url" == *\&* ]]; then base_url="${url2%%\?*}"; query_string="${url2#*\?}"; sorted_query=$(echo "$query_string" | tr '&' '\n' | sort | tr '\n' '&' | sed 's/&$//'); sorted_url="$base_url?$sorted_query"; echo "$sorted_url"; else echo "$url2"; fi) $time {\"locator\": \"urn:ipfs/bafkreihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku/$cid\", \"status_code\": \"200\", \"mime_type\": \"text/html;charset=UTF-8\", \"original_uri\": \"$url\", \"title\": \"$(cat "$basepath/dl/m/$unixtime/$time-$urlsafe" | htmlq --text title)\"}" > $basepath/dl/m/$unixtime/$time-$urlsafe.cdxj; membase="$basepath/dl/m/$unixtime"; urlpath="$(echo "$url" | sed "s/^https\?:\/\///g" | sed "s/\/$//g")"; if [[ "$url" =~ .*/$ ]]; then mkdir -p "$membase/memento/$time/$urlpath"; cp -n "$membase/$time-$urlsafe" "$membase/memento/$time/$urlpath/index.html"; else urlpathnolast="$(echo "$urlpath" | sed "s/\/[^\/]*$//g")"; lastpart="$(echo $urlpath | sed "s/.*\///g")"; mkdir -p "$membase/memento/$time/$urlpathnolast"; cp -n "$time-$urlsafe" "$membase/memento/$time/$urlpathnolast/$lastpart"; fi; filesf() { basedir="$basepath/dl/m/$unixtime"; basedirlen=$(echo "$basedir" | wc --bytes); find "$basedir" -type f | basedirlen="$basedirlen" xargs -d "\n" sh -c 'for args do nobasedir=$(echo "$args" | sed -E "s/^.{$basedirlen}//g"); echo " -F "file=@"\"$args\";filename=\"$nobasedir\"" | tr -d \\n; done' _; }; curl -k -XPOST -H "Content-Type: multipart/form-data" $(filesf) "http://$localip:5001/api/v0/add?cid-version=1&chunker=size-1048576&recursive=true&wrap-with-directory=true&pin=false"