Voy a poner el codigo en respuestas al post dividido por problemas con cloudflare :-\
/*Intento tomar el imput del usuario por consola C++,
crear un documento.html con javascript,
aplicarle la siguiente funcion javascript al imput del usuario
var cifrado = encodeURIComponent("imputDelUsuario");
escribir el resultado de la funcion javascript en el codigo fuente del documento.html usando
la funcion javascript document.write(cifrado);
obtener todo el codigo fuente del documento.html dentro de la variable string cifrar en c++
y usar find para buscar en el string que contiene el codigo fuente el resultado de la funcion
en javascript. Esto ultimo aun sin implementar. */
/*Problemas que tengo:
1 - document.write(cifrado) no me escribe el resultado de la funcion
encodeURIComponent("imputDelUsuario");
No entiendo por que.
2 - Quiero hacer el codigo portable y no conozco ninguna alternativa multiplataforma
a system ("start Documento.html"); para abrir el navegador por defecto con el documento.
3 - Esto forma parte de un proyecto bastante mas grande de librerias que utilizo entre
otras cosas para obtener geolocalizacion a traves del navegador y guardarlo en C++. Por
lo que alternativas en C++ que subtituyan la funcion encodeURIComponent() no son viables.
Tambien intento hacer la libreria para que me permita tener acceso a elementos de escritorio
desde javascript, como rutas de ficheros, etc.
4 - Esta funcion que no incluyo en este codigo tambien me esta dando problemas:
void abrir_nueva_pestanhaHTML(string url, string mensaje)
{
string nuevapestanha1 = "<a target=\"_blank\" href=\"";
string nuevapestanha2 = "\">";
string nuevapestanha3 = "</a>";
ContenidoH = ContenidoH + nuevapestanha1 + url + nuevapestanha2 + mensaje + nuevapestanha3;
}
Resulta que en la url del navegador se me anhade toda la direccion del archivo documento.html
en plan:
c:\\Carpeta\Carpeta2\documento.html\www.google.com en lugar de: www.google.com
5 - Con esta funcion tambien tengo problemas. Hago la llamada asi:
formateo_textoJS("blue", "18", "Courier, monospace");
La funcion es:
void formateo_textoJS(string colorFondo, string tamanhoFuente, string fuenteFamilia)
{
string fondo1 = "document.body.style.backgorundColor =";
string fondo2 = "\";";
ContenidoJ = ContenidoJ + startScript + fondo1 + colorFondo + fondo2 + finScript;
salto_lineaJS();
string tamanho1 = "document.body.style.fontSize =";
string tamanho2 = "px\";";
ContenidoJ = ContenidoJ + startScript + tamanho1 + tamanhoFuente + tamanho2 + finScript;
salto_lineaJS();
string fuente1 = "document.body.style.fontFamily =";
string fuente2 = "\";";
ContenidoJ = ContenidoJ + startScript + fuente1 + fuenteFamilia + fuente2 + finScript;
}
En el codigo fuente de documento.html todo es correcto, pero no sucede nada.
*/
Aqui el codigo completo: https://pastebin.com/hcgChAqj
1. No probé el código, pero hasta donde puedo ver, me parece que genera lo que debería.
El único contenido (aparte de etiquetas html y body) que documento.html tendrá es:
<script>var cifrado = encodeURIComponent("textoacifrar");</script><br><script>document.write(cifrado);</script>
Porque imagino que no esperarás que ese archivo contenga el resultado del script, ya que, naturalmente, eso se genera dinámicamente cada vez que abres la página en el navegador, y no es parte del documento html en sí.
2. Cierto, no hay ninguna alternativa estándar multiplataforma. En Windows, existen las funciones ShellExecute y ShellExecuteEx, que serían lo recomendable, pero si no manejas la API de Windows, puedes usar system.
4. En el link necesitas escribir completo: http://www.google.com, no sólo www...
5. Te falta abrir las comillas en los valores, por ejemplo, lo que estás generando es:
document.body.style.backgorundColor=blue"
en vez de ="blue".
1. Tienes idea de como puedo obtener lo que me sale en la ventana del navegador? Es decir, el resultado de la funcion. Al final estoy por pintar la pantalla de gris para sacar el resultado a base de foto, rollo autocaptcha de bot. Pero me parece una solucion muy exagerada para un problema que seguro tenga fácil solucion.
2. La api de windows me parece un descalabro. Le ataco de vez en cuando pero me van mas librerias portables. Revisare laa funciones que comentas, total necesito usar librerias para abrir el navegador. Paso de meterme en librerias nuevas.
4. Probaré así, pero me suena que ya probara.
5. Si no me lo dices no lo veo... Y yo a romperme la cabeza pensando que el navegador era incompatible porque uso principalmente un opera de 2008 para pruebas.
Muchas gracias.
Sé que a veces encontrar información sobre cómo usar APIs nativas es algo complicado (encontrar descripciones de las funciones sí es fácil, pero cómo usarlas es otra cosa...), así que te pongo un ejemplo de uso para lo del navegador.
En Windows:
#include <windows.h>
...
ShellExecute(NULL, "open", "Documento.html", NULL, NULL, SW_NORMAL );
En Linux, y en general sistemas tipo Unix, incluyendo Mac OS X:
#include <spawn.h>
extern char **environ;
...
pid_t processID;
char *argV[] = {"xdg-open", "Documento.html", NULL};
posix_spawnp(&processID, "xdg-open", NULL, NULL, argV, environ);
xdg-open abre el archivo o URL en el navegador por defecto.
Si decides usar algo de esto, ya te recomiendo buscar información sobre qué hace cada parámetro, etc. para entender bien lo que se está haciendo, pero creo que se facilita mucho habiendo visto un ejemplo concreto como este.
Si ya sabes sobre compilación condicional (#ifdef, #elif, etc.), puedes usarlo para incluir lo anterior en tu código y que compile donde sea sin cambios. En tal caso, las macros predefinidas _WIN32, __linux__, y __APPLE__ son tu amigas.
Sobre el resultado de la función JS, necesitas "algo" que entienda y ejecute código javascript y se puede comunicar con tu programa. En este caso, sería algún motor/librería de javascript en C/C++, como V8 o Duktape. Pero V8 es de Google, y por experiencias anteriores con código de esa compañía... imagino que incluso lograr compilarlo llevará bastante trabajo.
Otras formas de hacerlo implicarían comunicarse de alguna forma con el navegador. En Linux hay algunos que funcionan en modo texto, y ahí podría ser relativamente sencillo hacer que tu programa lo ejecute y capture su salida en un string, por ejemplo. Pero necesitarías asegurarte de que el usuario tenga ese programa, y además no sé si en Windows haya algo parecido. Comunicarse con programas gráficos también suele ser posible, pero más complicado, propenso a errores, y tendrías que tener código específico para cada navegador posible. Vamos, no es práctico. Realmente la mejor opción, más simple y portable, es usar una librería tipo Duktape.
Ese es exactamente mi problema. Solo mirando la libreria ya se entiende que parametros toman las funciones y tal. El problema viene cuando los propios argumentos usan tipos de datos propios de las librerias y ahí ya es difícil encontrar explicación.
Gracias por los consejos y los codigos de ejemplo. Si ya sabia lo de los archivos con #ifdef para ejecutar solo ese codigo en sistemas especificos. Ando mucho por als carpetas de includes de varias librerias y tengo visto en el propio main usar esa caracteristica.
Mirare las 2 librerias a ver que tal. No las conocía.
Gracias por la idea del navegador de texto, ni se me pasó por la cabeza. Para windows conozco el Lynx que no tengo ni que descargarlo porque ya lo tenía en el pendrive. Aunque ni idea de si ejecuta javascript, lo dudo mucho. Probaré.