Usar los web-hooks de Discord desde PHP

Para enviar mensajes a Discord desde PHP debemos crear un web-hook desde Discord.
Debemos ir a ajustes de nuestro servidor > Integraciones y crear el web-hook , deberemos seleccionar el nombre y el canal donde se mostraran los mensajes y copiar la URL que nos facilita.

En nuestro servidor web ( hemos usado xampp) escribimos el siguiente script PHP:

<?php
//API URL
$url = 'URL-QUE-HEMOS-COPIADO-ANTES';

//create a new cURL resource
$ch = curl_init($url);

//setup request to send json via POST
$data = array(
    'content' => 'Hello DorniSoft!!'
    //'embeds' => '123456'
);
$payload = json_encode($data);

print_r($payload);

//attach encoded JSON string to the POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);

//set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));

//return response instead of outputting
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

//execute the POST request
$result = curl_exec($ch);

print $result;

//close cURL resource
curl_close($ch);

?>

Véase que la variable $data es un array con los parametros que le pasamos a Discord y el elemento ‘content’ es el mensaje que queremos enviar al canal .
Luego realizamos una petición POST a Discord enviandole el JSON y el mensaje se recibe en el canal seleccionado .

Espero que te haya gustado 😉

Números pseudoaleatorios en función de una fecha

Para conseguir que una determinada entrada provoque una salida aleatoria que sea siempre igual para esa determinada entrada, hemos creado este script en php que nos devuelve un número pseudoaleatorio en función de una determinada fecha, en este caso vamos a obtener un numero aleatorio entre el 0 y el 72. Y siempre será el mismo para esa determinada fecha.

<?php



$fechaInicio=strtotime("01-04-2022");
$fechaFin=strtotime("03-04-2032");
$stadistica=array();
for($i=$fechaInicio; $i<=$fechaFin; $i+=86400){
	$ano=date('Y',$i);
	$ano =substr($ano,2,2);
	$mes=date('m',$i);
	$dia=date('d',$i);
	
    
	$aleatorio=((((3*$dia)+(8*$mes)+($ano))%73)+((7*$dia)+(17*$mes)+(2*$ano)))%73;
	$stadistica[$aleatorio]+=1;
	echo"ano $ano----- mes $mes---------dia $dia-----</BR>";

}

ksort($stadistica);

foreach($stadistica as $clave=>$valor){
	//el [clave numero aleatorio]=>ocurrencias del mismo
	echo "[".$clave."]=> ". $valor."</BR>";
}
?>

Ejecutamos el script para ver los resultados y vemos que en el periodo de fechas comprendido entre 01-04-2022 y 03-04-2032 los resultados son los siguientes: [numero aleatorio]=>ocurrencias del mismo.

[0]=> 47
[1]=> 51
[2]=> 50
[3]=> 48
[4]=> 50
[5]=> 49
[6]=> 49
[7]=> 52
[8]=> 52
[9]=> 50
[10]=> 50
[11]=> 52
[12]=> 48
[13]=> 49
[14]=> 51
[15]=> 48
[16]=> 50
[17]=> 51
[18]=> 49
[19]=> 51
[20]=> 50
[21]=> 50
[22]=> 50
[23]=> 50
[24]=> 50
[25]=> 50
[26]=> 50
[27]=> 50
[28]=> 50
[29]=> 49
[30]=> 50
[31]=> 52
[32]=> 51
[33]=> 52
[34]=> 53
[35]=> 49
[36]=> 50
[37]=> 51
[38]=> 48
[39]=> 48
[40]=> 54
[41]=> 49
[42]=> 50
[43]=> 53
[44]=> 49
[45]=> 50
[46]=> 52
[47]=> 49
[48]=> 49
[49]=> 50
[50]=> 49
[51]=> 50
[52]=> 50
[53]=> 49
[54]=> 49
[55]=> 51
[56]=> 50
[57]=> 52
[58]=> 50
[59]=> 51
[60]=> 51
[61]=> 50
[62]=> 49
[63]=> 50
[64]=> 49
[65]=> 50
[66]=> 51
[67]=> 50
[68]=> 50
[69]=> 51
[70]=> 49
[71]=> 50
[72]=> 50

Esperamos que te haya gustado 😉

Subir un proyecto existente a GIT

Si estamos trabajando en windows o mac deberemos bajar GIT para windows o mac desde el enlace GIT . Lo instalamos, en principio siguiente siguiente, las configuraciones por defecto suelen llegar.

Deberemos tener una carpeta con el proyecto que queramos subir al repositorio de GIT

1-A continuación desde nuestra cuenta en github, bitbucket o gitLab creamos un nuevo repositorio y le damos un nombre en este caso juegoAhorcado

Una vez creado el repositorio el propio gitHub nos dice como proceder… solo utilizaremos la primera linea:

2-Ahora abrimos el gitBash que nos acabamos de descargar buscamos en aplicaciones de windows: ‘git’ y aparece el git bash.
Entonces nos dirigimos a la carpeta que tiene el proyecto, si está en C:\xampp\htdocs\juegoAhorcado hacemos:

cd C:/xampp/htdocs/juegoAhorcado

3-Una vez situados en la carpeta del proyecto que debería estar lleno hacemos

git init

para iniciar el proyecto.

4-Seguidamente escribimos la linea que nos ofreció gitHub para conectar los dos repositorios

git remote add origin https://github.com/dornisoft/juegoAhorcado.git

5-Ahora hay que añadir los archivos con la sentencia

git add .

Con este comando añadimos todos los archivos del directorio

6-Es el momento de hacer un commit para pasar los archivos al HEAD que es donde se guardan las modificaciones

git commit -m "commit inicial"

7-En este momento si usamos la consola git por primera vez necesitaremos registrarnos con nuestro usuario de gitHub

git config --global user.name "dornisoft"
git config --global user.email "miemail@ejemplo.com"

8-Y por último subimos el repositorio local al repositorio remoto de gitHub con el comando

git push -u origin master

Y ya tendriamos nuestro codigo en gitHub.

DORNI-TRON

El equipo de DorniSoft tiene el gusto de presentar el juego TRON con graficos en 2D donde dos jugadores avanzan por una cuadricula dejando sus estelas y pierde el que sale de la cuadricula o choca con alguna estela.

Lo podéis descargar desde la sección de descargas o comprar en DorniShop.
Disponible para sistemas windows en formato exe
Tambien te puedes bajar el codigo fuente desde la seccion descargas…
Estamos trabajando en la version online del Tron que pronto estará disponible.
Esperamos que te guste 😉

Bot de Telegram en PHP

En este articulo vamos a explicar como enviar mensajes a un canal de telegram con un bot. Primero hay que crear un bot e inclurlo en el canal. En este ejemplo vamos a enviar mensajes cuando las olas sean superiores a 4 metros por lo que tenemos una tabla (prediccion) mySQL con varias columnas una de ellas es la fecha y la otra es la altura de las olas

fechaalturaolas
2020-12-085
2020-12-092
La tabla preddiccion tendrá este aspecto

Programaremos un script en PHP para que compruebe si en el día actual hay olas de mas de 4 metros y si es así que envie un mensaje al canal.
Para esto necesitamos el id del canal que lo conseguimos mandando un mensaje al canal y ejecutando la consulta:

https://api.telegram.org:443/bot<TOKEN>/getUpdates

También necesitamos el TOKEN que nos proporciona Telegram al crear el bot.

Para ello crearemos dos funciones en PHP hayOlas() que comprobará si hay olas y en caso que superen los 4 metros se ejecutará la función sendMessage() que recibirá como parametros (id canal,textoMensaje) y enviará el mensaje.
Veamos el codigo

<?php
function hayOlas(){
	
	$db=mysqli_connect($server,$user,$password,$database);
	$fecha=date('Y-m-d');
	$result=mysqli_query($db,"SELECT alturaolas from prediccion where alturaolas> 4 and fecha='$fecha'");
	$numeroFilas=mysqli_num_rows($result);
	if($numeroFilas==1){
		$texto="Hay olas de mas de 4 metros. ";
		sendMessage(<ID_CANAL>,$texto);
	}
}


function sendMessage($chatId, $text) 
{
  $TOKEN = "<NUESTRO_TOKEN>";
  $TELEGRAM = "https://api.telegram.org:443/bot$TOKEN"; 

  $query = http_build_query(array(
    'chat_id'=> $chatId,
    'text'=> $text,
    'parse_mode'=> "Markdown", // Optional: Markdown | HTML
  ));

  $response = file_get_contents("$TELEGRAM/sendMessage?$query");
 
  return $response;
}

hayOlas();
?>

Una vez escrito el script en PHP, necesitamos automatizar la tarea, para que todos los dias se ejecute el script y haga la comprobación de si hay olas, por lo que es recomendable crear una tarea programada para ejecutarlo, por ejemplo con el CRON

Mas info

En el canal DorniSoft de Telegram ya está activo este bot
Espero que te guste… 😉

Temporizador en Java

Hoy presentamos el temporizador escrito en Java, con esta aplicación puedes poner una cuenta atrás en el PC, y una voz te avisará cuando acabe el tiempo programado para la tarea. También puedes parar y reanudar el tiempo, ya que funciona con hilos de ejecución. Para reproducir el mp3 que viene integrado he utilizado la libreria JLayer.

Puedes encontrar la aplicación para windows en descargas y el código en github

Esperamos que te guste…

Resolver sudokus con Java y recursividad

Hoy traemos el código necesario para resolver sudokus en Java utilizando recursividad.
Tendremos dos clases una Principal.java con el main y otra clase sudoku.java.
La clase sudoku.java contendrá la funcion resolverSudoku() que utilizará recursividad. Y las funciones necesarias para comprobar que el numero introducido en la celda es correcto(esValido()):

package sudoku;

/**
 *
 * @author Javi
 */
public class Sudoku {
    
    
    private int tablero[][];
    static final int  SIN_ASIGNAR=0;
    
    public Sudoku(int sudoku[][]){
        this.tablero=sudoku;
    }
    
    
    public boolean resolverSudoku(){
        
        for(int fila=0;fila <9;fila++){
            for (int columna=0;columna<9;columna++){
                if(tablero[fila][columna]==SIN_ASIGNAR){
                    for (int numero =1;numero<=9;numero++){
                        if(esValido(fila,columna,numero)){
                            tablero[fila][columna]=numero;
                            if(resolverSudoku()){
                                return true;
                            }else{
                                tablero[fila][columna]=SIN_ASIGNAR;
                            }
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }
    
    private boolean esValido (int fila, int columna, int numero){
        return !(contieneFila(fila,numero)||contieneColumna(columna,numero)||contieneCaja(fila,columna,numero));
    }
    
    private boolean contieneFila(int fila,int numero){
        for(int columna=0;columna<9;columna++){
            if(tablero[fila][columna]==numero){
                return true;
            }
        }
        return false;
    }
    
    private boolean contieneColumna(int columna,int numero){
        for(int fila=0;fila<9;fila++){
            if(tablero[fila][columna]==numero){
                return true;
            }
        }
        return false;
    }
    
    private boolean contieneCaja(int fila, int columna,int numero){
        int f = fila - fila % 3;
        int c = columna -columna % 3;
        for(int i =f;i<f+3;i++){
            for(int j = c; j<c+3;j++){
                if(tablero[i][j]==numero){
                    return true;
                }
            }
        }
        return false;
    }
    
public void ImprimirSudoku(){
    for(int i=0;i<9;i++){
        for (int j=0;j<9;j++){
            System.out.print(tablero[i][j]);
        }
        System.out.println("");
    }
}    

    
}

Con esta clase conseguimos que nos devuelva un sudoku solucionado.
Con la clase principal.java creamos el objeto miSudoku y le pasamos el tablero que queremos que resuelva.

package sudoku;

/**
 *
 * @author Javi
 */
public class Principal {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        
        int tablero[][]={{6,9,5,3,7,1,8,4,2},
                         {0,0,0,0,0,0,0,0,0},
                         {8,4,1,2,9,6,3,7,5},
                         {0,0,0,0,0,0,0,0,6},
                         {0,0,0,0,0,0,0,0,8},
                         {5,6,2,0,1,7,4,3,9},
                         {0,0,0,0,0,0,1,8,7},
                         {0,0,0,0,0,0,0,0,0},
                         {7,5,4,0,0,0,0,0,0}};
        
        Sudoku miSudoku=new Sudoku(tablero);
        miSudoku.resolverSudoku();
        miSudoku.ImprimirSudoku();
                
        }
        
    }

En este video aprendí como era el algoritmo.

video youtube

He hecho una versión del código anterior en PHP pero el algoritmo es el mismo, lo podeis probar https://dornisoft.es/sudoku

Espero que te guste 😉

Introducción a webservices con aplicación Java 8 y servidor PHP

Hola, en el artículo de hoy trataré el tema de webservices.
Los webservices son muy útiles cuando queremos distribuir nuestra aplicación y, en vez de dar acceso a la base de datos desde la aplicación directamente con un driver JDBC, lo que hacemos es que sea el webservice el que nos procese las peticiones a la base de datos. De esta manera, no tenemos que incluir la contraseña y usuario de la base de datos en la aplicación a distribuir y corremos menos riesgos de seguridad, ya que un usuario un poco espabilado podría descompilar nuestra aplicación y hacerse con las credenciales de la base de datos.

Usaremos el servidor XAMPP y ubicaremos los archivos php en la carpeta htdocs/service

Para empezar, crearemos la base de datos(webservice) con una única tabla(adjetivos) con 3 campos: Id, adjetivo,fecha.
Id (int, auto increment, primary key)
adjetivo(varchar)
fecha(timestamp)

Ahora crearemos el webservice que será un archivo php que procese las peticiones que se le envíen desde la aplicación Java, vamos a hacer que el web service procese dos peticiones, una de insertar datos y otra de hacer una consulta.

El archivo insert.php tendría este aspecto

<?php
$adjetivo=$_POST['adjetivo'];
$db=mysqli_connect("localhost","root","","webservice");
mysqli_query($db,"insert into adjetivos (adjetivo)values('$adjetivo')");
?>

El archivo select.php tendría este aspecto:

<?php
$db=mysqli_connect("localhost","root","","webservice");
mysqli_query($db,"set names 'utf8'");
$res=mysqli_query($db,"select * from adjetivos");
$fila=mysqli_fetch_array($res);
do{
	echo $fila["adjetivo"].",".$fila["fecha"]."\n";
	
}while($fila=mysqli_fetch_array($res));
?>

Una vez hecho ésto haremos nuestra aplicación en Java que le pasará un parámetro POST al webservice, éste la procesará y nos devolverá los resultados en el caso del select o insertará el adjetivo en el caso del insert, para lo que he creado una clase base adjetivos.java para convertir a objetos los resultados de la petición select.
La clase adjetivo.java tiene este aspecto:

import java.util.Objects;

/**
 *
 * @author Javi
 */
public class adjetivos {
    private int id;
    private String adjetivo;
    private String fecha;

    public adjetivos(String adjetivo) {
        this.adjetivo = adjetivo;
    }

    public adjetivos(String adjetivo, String fecha) {
        this.adjetivo = adjetivo;
        this.fecha = fecha;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAdjetivo() {
        return adjetivo;
    }

    public void setAdjetivo(String adjetivo) {
        this.adjetivo = adjetivo;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    @Override
    public String toString() {
        return "adjetivo{ adjetivo=" + adjetivo + ", fecha=" + fecha + "}\n";
    }

Usaré 2 clases con main, una para el ejemplo con insert y otra para el ejemplo con select.
En la clase main correspondiente al insert, le pasaremos un parámetro POST a PHP para que lo procese y lo inserte en la base de datos, esta clase sería una como la siguiente:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;





/**
 *
 * @author Javi
 */
public class Servicio {

    /**
     * @param args the command line arguments
     */
    
    private static final String USER_AGENT = "Mozilla/5.0";

    private static final String POST_URL = "http://localhost/service/insert.php";

    private static final String POST_PARAMS = "adjetivo=encomiable";
    
    
    public static void main(String[] args) throws IOException {
       

          sendPOST();
    }
    
    private static void sendPOST() throws IOException {
        URL obj = new URL(POST_URL);
        HttpURLConnection httpURLConnection = (HttpURLConnection) obj.openConnection();
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("User-Agent", USER_AGENT);

        // Aqui le pasamos los parametros
        httpURLConnection.setDoOutput(true);
        OutputStream os = httpURLConnection.getOutputStream();
        os.write(POST_PARAMS.getBytes());
        os.flush();
        os.close();
        // Una vez pasados los parametros recibimos el codigo de respuesta

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println("POST Response Code :: " + responseCode);

       
    }
    
}

El código anterior pasará un parámetro al archivo php con el adjetivo encomiable y será php el encargado de insertarlo en la base de datos

Ahora seguiremos haciendo un select de la tabla adjetivos y transformando los resultados en un arrayList de objetos adjetivos, en este caso no le vamos a pasar parámetros al select por lo que el parámetro será una cadena vacía, el siguiente código muestra como se debe proseguir

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;


/**
 *
 * @author Javi
 */
public class leerphp2 {

    /**
     * @param args the command line arguments
     */
     private static final String USER_AGENT = "Mozilla/5.0";

    private static final String POST_URL = "http://localhost/service/select.php";

    private static final String POST_PARAMS = "";
    
    
    
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        sendPOST();
    }
    private static void sendPOST() throws IOException {
        ArrayList <adjetivos> mati = new ArrayList<>();
        
        URL obj = new URL(POST_URL);
        HttpURLConnection httpURLConnection = (HttpURLConnection) obj.openConnection();
        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("User-Agent", USER_AGENT);

        // For POST only - START
        httpURLConnection.setDoOutput(true);
        OutputStream os = httpURLConnection.getOutputStream();
        os.write(POST_PARAMS.getBytes());
        os.flush();
        os.close();
        // For POST only - END

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println("POST Response Code :: " + responseCode);

        if (responseCode == HttpURLConnection.HTTP_OK) { // success
            BufferedReader in = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();

            while ((inputLine = in .readLine()) != null) {
                response.append(inputLine);
                
                String [] fields = inputLine. split(",");
                mati.add(new adjetivos (fields[0],fields[1]));
                
            } in .close();

            // print result
            System.out.println(response.toString());
        } else {
            System.out.println("POST request not worked");
        }
        System.out.println("Escribiendo array");
        for (int i = 0; i < mati.size(); i++) {
            System.out.println(mati.get(i).toString()+"\n");
            
        }
    }
}

Enlace de interésJAVA POST

Espero que te haya gustado 😉

DorniSoft Inc.