Últimos temas

Estadísticas del foro
  • Mensajes del foro:94
  • Temas del foro:59
  • Miembros:58
  • Último miembro:Howardunogs


Enviado por: chujalt
14-03-2021, 20:57
Foro: Linux
- Sin respuestas

Los que usamos Linux sabemos la existencia de un comando de consola mediante el cual te puedes bajas una web completa de manera recursiva, esto es, todo su contenido con todos los directorios que contiene y archivos. Este comando es Wget.

A los que tenemos un sitio web no nos puede hacer gracia que se puedan bajar todo su contenido, imágenes, archivos o puede que tengamos zonas privadas que wget se las saltará y también se las bajará.

Hay dos maneras de evitarlo, editando el archivo robots.txt, la menos recomendable, o editando el archivo .htaccess.


robots.txt

Según wikipedia un archivo robots.txt en un sitio web funcionará como una petición que especifica que determinados robots no hagan caso a archivos o directorios específicos en su búsqueda. Esto puede realizarse, por ejemplo, para dejar fuera de una preferencia los resultados de una búsqueda avanzada, o de la creencia que el contenido de los directorios seleccionados puede ser engañoso o inaplicable a la clasificación del sitio en su totalidad.

Para evitar que wget se descargue el sitio web completo tendremos que añadir esta línea

Código:
User-agent: wget
Disallow: /

Si nos da los mismo que se bajen la web, pero hay directorios que no queremos que se bajen se puede indicar también

Código:
User-agent: wget
Disallow: /zona_privada/

Pero este método tiene una contra, si se es un usuario normal posiblemente funcionará, pero si el que se quiere bajar la web ya es un poco mas conocedor de como funciona wget, sabrá que se puede saltar esta restricción con este línea

Código:
wget -e robots=off --wait 1 http://tu_sitio.com


Con esto no hará caso al archivo robots.txt.




.htaccess

 Para evitar la descarga indeseada de nuestro sitio web de forma mas segura editaremos el archivo .htaccess añadiéndole las siguientes líneas

Código:
RewriteEngine On
Options +FollowSymLinks
RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*(libwww|curl|wget|python|nikto|scan).* [NC,OR]
RewriteRule ^(.*)$ - [F]

Con esto no solo evitaremos el uso de wget sino también el uso de otros comandos, como curl.
La última linea llevará al que quiere bajar el sitio web a un mensaje de denegado el acceso.

Si lo que queremos es ponerlo uno a uno y todo el listado de los bad bosts mas conocidos, sería así

Código:
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Otro_bad_bot [OR]
...
...
RewriteRule ^.* - [F,L]

Los "..." significa que vamos metiendo las lineas que queramos.

Una lista de los bad bots mas conocidos AQUI



Enviado por: chujalt
14-03-2021, 20:55
Foro: Linux
- Sin respuestas

Saludos amigos...
 
Después de muchos apuros, leer bastante y meter muchas veces la pata, voy a explicar en esta guía como conseguí instalar Ubuntu 16.4 junto a Windows 10 en un pc UEFI con particiones tipo GTP.
 
En primer lugar debemos descargarnos la ISO de Ubuntu 16.4.1 LTS de la página oficial.
 
Para preparar el USB de instalación, desde Windows Instalamos el programa Rufus en su última versión.



[Imagen: rufus_es.png]




Una cosa muy importante es la opción Tipo de la partición y del sistema de destino, que debe estar en Tipo de partición GTP para computadora UEFI (intenté ponerle una ISO Debian, pero al poner esta opción me decía que no es posible). El sistema de archivos FAT32 y todo lo demás lo dejamos lo que nos pone por defecto. Buscamos la ISO a instalar y le damos al botón de comenzar.

 
Una vez terminada la instalación, vamos a nuestro PC, pinchamos nuestro USB, lo encendemos y entramos en la BIOS, debemos desactivar la opción de SECURE BOOT y en la orden de arranque poner en primer lugar nuestro USB de instalación.

 
Durante la instalación, cuando te pregunta donde instalarlo, yo le puse personalizada, creando tres particiones /, /home y swap. En el sitio donde instalar el gestor de arranque seleccioné la raiz del disco duro.

 
Termina la instalación y cuando reiniciamos vemos que no sale el Grub y que se inicia Windows directamente. No pasa nada.

 
Volvemos a poner nuestro USB y reiniciamos el PC, pero esta vez en modo live. Una vez abierto necesitamos instalar el programa boot-repair disk, para ello, en una ventana de terminal introducimos

Código:
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair


Con esto se nos instalará y se nos abrirá


[Imagen: boot_repair.png]




Debemos ir a las opciones avanzadas y abrir la pestaña "opciones de GRUB". Una vez ahí, lo que debemos hacer es desactivar la opción "SecureBoot" y asegurarnos que la opción "purgar GRUB antes de reinstalarlo" está activada. Le damos a aceptar y se pondrá a trabajar.

 
Cuando haya terminado nos pedirá que en una ventana de terminal pongamos unas ordenes bash que el mismo nos proporciona. Hay que ponerlas una a una. Después nos saldrá una ventana donde nos informará de lo que ha hecho y nos dará una linea para introducir en un terminal Windows si sigue sin salir el GRUB.

 
Reinicié y seguía arrancando Windows directamente. Se ejecuta un terminal de Windows, pero ojo, como administrador y se pone esa línea antes proporcionada por Boot-repair. Reinicié y ya sale el GRUB con los dos sistemas instalados, a parte de otras opciones.

 
Esto es lo que he hecho yo tras mucho pelear y es lo que me ha funcionado, espero que a alguien le sirva.

  
Saludos.



Enviado por: chujalt
14-03-2021, 20:53
Foro: Linux
- Sin respuestas

Saludos.

OJO, este método funciona a los que tienen la bios EFI, en las bios antiguas no funcionará.

De vez en cuando Windows 10 hace una actualización importante y los que también tenemos instalados Linux nos llevamos la mala sorpresa que al reiniciar el ordenador arranca Windows directamente, el GRUB a desaparecido.

Tranquilos, hay una rápida y fácil solución.

Una vez Windows abierto ejecutamos como administrador su consola de comandos y escribimos la siguiente línea:

Código:
bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi

Reiniciamos y nos volverá a salir el GRUB.

Saludos.



Enviado por: chujalt
07-03-2021, 21:56
Foro: php
- Sin respuestas

Saludos.

En este post vamos a trabajar con un archivo excel desde php. Para este ejemplo vamos a trabajar con uno con dos columnas y 24 filas, Una de las columnas son horas (de 1 a 24) y en cada hora un precio, Si lo queréis bajar AQUI.

También necesitaremos un archivo para leer el archivo excel , se trata de excel_reader2.php, merito a su autor, te lo puedes bajar de AQUI.

Bien, manos a la obra, en primer lugar tendremos que cargar excel_reader2.php y el propio archivo excel, por lo que al principio de la página pondremos:

Código PHP:
<?php
require_once 'excel_reader2.php';
$data = new Spreadsheet_Excel_Reader("excel.xls");
?>

Ahora vamos a crear un array con los valores de las filas y columnas con las que queremos trabajar, pondremos:

Código PHP:
$pepe[1] = $data->raw(12);
$pepe[2] = $data->raw(22);
$pepe[3] = $data->raw(32);
$pepe[4] = $data->raw(42);
$pepe[5] = $data->raw(52);
$pepe[6] = $data->raw(62);
$pepe[7] = $data->raw(72);
$pepe[8] = $data->raw(82);
$pepe[9] = $data->raw(92);
$pepe[10] = $data->raw(102);
$pepe[11] = $data->raw(112);
$pepe[12] = $data->raw(122);
$pepe[13] = $data->raw(132);
$pepe[14] = $data->raw(142);
$pepe[15] = $data->raw(152);
$pepe[16] = $data->raw(162);
$pepe[17] = $data->raw(172);
$pepe[18] = $data->raw(182);
$pepe[19] = $data->raw(192);
$pepe[20] = $data->raw(202);
$pepe[21] = $data->raw(212);
$pepe[22] = $data->raw(222);
$pepe[23] = $data->raw(232);
$pepe[24] = $data->raw(242); 

Con esto tendremos un array con las 24 horas y el precio de cada una de ellas.
Vamos a ver el array, escribimos:

Código PHP:
print_r($pepe); 

y obtendremos:

Código:
Array ( [1] => 121,13838673 [2] => 119,52911591 [3] => 116,56370045 [4] => 113,88535263 [5] => 113,5654684 [6] => 114,06312135 [7] => 116,70671779 [8] => 117,69285692 [9] => 115,08610616 [10] => 114,66693383 [11] => 113,06913537 [12] => 110,99255973 [13] => 110,92340009 [14] => 111,20173737 [15] => 110,60698288 [16] => 110,49370675 [17] => 108,41762924 [18] => 108,57877114 [19] => 110,6906715 [20] => 112,97520268 [21] => 119,26980347 [22] => 121,53522841 [23] => 119,32600748 [24] => 117,68262512 )

Otra manera de ver los valores del array:

Código PHP:
var_dump($pepe); 

Y obtendremos:

Código:
array(24) { [1]=> float(121,13838673) [2]=> float(119,52911591) [3]=> float(116,56370045) [4]=> float(113,88535263) [5]=> float(113,5654684) [6]=> float(114,06312135) [7]=> float(116,70671779) [8]=> float(117,69285692) [9]=> float(115,08610616) [10]=> float(114,66693383) [11]=> float(113,06913537) [12]=> float(110,99255973) [13]=> float(110,92340009) [14]=> float(111,20173737) [15]=> float(110,60698288) [16]=> float(110,49370675) [17]=> float(108,41762924) [18]=> float(108,57877114) [19]=> float(110,6906715) [20]=> float(112,97520268) [21]=> float(119,26980347) [22]=> float(121,53522841) [23]=> float(119,32600748) [24]=> float(117,68262512) }

Ahora vamos a mostrar los valores ordenados de menor a mayor precio:

Código PHP:
asort($pepe);
var_export($pepe); 

Obtenermos:

Código:
array ( 17 => 108.41762924, 18 => 108.57877114, 16 => 110.49370675, 15 => 110.60698288, 19 => 110.69067149999999, 13 => 110.92340009, 12 => 110.99255973, 14 => 111.20173737, 20 => 112.97520268, 11 => 113.06913537, 5 => 113.5654684, 4 => 113.88535263, 6 => 114.06312135, 10 => 114.66693383, 9 => 115.08610616, 3 => 116.56370045, 7 => 116.70671779, 24 => 117.68262512, 8 => 117.69285692, 21 => 119.26980347, 23 => 119.32600748, 2 => 119.52911591, 1 => 121.13838672999999, 22 => 121.53522841, )

Vamos a Mostrar el precio mas bajo:

Código PHP:
echo min($pepe); 

Obtenemos:

Código:
108,41762924

Vamos a mostrar la hora en la que está el precio mas bajo:

Código PHP:
$min_keys = array(); 
foreach(
$pepe as $pepo => $pepi
 
   if($pepi == min($pepe)) array_push($min_keys$pepo); 

echo 
$min_keys[0]; 

y obtenemos:

Código:
17

En esta ocasión vamos a mostrar los precios de menor a mayor:

Código PHP:
foreach($pepe as $pepito){
 
   echo $pepito."<br>";


Con lo que obtendremos:

Código:
108,41762924
108,57877114
110,49370675
110,60698288
110,6906715
110,92340009
110,99255973
111,20173737
112,97520268
113,06913537
113,5654684
113,88535263
114,06312135
114,66693383
115,08610616
116,56370045
116,70671779
117,68262512
117,69285692
119,26980347
119,32600748
119,52911591
121,13838673
121,53522841

Vamos a mostrar los horarios de menor a mayor precio:

Código PHP:
$juan array_keys($pepe);
foreach(
$juan as $juanito){
 
   echo $juanito."<br>";


Y obtendremos:

Código:
17
18
16
15
19
13
12
14
20
11
5
4
6
10
9
3
7
24
8
21
23
2
1
22

Vamos a mostrar los horarios con el precio ordenados de menor a mayo:

Código PHP:
foreach ($pepe as $hora => $precio) {
 
   echo " A las $hora horas el precio será $precio.\n";
 
   echo "</p>";


Obtenemos:

Código:
A las 17 horas el precio será 108,41762924.
A las 18 horas el precio será 108,57877114.
A las 16 horas el precio será 110,49370675.
A las 15 horas el precio será 110,60698288.
A las 19 horas el precio será 110,6906715.
A las 13 horas el precio será 110,92340009.
A las 12 horas el precio será 110,99255973.
A las 14 horas el precio será 111,20173737.
A las 20 horas el precio será 112,97520268.
A las 11 horas el precio será 113,06913537.
A las 5 horas el precio será 113,5654684.
A las 4 horas el precio será 113,88535263.
A las 6 horas el precio será 114,06312135.
A las 10 horas el precio será 114,66693383.
A las 9 horas el precio será 115,08610616.
A las 3 horas el precio será 116,56370045.
A las 7 horas el precio será 116,70671779.
A las 24 horas el precio será 117,68262512.
A las 8 horas el precio será 117,69285692.
A las 21 horas el precio será 119,26980347.
A las 23 horas el precio será 119,32600748.
A las 2 horas el precio será 119,52911591.
A las 1 horas el precio será 121,13838673.
A las 22 horas el precio será 121,53522841.

Ahora vamos a mostrar el precio mas bajos que yo quiero, en esta ocasión el precio mas bajo y el cuarto mas bajo:

Código PHP:
echo $juan[0]."<br>";
echo 
$juan[3]; 

La salida será:

Código:
17
15

Vamos a calcular el valor medio del precio:

Código PHP:
$promedio=array_sum($pepe)/count($pepe); 
echo 
"El valor medio de hoy es: $promedio €"

Nos mostrará:

Código:
El valor medio de hoy es: 114,52755089167 €

Vamos a mostrar el precio de la hora actual de nuestro sistema y lo compara con la media:

Código PHP:
$tiempo getdate(time());
$hora $tiempo["hours"];
$valor_hora_actual $pepe[$hora];
echo 
"la hora actual es $hora horas<br>";
echo 
"el valor medio del día de hoy es $promedio <br>";
echo 
"el precio de esta hora es $valor_hora_actual <br>";
if (
$valor_hora_actual >= $promedio)
{
    echo 
"Esta hora es mas cara que la media";
}
else
{
    echo 
"Esta hora es mas barata que la media";
    } 

Y obtenemos:

Código:
la hora actual es 20 horas
el valor medio del día de hoy es 114,52755089167
el precio de esta hora es 112,97520268
Esta hora es mas barata que la media


Bueno, ya está, espero que le sirva a alguien de ayuda.

Saludos.



Enviado por: chujalt
07-03-2021, 21:53
Foro: php
- Sin respuestas

Saludos amigos.

Si tenemos un servidor montado en casa y nuestro proveedor de internet no nos facilita una IP fija tendremos la necesidad de saber en todo momento nuestra IP pública. Vamos a montar un servicio tipo no-ip o DynDNS.

El servicio consta de dos partes, una en nuestro ordenador y por otra parte necesitaremos un servidor de internet, por ejemplo, si no tenemos un servicio de hosting, https://www.hostinger.es/ , nos ofrece de forma gratuita todo lo que necesitamos, 2 GB de almacenamiento, php y bases de datos MySQL. 



EN NUESTRO ORDENADOR

Tengo que aclarar que lo que explico a continuación lo he hecho bajo un sistema linux.

En  primer lugar crearemos un directorio en el servidor de nuestro pc, yo lo he llamado curl, la ruta sería /var/www/html/curl.

Abrimos nuestro editor de texto favorito y escribimos

Código:
#!/bin/bash
curl -d "value1=pepico" http://midominio.com/curl/index.php


Lo guardamos con el nombre 1.sh, por ejemplo, y le damos permisos de ejecución. En la última linea cambiar midominio.com por el de nuestro servidor de hosting, también, donde vemos value1=pepico. cambiamos el nombre por el que queramos.

Este script lo que hace es enviar el nombre de usuario a nuestra página index.php del servidor de hosting mediante el método post.

Ahora vamos a editar crontab para que nuestro script se ejecute cada dos horas. Abrimos un terminal y escribimos 

Código:
sudo gedit /etc/crontab


y en crontab añadimos esta línea

Código:
0 */2    * * *    root    /var/www/html/curl/1.sh


guardamos y cerramos. Como hemos dicho, ésto hará que nuestro script se ejecute cada dos horas.

Ya hemos terminado en nuestro PC, ahora iremos a nuestro servidor de hosting.



EN NUESTRO SERVIDOR DE HOSTING 

Deberemos crear una base de datos MySQL con nombre curl, con una tabla llamada datos y 4 columnas, id (int, primary key, auto_increment), nombre (varchar 50), ip (varchar 50) y fecha (timestamp, CURRENT_TIMESTAMP)

Ahora vamos a crear la página index que recogerá los datos que le hemos enviado antes por el script bash y los introducirá en nuestra base de datos. Paso previo es crear también una página conex.

conex.php

Código PHP:
<?php
// hostname o ip del servidor de Base Datos
$bd_host='localhost';
 
// nombre de usuario 
$bd_usuario='usuario';
 
// la contraseña para la BBDD  
$bd_password='contraseña';
 
// nombre del BBDD
$bd_base='curl';
$conexion = new mysqli($bd_host$bd_usuario$bd_password$bd_base);
 
if (
$conexion->connect_errno
{
 
   echo "No se pudo conectar a la Base Datos: (" $mysqli->connect_errno ") " $mysqli->connect_error;
}
?>


index.php 

Código PHP:
<?php

include("conex.php");
if(
$_POST)
 
     {
 
        $queryInsert "INSERT INTO datos (nombre, ip) VALUES ('".$_POST['value1']."', '".$_SERVER['REMOTE_ADDR']."');";
 
 
        $resultInsert mysqli_query($conexion$queryInsert); 
 
 
        if($resultInsert)
 
        {
 
           echo "<strong>Se ingresaron los registros con exito</strong>. <br>";
 
        }
 
        else
 
        {
 
           echo "No se ingresaron los registros. <br>";
 
        }
 
 
     }
?>


Con esto ya tenemos nuestra última ip metida en la base de datos.

Ahora vamos a crear dos sencillas páginas para saber cual es nuestra actual ip pública de nuestro PC, buscar.php y encontrado.php.

buscar.php

Código PHP:
<html>
<
head>
<
title>Entrada de enlaces</title>
<
meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</
head>

<
body>
<
form action="encontrado.php" method="post">
 
 Nombre:<br>
 
 <input type="text" name="nombre"><br><br>
 
 <input type="submit" value="Submit">
</
form>
</
body>
</
html


Nos mostrará un sencillo formulario donde debemos poner nuestro nombre de usuario que está en el script bash.

encontrado.php 

Código PHP:
<html>
<
head>
<
title>Entrada de enlaces</title>
<
meta charset="UTF-8">
</
head>
<
body>
<?
php
include("conex.php");
$consulta "SELECT nombre, ip, DATE_FORMAT(fecha, 'Con fecha: %d/%m/%y y hora: %H:%i:%s') AS fecha FROM datos WHERE nombre = '" $_POST["nombre"] . "' ORDER BY id  DESC LIMIT 1";
$resultado $conexion -> query($consulta);
echo 
"<span style='color: blue;'>Extracción de último dato ...</span> <br><br>";
while(
$fila $resultado -> fetch_array())
{
echo 
"Usuario: " $fila["nombre"] . "<br>";
echo 
"Última IP asignada: " $fila["ip"] . "<br>";
echo 
"" $fila["fecha"] . "<br><hr>";
}
mysqli_free_result($resultado);
mysqli_close($conexion);
?>
</body>
</html> 


Nos mostrará la última ip pública que tenemos asignada y a que fecha y hora se captó.

Cita:Extracción de último dato ... 

Usuario: pepico
Última IP asignada: 11.111.11.111
Con fecha: 29/04/17 y hora: 18:00:02



Todo esto está bien, pero queremos algo mas, no tener que ir a un formulario para saber nuestra ip, lo que queremos es poner en el navegador una dirección y que nos redireccione a nuestro servidor local, una dirección tipo "midominio.com/pepico". Recordad que pepico era nuestro usuario con el que se guardaban las ip de nuestro servidor local.

Bien, como al poner esa dirección en el navegador, el directorio pepico no existe, el servidor nos enviará un error 404, página no encontrada. Vamos a crear una página de error 404 tuneada por nosotros.

Antes de nada vamos a tener que tocar el archivo .htaccess para que cuando se de el error 404 nos muestre nuestra página 404. Abrimos el archivo .htaccess y añadimos la linea

Código:
ErrorDocument 404 /404.php
 
Con esto le decimos que cuando se produzca el error 404 nos muestre la página 404.php.

Ahora vamos a crear la página 404.php, que a continuación diré lo que hace.

404.php

Código PHP:
<html>
<
head>
<
title>Entrada de enlaces</title>
<
meta charset="UTF-8">
<
script language="JavaScript">
function 
enviar()
{
document.form.submit();
}
</
script>
</
head>
<
body onload="enviar()">
<?
php
$url 
 "{$_SERVER['REQUEST_URI']}";
$resultado str_replace("/"""$url);
?>
<form method="POST" action="curl/redireccionar.php" name="form">
<p><input type="text" value="<?php echo $resultado?>" name="nombre"></p>
<p><input type="submit" value="Enviar" name="B1"></p>
</form>
</body>
</html> 


Esta página lo que hace es eliminar de la dirección web todo lo que vaya antes de la barra "/", en nuestro caso quedaría pepico y lo envía directamente a otra página que luego vamos a crear, redireccionar.php, la cual estará dentro del directorio curl.

redireccionar.php

Código PHP:
<html>
<
head>
<
title>Entrada de enlaces</title>
<
meta charset="ISO-8859-1" />
</
head>
<
body>
<?
php
include("conex.php");
$consulta "SELECT nombre, ip, DATE_FORMAT(fecha, 'Con fecha: %d/%m/%y y hora: %H:%i:%s') AS fecha FROM datos WHERE nombre = '" $_POST["nombre"] . "' ORDER BY id  DESC LIMIT 1";
$resultado $conexion -> query($consulta);
 
if (
$fila $resultado -> fetch_array())

echo 
"<script language=\"javascript\">window.location.href=\"http://" $fila["ip"] . "\";</script>";
}
else {
echo 
"NO encontrado";
}
mysqli_free_result($resultado);
mysqli_close($conexion);


?>
</body>
</html> 


Esta página lo que hace es buscar en la base de datos la última ip registrada del usuario que queremos, en este caso pepico , y nos redirecciona directamente a esa ip. Si ese usuario no existe o nos equivocamos al escribir la dirección, la página actuará como una página 404 y nos mostrará un mensaje de "no encontrada".

Todo el proceso, desde que pones la dirección en el navegador hasta que te redirecciona a la ip de tu servidor local es limpio y automático.


Bueno, espero que le sirva a alguien de ayuda.

Saludos.



Enviado por: chujalt
07-03-2021, 21:51
Foro: php
- Sin respuestas

Saludos

Vamos a ejecutar un programa python desde php e imprimir las salidas que tengan dicho programa.

Primero el programa python, como veréis es muy sencillo, sólo imprime unas lineas, asigna un valor a una variable y la imprime 

Código:
#! /usr/bin/env python
print ("Soy Python me han llamado desde PHP. Linea 1")
print ("Soy Python me han llamado desde PHP. Linea 2")
print ("Soy Python me han llamado desde PHP. Linea 3")
print ("Soy Python me han llamado desde PHP. Linea 4")
print ("Soy Python me han llamado desde PHP. Linea 5")
print ("Soy Python me han llamado desde PHP. Linea 6")
print ("Soy Python me han llamado desde PHP. Linea 7")
print ("Soy Python me han llamado desde PHP. Linea 8")
print ("Soy Python me han llamado desde PHP. Linea 9")
print ("Soy Python me han llamado desde PHP. Linea 10")

pepe = "Hola soy Pepe"
print (pepe)


Bien, ahora supongamos que queremos imprimir desde php la salida que pone "print ("Soy Python me han llamado desde PHP. Linea 4")". Entonces en nuestro código php deberíamos poner

Código:
<?php
$salida = array(); //contendrá cada linea salida desde la aplicación en Python
exec("python /var/www/html/phppython/contar.py", $salida);
echo $salida[3]."<br>";    }
?>


Lo que nos daría un resultado de 

Cita:Soy Python me han llamado desde PHP. Linea 4

Fijaros que en la última línea php he puesto $salida[3], acordaros que los arrays empiezan por el cero.

Si quisiéramos imprimir todas las salidas del programa python deberíamos hacer un bucle for

Código:
<?php
$salida = array(); //contendrá cada linea salida desde la aplicación en Python
exec("python /var/www/html/phppython/contar.py", $salida);
for($i = 0; $i < count($salida); $i++){
        echo $salida[$i]."<br>";
    }
?>

Lo que nos daría un resultado

Cita:Soy Python me han llamado desde PHP. Linea 1
Soy Python me han llamado desde PHP. Linea 2
Soy Python me han llamado desde PHP. Linea 3
Soy Python me han llamado desde PHP. Linea 4
Soy Python me han llamado desde PHP. Linea 5
Soy Python me han llamado desde PHP. Linea 6
Soy Python me han llamado desde PHP. Linea 7
Soy Python me han llamado desde PHP. Linea 8
Soy Python me han llamado desde PHP. Linea 9
Soy Python me han llamado desde PHP. Linea 10
Hola soy Pepe


Bueno, ya está, espero que le sirva a alguien

Saludos.



Enviado por: chujalt
07-03-2021, 21:48
Foro: Bash
- Sin respuestas

Saludos.

Vamos a hacer un menú de opciones en bash, es un menú bastante sencillo, pero demuestra todo el potencial que tiene.

El script es este:

Código:
#!/bin/bash

MENU="SELECCIONAR UNA OPCION DEL MENU: "
while :
do
  echo -e " \e[101;92m MENU PRINCIPAL \e[0m"
  PS3=$MENU

  select option in "Menu 1" "Menu 2" "Menu 3" "salir"
  do
    case $REPLY in 
      1) # menu 1
         echo -e "\e[30;107m Has pulsado la opcion $option \e[0m"
         sleep 2
         clear
         break
         ;;
      2) # menu 2
         echo -e " \e[30;107m Has pulsado la opcion $option \e[0m"
         sleep 2
         clear
         break
         ;;
      3) # menu 3
         echo -e " \e[30;107m Has pulsado la opcion $option \e[0m"
         sleep 2
         clear
         break
         ;;
      4) # salir
         clear
         break 2  #  sale del script
         ;;
      *) # tecla erronea
         echo -e "\e[1;31mHas pulsado una tecla erronea [${REPLY}]\e[0m"
         sleep 2
         clear
         break
         ;;
    esac
  done
done

exit 0
 

Al ejecutarlo nos saldrá este menú en la ventana del terminal

[Imagen: terminal_1.png]



Como vemos tenemos 4 opciones, menú 1, 2, 3 y la opción de salir. Vamos a pulsar la opción 1


[Imagen: terminal_2.png]



Si pulsamos la opción 4 saldremos del programa y si pulsamos cualquier otra tecla que no sea de las cuatro opciones nos informará que hemos pulsado una tecla errónea y tendremos la oportunidad de volver a seleccionar una opción.

Saludos.



Enviado por: chujalt
07-03-2021, 21:46
Foro: Bash
- Sin respuestas

Saludos.

Vamos a ver un script en bash el cual ordena los archivos de un directorio, lo que hace es enumerarlos, es decir, mantiene el nombre del fichero pero le pone delante el número de orden, 1-_-unarchivo, 2-_-otroarchivo... etc.

Primero veamos el script y luego comentamos:

Código:
#!/bin/sh
i=1
for f in *.*
do
  renombrar="$i"-_-"${f#*}"
  mv "$f" "$renombrar"
  i=$((i+1))
done


Este script se debe ejecutar en el directorio donde están los archivos a enumerar.

El script enumera todos los archivos del directorio, pero si queremos que, por ejemplo, sólo enumere los archivos con extensión mp3 deberemos cambiar la línea for f in *.* por for f in *.mp3 

Otro ejemplo, vamos a suponer que en ese directorio hay varios tipos de archivos (mp3, mp4, wav) y queremos enumerarlos por separado. Entonces vamos a reservar la serie 1000 para los archivos mp3, la serie 2000 para mp4... etc. Entonces cambiaremos la línea que hemos comentado antes y donde pone i=1 lo cambiaremos por i=1000, para los archivos mp4 cambiaremos for f in *.* por for f in *.mp4 e i=1 por i=2000 y así sucesivamente.

Ahora vamos a suponer que por cualquier razón, por ejemplo que tenemos archivos nuevos y hay que borrar la numeración para luego volver a enumerarlos, entonces ejecutaremos este script:

Código:
#!/bin/sh
for f in *.*
do
  renombrar=${f##*-_-}
  mv "$f" "$renombrar"
done


Esto dejará el archivo con su nombre original, sin la numeración. Acordaros que como está el script quitará la numeración a todos los archivos, si queréis hacerlo en una extensión en concreto deberéis ponerla.

Bueno, ya está, espero que le sirva a alguien.

Saludos.



Enviado por: chujalt
07-03-2021, 21:44
Foro: Python
- Respuestas (1)

Saludos.

Vamos a utilizar python y selenium (que es una librería de python) para loguearnos y escribir un post en un foro, todo ello de manera automática.

El script está probado en este mismo foro y funciona perfectamente, aunque en el que se publica aquí he puesto una dirección ficticia.

Lo que vamos a necesitar es, además de tener python instalado, instalarnos la librería selenium

Código:
sudo pip install selenium

y tener el controlador geckodriver, lo podeís bajar de AQUÍ.

Este trabajo está hecho bajo entorno linux y hay que tener ciertas nociones de html porque selenium busca entre los tags para poder trabajar. Lo que busca son elementos por name, id, texto del enlace, texto parcial del enlace, xpath, CSS, tagname y Classname.

Voy a poner en script completo y luego iremos linea por linea.

Código:
#!/usr/bin/env python    
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')
driver.get('https://paginaweb.com')
link = driver.find_element_by_link_text('Iniciar sesión').click()
time.sleep(2)
driver.find_element_by_id('quick_login_username').send_keys("Pepito")
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")
driver.find_element_by_name('submit').click()
time.sleep(5)
driver.find_element_by_link_text('Chistes').click()
time.sleep(2)
driver.find_element_by_class_name('new_thread_button').click()
time.sleep(5)
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")
driver.find_element_by_name('submit').click()
time.sleep(2)
driver.close()

Importamos webdriver de selenium
Código:
from selenium import webdriver

Importamos Time
Código:
import time

Vamos a trabajar con Firefox y le decimos donde está el ejecutable geckodriver
Código:
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')

Le decimos la página web a abrir
Código:
driver.get('https://paginaweb.com')

Buscamos un enlace que tenga el texto "Iniciar sesión" y que lo pulse
Código:
link = driver.find_element_by_link_text('Iniciar sesión').click()

Esperamos 2 segundos a que se cargue la página de autentificación
Código:
time.sleep(2)

En el formulario, la id de la caja de texto donde va el usuario es "quick_login_username" y le enviamos nuestro usuario
Código:
driver.find_element_by_id('quick_login_username').send_keys("Pepito")

En el formulario, la id de la caja de texto donde va la contraseña es "quick_login_password" y le enviamos nuestra contraseña
Código:
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")

En el formulario, el botón de enviar el name es "submit" y hacemos click en él
Código:
driver.find_element_by_name('submit').click()

Esperamos 5 segundos a que la autentificación se realice y se vuelva a cargar la página
Código:
time.sleep(5)

Vamos a postear un chiste, por lo que vamos a ir a la sección chistes, buscamos un enlace con el texto "Chistes" y hacemos click en él
Código:
driver.find_element_by_link_text('Chistes').click()

Esperamos 2 segundos a que se cargue la sección chistes
Código:
time.sleep(2)

El botón para crear un nuevo hilo es una class con el nombre "new_thread_button" lo buscamos y hacemos click en él
Código:
driver.find_element_by_class_name('new_thread_button').click()

Esperamos 5 segundos a que se cargue la caja para hacer los post
Código:
time.sleep(5)

En la caja para hacer posts, la caja de texto para poner el título del post tiene el name "subject", lo buscamos y enviamos el título
Código:
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")

El post en si está en un iframe, lo buscamos por el path, que puede ser absoluto o relativo (es este caso relativo), y le enviamos el texto
Código:
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")

Hacemos click en el botón de envío cuyo name es submit
Código:
driver.find_element_by_name('submit').click()

Esperamos 2 segundos para que se realice la grabación del post
Código:
time.sleep(2)

Y cerramos el navegador y la aplicación
Código:
driver.close()

Con esto habremos conseguido identificarnos y realizar un post.
Saludos.



Enviado por: chujalt
07-03-2021, 21:43
Foro: Python
- Respuestas (2)

Saludos.

Vamos a recoger los datos que nos interesan de una página web y los vamos a meter en una base de datos MySql para su almacenamiento y posteriormente tratar esos datos como mas nos convenga.

Yo trabajo en entorno linux, pero bajo Windows o MAc debería funcionar igual.

Para poder realizar este trabajo necesitaremos tener instalado MySql en nuestro PC. Además, entre otras librerías tenemos que tener instalada la de BeautifulSoup y el conector a la base de datos MySql

Código:
sudo pip install beautifulsoup4

sudo pip install mysql-connector

En este ejemplo vamos a trabajar con la página de la Bolsa de Madrid, si la quieres ver PULSA AQUI, concretamente en la sección donde nos da la información de las cotizaciones de las empresas del Ibex 35. Esta información se actualiza cada 15 minutos, pero nosotros vamos a ejecutar nuestro script a la hora de cierre para saber como han cerrado las cotizaciones día por día.

Yo he creado una base de datos llamada "ibex35" con una tabla llamada "diario" y en esta tabla 9 campos, id, nombre, fecha, ultimo, diferencia, max, min, volumen y efectivo.

Voy a poner el script completo y luego comentaremos por bloques.

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from bs4 import BeautifulSoup
import requests
from functools import reduce
import os
import mysql.connector
import datetime
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&punto=indice").text
soup = BeautifulSoup(website_url,'lxml')
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})
rows = soup.findAll("tr")[1:]
headers = {}
thead = soup.findAll("th")
for i in range(len(thead)):
   headers[i] = thead[i].text.strip().lower()
data = []
for row in rows:
   cells = row.find_all("td")
   item = {}    
   for i in headers:
       item[headers[i]] = cells[i].text  
   data.append(item)
pepe = json.dumps (data, indent=4)
diccionario = [
("\\u00fa", "u"),
("\\u00ed", "i"),
("\\u00e1", "a"),
("\\u20ac", "€")  
]
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)
data = json.loads(salida)
mydb = mysql.connector.connect(
 host="localhost",
 user="usuario",
 passwd="contraseña",
 database="ibex35"
)
mycursor = mydb.cursor()
for device in data:
  fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')
  sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
  val = (device["nombre"], fecha, device["ult."].replace(".", "").replace(",", "."), device["% dif."].replace(".", "").replace(",", "."), device["max."].replace(".", "").replace(",", "."), device["min."].replace(".", "").replace(",", "."), device["volumen"].replace(".", "").replace(",", "."), device["efectivo (miles €)"].replace(".", "").replace(",", "."))
  mycursor.execute(sql, val)
  mydb.commit()
  print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")
print ("Todos los datos han sido introducidos correctamente")



BLOQUE 1

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from bs4 import BeautifulSoup
import requests
from functools import reduce
import os
import mysql.connector
import datetime
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&punto=indice").text
soup = BeautifulSoup(website_url,'lxml')
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})

En este bloque cargamos todas las librerías necesarias, cargamos la página y metemos en una variable la tabla que nos interesa, concretamente la que tiene id = ctl00_Contenido_tblAcciones.



BLOQUE 2 

Código:
rows = soup.findAll("tr")[1:]
headers = {}
thead = soup.findAll("th")
for i in range(len(thead)):
   headers[i] = thead[i].text.strip().lower()
data = []
for row in rows:
   cells = row.find_all("td")
   item = {}    
   for i in headers:
       item[headers[i]] = cells[i].text  
   data.append(item)
pepe = json.dumps (data, indent=4)  

En este bloque con todos los datos almacenados de la tabla creamos un json con la estructura cabecera tabla / valor, eso por cada fila de la tabla.



BLOQUE 3 

Código:
diccionario = [
("\\u00fa", "u"),
("\\u00ed", "i"),
("\\u00e1", "a"),
("\\u20ac", "€")  
]
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)
data = json.loads(salida)
mydb = mysql.connector.connect(
 host="localhost",
 user="usuario",
 passwd="contraseña",
 database="ibex35"
)
mycursor = mydb.cursor()
for device in data:
  fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')
  sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
  val = (device["nombre"], fecha, device["ult."].replace(".", "").replace(",", "."), device["% dif."].replace(".", "").replace(",", "."), device["max."].replace(".", "").replace(",", "."), device["min."].replace(".", "").replace(",", "."), device["volumen"].replace(".", "").replace(",", "."), device["efectivo (miles €)"].replace(".", "").replace(",", "."))
  mycursor.execute(sql, val)
  mydb.commit()
  print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")
print ("Todos los datos han sido introducidos correctamente")

En este bloque lo primero que hacemos, como la página web tiene acentos y python no es amigo de ellos, ha escrito símbolos raros en las palabras que tenían acentos, cambiamos esos símbolos por las sílabas pero sin los acentos.
Volvemos a cargar en json, conectamos con la base de datos y hacemos un bucle for para hacer insert por cada fila de la tabla.

Nótese que debemos de hacer varios "replace" pues la información de la página nos da los miles en puntos y los decimales con comas, cosa que no admite la base de datos mysql, por lo que quitamos los puntos y las comas las transformamos en puntos. También transformamos el campo fecha en tipo "date".

Bueno, ya está, espero que le sirva a alguien.

Saludos.