commit 29df4f1293b00d5a243bfd2312170626b2fc9b20
Author: Alex <alex@caloyannis.xyz>
Date: Thu, 12 Mar 2026 22:13:12 +0100
First commit
Diffstat:
4 files changed, 132 insertions(+), 0 deletions(-)
diff --git a/files/to_json.js b/files/to_json.js
@@ -0,0 +1,21 @@
+let data = "";
+const url = "https://www.caloyannis.xyz/tools";
+
+process.stdin.on("data", chunk => data += chunk);
+process.stdin.on("end", () => {
+ const input = data.trim().replace(/^\s*Cookies?:\s*/i, "");
+
+ const cookies = input
+ .split(";")
+ .filter(Boolean)
+ .map(c => {
+ const [name, ...v] = c.trim().split("=");
+ return {
+ name,
+ value: v.join("="),
+ url
+ };
+ });
+
+ process.stdout.write(JSON.stringify(cookies, null, 2));
+});
diff --git a/index.js b/index.js
@@ -0,0 +1,64 @@
+import puppeteer from 'puppeteer';
+import { readFile, writeFile } from 'fs/promises';
+import { setTimeout } from 'node:timers/promises';
+
+import { browseAndScreenshot } from './tasks.js';
+
+// Data
+const args = process.argv.slice(2);
+if (args.length != 1) {
+ console.log('No url provided.');
+ process.exit(1);
+}
+const url = args[0];
+//const url = '';
+const useragent = 'Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0';
+const viewport = { width: 1680, height: 900, deviceScaleFactor: 1 };
+const cookies = JSON.parse(await readFile('files/cookies.json', 'utf8'));
+const model = 'llamabot';
+
+const shenanigans = async ({ browser, url, useragent, viewport, cookies, task }) => {
+
+ const context = await browser.createBrowserContext();
+ console.log('Creating new page...');
+ const page = await context.newPage();
+
+ await page.setUserAgent(useragent);
+ await page.setViewport(viewport);
+ await page.setCookie(...cookies);
+
+ console.log(`Loading page ${url}...`);
+ await page.goto(url, { waitUntil: 'networkidle2' });
+ //await page.reload({ waitUntil: "networkidle2" });
+
+ const title = await page.title();
+ console.log(`Page title: ${title}\n` +
+ `Waiting an extra 5 seconds...\n`);
+ await setTimeout(5000);
+ //const html = await page.content();
+
+ const result = await task(page);
+
+ await context.close();
+ return result;
+};
+
+(async () => {
+ // Launching puppeteer
+ console.log('Launching puppeteer...');
+ const browser = await puppeteer.launch({
+ headless: false,
+ args: [ '--no-sandbox', '--disable-setuid-sandbox', '--autoplay-policy=user-gesture-required'/*, '--proxy-server=socks5://127.0.0.1:9050'*/ ]
+ });
+
+ //const [initialPage] = await browser.pages();
+ //if (initialPage) await initialPage.close();
+
+ //const results = await Promise.all([
+ // shenanigans({ browser: browser, url: url, useragent: useragent, viewport: viewport, cookies: cookies, task: task, model: model })
+ //]);
+
+ await shenanigans({ browser: browser, url: url, useragent: useragent, viewport: viewport, cookies: cookies, task: browseAndScreenshot });
+
+ await browser.close();
+})();
diff --git a/package.json b/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "puppet",
+ "version": "1.0.0",
+ "description": "",
+ "license": "ISC",
+ "author": "",
+ "type": "module",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "dependencies": {
+ "puppeteer": "^24.38.0"
+ }
+}
diff --git a/tasks.js b/tasks.js
@@ -0,0 +1,32 @@
+import readline from 'node:readline/promises';
+import { stdin as input, stdout as output } from 'node:process';
+import { setTimeout } from 'node:timers/promises';
+import { exec, spawn } from 'child_process';
+
+const rl = readline.createInterface({ input, output });
+
+const runlm = (lmPrompt, model) => {
+ return new Promise((resolve, reject) => {
+ const child = spawn('ollama', ['run', model], { stdio: ['pipe', 'pipe', 'pipe'] });
+
+ let out = '', err = '';
+
+ child.stdout.on('data', d => out += d.toString());
+ child.stderr.on('data', d => err += d.toString());
+
+ child.stdin.write(lmPrompt);
+ child.stdin.end();
+
+ child.on('close', code => {
+ if (code !== 0) return reject(new Error(err || `Exit ${code}`));
+ resolve(out.trim());
+ });
+ });
+}
+
+export async function browseAndScreenshot(page) {
+ for(let n = 0; n < 60; n++) {
+ await setTimeout(1000);
+ }
+ await page.screenshot({ path: 'files/screenshot.png', fullPage: true });
+}