Tutorial básico de Quickjs

Iniciado por @XSStringManolo, 9 Enero 2021, 03:38 AM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Tutorial básico de quickjs.

Qué es:
Quickjs es un entorno de ejecución (motor) de javascript que cumple en gran medida con el estandar de javascript.

Sirve para interpretar, ejecutar o compilar codigo javascript.


Cómo se compara a Node.js y a Chrome:
Quickjs es mucho más pequeño que node o v8. Se ejecuta de forma rápida sin esperar al cargar scripts y ocupa poco espacio, lo que lo hace ideal para crear pequeños scripts y utilidades para la consola de comandos de Linux, Windows o Termux.
                                                     
Como se instala:
Puedes descargarlo de su página oficial, de github y compilarlo o utilizando apt-get install quickjs


A parte del javascript estandar que más trae:
Trae 2 librerías preinstaladas que podemos importar. std y os.
La librería std trae varias funciones del lenguaje de C y la librería os trae hilos, funciones para abrir procesos, y varias utilidades.


Al lio:
holaMundo.js
Código (javascript) [Seleccionar]
console.log("Hola mundo");

Puedes ejecutarlo con el comando qjs holaMundo.js
También puedes compilarlo con qjsc -o holaMundo holaMundo.js


correrCualquierComando.js
Código (javascript) [Seleccionar]
import * as std from "std";
let run = comando => {
  let prog = std.popen(comando, "r");
  let r, msg = "";
  while ((r = prog.getline()) != null) {
    msg += r + "\n";
  }
  return msg;
}

console.log( run("ls") );
console.log( run("ls && pwd") );



generadorDeArchivos.js
Código (javascript) [Seleccionar]
import * as std from "std";
console.log(`Generador de archivos 2021

Genera el esqueleto de archivos para no tener que escribir a mano partes recurrentes de archivos comunes.


1. Proyecto HTML
2. Reporte de Seguridad

Selecciona el número correspondiente a la opción que deseas.`);

let opcionUsuario = +std.in.getline();

if (opcionUsuario === 1) {
  let fd = std.open("index.html", "w");
  fd.puts(`<!DOCTYPE html>
<html lang="en">
  <head prefix="og:http://ogp.me/ns#">
    <meta charset="utf-8">
    <link rel="icon" href="data:;base64,iVBORw0KGgo=">
    <title>Index.html</title>
    <!--
      <meta property="og:type" content="website">
    -->
    <link rel="stylesheet" href="./code.css">
    <meta name="theme-color" content="#ffffff">
  </head>

  <body>


    <script src="./main.js"></script>
  </body>
</html>`);
  fd.close();

  fd = std.open("main.js", "w");
  fd.close();

  fd = std.open("code.css", "w");
  fd.puts(`body {
  margin: 0 0 0 0; /* Remove ugly left side border */
  text-size-adjust: none; /* Fix Android Big Text */
  text-rendering: optimizeLegibility; /* Improve text */
}

  /* Media query */
  @media (min-width: 0px) and (orientation:landscape) {
  body {
    font-size: 1.1vw;
  }
}`);
  fd.close();
} else if (opcionUsuario === 2) {
  console.log("Esta opción se programará en el futuro");
}




scraper.js
Código (javascript) [Seleccionar]
import * as std from "std";

let run = comando => {
  let prog = std.popen(comando, "r");
  let r, msg = "";
  while ((r = prog.getline()) != null) {
    msg += r + "\n";
  }
  return msg;
}

let getTargetAndSelector = () => {
  let returnValues = {};
  for(let i in scriptArgs) {
    if (scriptArgs[i] == "-t" || scriptArgs[i] == "--target") {
      returnValues.target = scriptArgs[+i+1];
    } else if (scriptArgs[i] == "-s" || scriptArgs[i] == "--selector") {
      returnValues.selector = scriptArgs[+i+1];
    }
  }
  if (returnValues.target && returnValues.selector) {
    return [returnValues.target, returnValues.selector];
  } else {
    throw `Usage:
-t  --target  Url to download
-s  --selector Selector to use

Example: qjs scraper.js -t https://example.com -s h1`;
  }
}


let result = run(`curl ${getTargetAndSelector()[0]} -A "Mozilla/5.0" --silent | pup ${getTargetAndSelector()[1]}`);
console.log(result);


Puedes compilarlos y meterlos en bin y darle permisos para usarlos como cualquier otro comando sin necesidad de estar en la misma carpeta que el código.
qjsc -o scraper scraper.js && cp scraper ~/../usr/bin/ && chmod +775 ~/../usr/bin/scraper
scraper -t https://example.com -s a



Documentación Official Quickjs: https://bellard.org/quickjs/quickjs.html


Documentación Herramienta Pup para usar selectores en la linea de comandos: https://github.com/ericchiang/pup

open_18

Pedir un solo CARÁCTER ALFANUMERICO (a-z, 1..9, ¿+¿/ etc) mediante una función. por favor

@XSStringManolo

Cita de: open_18 en  8 Noviembre 2021, 22:28 PM
Pedir un solo CARÁCTER ALFANUMERICO (a-z, 1..9, ¿+¿/ etc) mediante una función. por favor

Código (javascript) [Seleccionar]
import * as std from "std"; // importa libreria std para manejo de archivos en quickjs

const pedirUnSoloCaracter = texto => { // funcion para pedir un caracter
  console.log(texto); // texto a mostrar al usuario solicitando el caracter
  const fd = std.open("/dev/stdout", "r") // abre el archivo de salida estandar en modo lectura
  const linea = fd.getline(); // lee toda la linea
  fd.close(); // cierra el archivo

  if (linea.length > 1) { // La linea contiene mas de un caracter
    throw new Error("Mas de un caracter");
  } else if (! /[a-zA-Z0-9]/.test(linea) ) { // alfanumerico
    if (linea === "ñ" || linea === "ç") { // maneja caracteres extra que no contempla la expresión regular a-zA-Z
      return linea;
    }
    // else implicito { // si no es alfanumerico o alguno de los caracteres manejados, tira el error
    throw new Error("El caracter no es una letra o un numero");
  } else {
    // retorna el caracter
    return linea;
  }
}


/* Instrucciones del programa */

try { // meneja las excepciones
  const caracter = pedirUnSoloCaracter("Introduce un caracter"); // pide un caracter
  console.log("El caracter introducido es " + caracter); // muestra el caracter si no hubo errores
} catch (err) { // captura posibles errores
  console.log(err); // muestra el error.
}