Lessn: script para acortar URLs
Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos.
Lessn
Vía / Script & Style
Lessn es un script en PHP5 y MySQL que permite realizar un acortador de URLs al estilo micurl o parecidos.
Lessn
Vía / Script & Style
Steponas Kazakevicius has written up a new tutorial about file uploading and, more specifically, making an upload tool that can handle interruptions. Have you ever been to a website that offers downloads of stuff? And while you are waiting for the download, there are lots of ads around? Sure you have. I have too. The last day I was downloading stuf …
No lo he podido probar, y aún así las funcionalidades están un poco limitadas. Pero se puede usar Skype mediante PHP, aunque necesitaremos:
Un ejemplo sería el siguiente:
<?php
// Event sink:
class _ISkypeEvents {
function AttachmentStatus($status) {
echo ">Attachment status $status\n";
}
function CallStatus($call, $status) {
echo ">Call $call->id status $status\n";
}
}
// Create a Skype4COM object:
$skype = new COM("Skype4COM.Skype");
// Create a sink object:
$sink =& new _ISkypeEvents ();
$sink->convert = $skype->convert();
// Connect to the sink:
com_event_sink($skype, $sink, "_ISkypeEvents");
// Create a conversion object:
$convert = $skype->convert;
$convert->language = "en";
// Start the Skype client, minimized and with no splash screen:
if (!$skype->client()->isRunning()) {
$skype->client()->start(true, true);
}
// If the user status is not "online", change user status to "online":
if ($skype->currentUserStatus() == $convert->textToUserStatus("OFFLINE")) {
$skype->changeUserStatus($convert->textToUserStatus("ONLINE"));
}
// Create a user object
$user = $skype->user("echo123");
echo "User " . $user->handle . " online status is " . $convert->onlineStatusToText($user->onlineStatus) . "\n";
// Place a call
$call = $skype->PlaceCall($user->handle);
// Wait for the call to be "in progress" and report an error if:
while ($call->status <> $convert->textToCallStatus("INPROGRESS")) {
if ($call->status == $convert->textToCallStatus("FAILED") ||
$call->status == $convert->textToCallStatus("REFUSED") ||
$call->status == $convert->textToCallStatus("CANCELLED") ||
$call->status == $convert->textToCallStatus("FINISHED") ||
$call->status == $convert->textToCallStatus("BUSY"))
die ("Call status " . $convert->callStatusToText($call->status));
else
com_message_pump (500);
}
// Send dtmf tones:
com_message_pump (10000);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "0";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "1";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "2";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "3";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "4";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "5";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "6";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "7";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "8";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "9";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "#";
com_message_pump (500);
if ($call->status == $convert->textToCallStatus("INPROGRESS")) $call->dtmf = "*";
// Finish the call:
if ($call->status <> $convert->textToCallStatus("FINISHED")) $call->finish();
//Sleep:
com_message_pump (1000);
?>
AJAX Locking es una librerÃa de PHP que nos permite bloquear el acceso a los recursos del servidor a las peticiones AJAX. Ocurre con frecuencia que cuando una aplicación usa AJAX se efectuen muchas llamadas al servidor, accediendo todos a los mismos recuersos, pudiendo obtener resultados no muy deseados.
En estos casos, esta liberÃa es lo más adecuado, ya que bloquea recursos del servidor, previniendo estos errores.
AJAX Locking
VÃa / PHP Classes
Aunque a algunos puedan parecerle consejos obvios, no hay que olvidar que no todo el mundo que programa en PHP controla el lenguaje.
VÃa / PHPDeveloper.org
Mi amigo Christian me ha comentado que la entrada anterior sobre Twitter sería más interesante si mostrara los datos sobre un término.
Pues dicho y hecho, tan sólo se necesitan dos scripts, uno para recuperar los datos y otro para mostrarlos. El primero habrá que ponerlo en el cron para que recupere los datos cada cierto tiempo (en mi ejemplo busco “google” cada 2 minutos).
Hay que tener cuidado porque Twitter da un máximo de 2000 actualizaciones nuevas, por lo que tendremos que ajustar los tiempos de consulta en Twitter.
El script que lee los datos es el siguiente:
<? php
function insertar($consulta, $ult) {
global $db;
$data = json_decode(file_get_contents('http://search.twitter.com/search?q='.urlencode($consulta).'&refresh=true&since_id='.$ult));
$n = isset($data->total) && $ult != $data->max_id? $data->total:0;
$db->queryExec('INSERT INTO estadisticas (fecha, n) values ('.time().', '.$n.')');
if (!$ult) $db->queryExec("INSERT INTO opciones (clave, valor) values ('ultimo', ".$data->max_id.")");
else $db->queryExec("UPDATE opciones SET valor = ".$data->max_id." where clave='ultimo' ");
}
$consulta = $_GET['q'];
// Limpio para poder usarlo en el nombre para la BD
$_consulta = preg_replace('/[^A-Z0-9]/i', '_', $consulta);
if ($db = new SQLiteDatabase($_consulta.'.db')) {
$q = @$db->query("SELECT valor FROM opciones Where clave='ultimo'");
if (!$q) {
$db->queryExec('CREATE TABLE estadisticas (fecha real, n real, PRIMARY KEY (fecha));');
$db->queryExec('CREATE TABLE opciones (clave text, valor text, PRIMARY KEY (clave));');
$q = $db->query("SELECT valor FROM opciones Where clave='ultimo'");
}
$r = $q->fetchAll(SQLITE_ASSOC);
$ult = 0;
if (!empty($r)) $ult = $r[0]['valor'];
insertar($consulta, $ult);
}
?>
Y el script que dibuja la gráfica es:
<? php
$desde = strtotime($_GET['desde']);
$hasta = strtotime($_GET['hasta']);
$consulta = $_GET['q'];
// Limpio para poder usarlo en el nombre para la BD
$_consulta = preg_replace('/[^A-Z0-9]/i', '_', $consulta);
if ($db = new SQLiteDatabase($_consulta.'.db')) {
$q = $db->query("SELECT fecha, n FROM estadisticas Where fecha>".$desde." and fecha<".$hasta);
$r = $q->fetchAll(SQLITE_ASSOC);
foreach($r as $item) {
$x[] = $item['n'];
$l[] = $item['fecha'];
}
}
header('Location: http://chart.apis.google.com/chart?chtt=Line+Chart&chts=000000,12&chs=1000x600&chf=bg,s,ffffff|c,s,ffffff&chxt=x,y&chxl=0:|'.implode('|', $l).'|1:|'.implode('|', $x).'&cht=lc&chd=t:75.00,16.66,0.00,8.33,100.00&chdl=Label+1&chco=0000ff&chls=1,1,0');
Actualización: Google Charts no deja meter muchos valores por lo que la gráfica de arriba sólo saca las 20 últimas actualizaciones
Php5Tube es una clase open source que permite acceder de forma sencilla a la API de Youtube, procesando la respuesta XML y devolviendo un array de datos fáciles de leer que convierte el desarrollo en algo intuitivo.
Un ejemplo de uso sería el siguiente:
//get or create youtube username
if( isset($_GET['user']) ){$youtube_user = $_GET['user'];}
else {$youtube_user = 'rickrolled';}
//create phptube object and get videos
include_once("Php5tube.php");
$php5tube = new Php5tube('Video','User','Comment');
$videos = $php5tube->getUserVideos($youtube_user);
Comments are closed.
Voy a parecer la mosca cojonera del blog, pero aún asÃ:
Se ha estado hablando mucho de los acortadores de URLs. No son buenos.
-aportan un nuevo punto de fallo
-ocultan la dirección final (no sé donde me estoy dirigiendo, podrÃa ser un sitio con fama de contener virus y otro software dañino)
en caso de que se den de baja ( http://tr.im ) lo intentó hace poco y armó una buena en la blogosfera obligándoles a rectificar
-resulta innecesario su uso en la mayorÃa de ocasiones y, como se indica en varios sitios, lo correcto es una de las siguientes dos opciones:
1) que cada sitio se gestione sus propias URLs cortas de forma que si el sitio se da de baja también se pierden las URLs cortas, pero al menos ya depende de un punto de fallo (la página en la que se publican).
2) que los sitios más importantes empiecen a ofrecer el servicio de URLs cortas como permalinks a los artÃculos. Si el script publicado aquà tiene esa finalidad, perfecto, ese serÃa el camino a seguir.
Estoy de acuerdo con alsanan, y añado otro argumento: el rendimiento. Una redirección extra significa más tiempo de espera y mayor carga para las conexiones y servidores. De hecho, la existencia de los acortadores sólo tiene sentido por cosas como Twitter –lo cual me parece una estupidez porque bien podÃa Twitter permitir poner enlaces sin ser necesario poner la URL en el texto del mensaje–, y de hecho yo ya he visto ejemplos donde se utilizan acortadores para ocultar el verdadero destino del enlace (publicitario).
No obstante, si se van a usar acortadores de URL, mejor que sean scripts conocidos y libres como el que presenta el post.
Un saludo.