puppet

Puppeteer script for anything
Log | Files | Refs

commit 29df4f1293b00d5a243bfd2312170626b2fc9b20
Author: Alex <alex@caloyannis.xyz>
Date:   Thu, 12 Mar 2026 22:13:12 +0100

First commit

Diffstat:
Afiles/to_json.js | 21+++++++++++++++++++++
Aindex.js | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apackage.json | 15+++++++++++++++
Atasks.js | 32++++++++++++++++++++++++++++++++
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 }); +}