Archivo

Entradas Etiquetadas ‘direcciones’

Creando un navegador web basado en gtkwebkit y gtkmm [Actualizado: 15/11/2010]

Miércoles, 3 de Noviembre de 2010 Gaspar Fernández 7 comentarios

webkitAhora, vamos a ir un poco más allá, aunque los ejemplos están hechos por mí, en parte me he basado un poco en la documentación de gtkmm (recomendable, llena de ejemplos e información interesante de cada widget), aunque ahora voy a utilizar algo de investigación propia.

El método a seguir será parecido a veces anteriores, un archivo principal, y una clase (con archivos cpp y h). Al compilar el proyecto, ha ocupado entre 45Kb y 60Kb, por lo que para ser un navegador no ocupa demasiado. Además, si leemos un poco la documentación de GtkWebkit veremos que podemos modificar el comportamiento del módulo para integrarlo en nuestras aplicaciones.

Para este pequeño proyecto he utilizado WebkitGtk+ >=1.1.7 y no Webkitmm porque este último no está muy avanzado en su desarrollo… y de paso quería practicar cómo podía comunicarme con widgets hechos en C en lugar de C++.

[ wk.cpp - Programa principal ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <gtkmm.h>
#include "wkmain.h"

WkWindow *wkwind;

int main(int argc, char *argv[])
{
  Main entorno (argc, argv);
  // Creamos la ventana
  WkWindow wkwind;

  // Ejecutamos
  entorno.run(wkwind);

  return 0;
}

[ wkmain.h ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#ifndef _WKMAIN_H
#define _WKMAIN_H

#include <gtkmm.h>
#include <webkit/webkit.h>

#define CLICK_CONNECT(widget, method) widget->signal_clicked().connect(sigc::bind<Widget*>(sigc::mem_fun(*this, &method),(Widget*)widget))

using namespace Gtk;

class WkWindow : public Window
{
 public:
  WkWindow();
  ~WkWindow();

// Click en el botón go
  void go_click(Widget *sender);

// Actualizamos la barra de progreso
  bool wkprogress();

// Cargamos una web
  void carga_web(Glib::ustring url);

  VBox vb;          // Divisiones en la vertical
  HBox cabecera; // Barra superior
  Label texto;      // Texto de dirección
  Entry direccion; // Editor de texto para la dirección
  Button *go;      // Botón para ver la web
  GtkWidget *web_view;  // Widget de webkit
  ScrolledWindow scroll;   // Ventana de scroll para páginas web grandes (más grandes que la ventana)
  Statusbar statusbar;     // Barra de estado
  ProgressBar progressbar; // Barra de progreso

 private:
  int timeout;    // Aquí almacenamos los eventos timeout
};

#endif

Bien, viendo esto, veremos que será un navegador sencillo (una entrada de texto para la dirección, un botón para ver la web, el motor webkit para ver la web, y una barra de estado con una barra de progreso).

Vemos el código wkmain.cpp:

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

WkWindow::WkWindow() : texto("Dirección: ")
{
  // Configuro la ventana
  set_title("Navegador con Webkit");
  set_border_width(5);
  set_default_size(800, 600);

// Las barras de scroll salen automáticamente
  scroll.set_policy(POLICY_AUTOMATIC, POLICY_AUTOMATIC);

  // Configuro la cabecera
  go = new Button(Stock::GO_FORWARD);
  cabecera.pack_start(texto, PACK_SHRINK);
  cabecera.pack_start(direccion, PACK_EXPAND_WIDGET);
  cabecera.pack_start(*go, PACK_SHRINK);

  CLICK_CONNECT(go, WkWindow::go_click);

  vb.pack_start(cabecera, PACK_SHRINK);
  vb.set_spacing(3);        // Espacio de 3pixels entre elementos

// Configuramos el módulo webkit ! Atención es de Gtk, no Gtkmm
  web_view=webkit_web_view_new ();

// Llamamos al método de carga de web
  carga_web("http://totaki.com/poesiabinaria/");

// Seguimos añadiendo objetos al Vbox
  vb.pack_start(scroll, PACK_EXPAND_WIDGET);

// El moulo webkit no podemos añadirlo tan fácil, tenemos que añadir
// el webkit al scrollbox mediante funciones de gtk (gtk_container_add).
// Además, para sacar el objeto de Gtk del scrollbox (gtkmm) debemos llamar al método gobj()
  gtk_container_add(GTK_CONTAINER(scroll.gobj()), web_view);

  vb.pack_start(statusbar, PACK_SHRINK);
  statusbar.pack_start(progressbar, PACK_EXPAND_WIDGET);
  progressbar.set_fraction(0.0); // Progreso al 0%

  add(vb);

  show_all_children();
}

WkWindow::~WkWindow()
{

}

void WkWindow::carga_web(Glib::ustring url)
{
  progressbar.set_fraction(0.0); // Progreso al 0%
  webkit_web_view_load_uri (WEBKIT_WEB_VIEW (web_view), url.data());

// Generamos un evento programado, cada 50ms se generará la señal
// y llamaremos al método wkprogress()
  timeout=Glib::signal_timeout().connect(sigc::mem_fun(*this, &WkWindow::wkprogress),50); // Actualizamos cada 50ms
}

void WkWindow::go_click(Widget *sender)
{
  carga_web(direccion.get_text());
}

bool WkWindow::wkprogress()
{
  // Calculamos el progreso
  double progreso=webkit_web_view_get_progress(WEBKIT_WEB_VIEW(web_view));

  // Pasamos el progreso a la progressbar (que está en la statusbar)
  progressbar.set_fraction(progreso);
  return (progreso!=0);     // Cuando progreso sea 0, devolveremos FALSE, y se desconectará el signal_timeout
}

Está todo más o menos explicado en los comentarios. Para compilar hacemos lo siguiente:

$ g++ -o webkitex wk.cpp wkmain.cpp `pkg-config –cflags gtkmm-2.4 webkit-1.0` `pkg-config –libs gtkmm-2.4 webkit-1.0`

(Haciendo coincidir las versiones de webkit y gtkmm

NOTA: Aunque en el blog parezca que pone `pkg-config -libs …` pone `pkg-config –libs` (dos signos menos).

ACTUALIZACIÓN 15/11/2010: Gracias a ChineseGeek por sus comentarios he añadido una versión compatible con versiones de webkit inferiores a 1.1.7. Podemos descargarlo desde aquí: (webkit_cpp.tar.bz2 2.5Kb).

Sobre los 100 millones de usuarios de Facebook ¿Robados? ¿Filtrados?

Domingo, 1 de Agosto de 2010 Gaspar Fernández Sin comentarios

Hace unos días, surgió la noticia de un hacker, Ron Bowes de Skull Security, quien con un par de scripts (ahora mismo la web no funciona) ha conseguido recopilar toda la información pública de más de 100 millones de perfiles de Facebook, es decir, lo que es visible para todos, los que no tenemos como amigos, además es un archivo 100% legal, ya que lo único que la información recopilada es la que los usuarios comparten con todos. Por si fuera poco está publicada en un torrent 100% accesible a cualquiera.

Paso a continuación una serie de enlaces donde ver la noticia: Alt1040, Blog de Manuel Pereira González, ABC, Thinq, y muchos más sitios.

Aunque en muchos titulares habla de que el archivo incluye números de teléfono y fechas de nacimiento, querría desmentir todo aquello, copio un fragmento del archivo README con el contenido del archivo:

facebook.rb The script used to generate these files (v1)
facebook.nse The script that will be used for the second pass (v2)
facebook-urls The full URLs to every profile
facebook-names-original All names, including duplicates
facebook-names-unique All names, no duplicates
facebook-names-withcount All names, no duplicates but with a count
facebook-firstnames-withcount All first names (with count)
facebook-lastnames-withcount All last names (with count)
facebook-f.last-withcount All first initial last name (with count)
facebook-first.l-withcount All first name last initial (with count)

Vemos que, como mucho, contiene el nombre y la URL, aunque por otra parte, he de decir que no sería demasiado difícil extraer los datos que figuren como públicos en estos perfiles, aunque todavía hay esperanza para aquellos que no han hecho sus datos privados.

Aunque por otra parte, yo que tengo el perfil abierto, con todos los datos públicos, no aparezco en el listado, por lo que es interesante buscarse. Para ello:

$ bzcat facebook-urls.txt.bz2 | grep [identificativo de tu URL de Facebook]

Donde el [identificativo de tu URL de Facebook] es lo que ponemos en la barra de direcciones para acceder a nuestro perfil: http://www.facebook.com/….

O también podemos buscar por nombre

$ bzcat facebook-names-unique.txt.bz2 | grep nombre

Así saldrán todos los que se llaman como tú.

Eso sí, leo en Alt1040 otra noticia, muchas empresas se están descargando el torrent, a pesar de sus políticas de protección de datos, anti-torrents, etc, y esperemos que en los próximos días no empiece a llegar spam por Facebook.

Hacer que konqueror conecte por FTP con los datos de .netrc ; Usar nombres de usuario que contienen arrobas

Martes, 20 de Julio de 2010 Gaspar Fernández Sin comentarios

Si usamos frecuentemente un archivo .netrc para almacenar nombres de usuario y contraseñas para servidores FTP, tal vez queramos utilizar esas mismas contraseñas para Konqueror sin necesidad de volver a escribirlas, ni almacenarlas en Kwallet (ya están en un sitio, ¿para qué meterlas en más lugares?). O tal vez se nos presente el siguiente problema, tenemos que conectar con un servidor FTP que permite conexiones anónimas, y al mismo tiempo el nombre de usuario (o la contraseña) que tenemos contiene el carácter arroba (@), tendríamos que meterlo en la barra de direcciones y al menos en KDE3.5.10 no nos deja hacerlo (no lo he probado en kde4), y la única forma rápida que se me ocurrió fue a través de .netrc.

Bien, si vamos a crear un archivo .netrc de primeras, leer esto, es un post de un proyecto que utilizaba .netrc para conectar donde se explica qué tiene que contener el archivo.

Luego editamos el archivo $HOME/.kde/share/config/kio_ftprc (si no existe lo creamos), por ejemplo con nano:

$ nano ~/.kde/share/config/kio_ftprc

e introducimos la siguiente línea:

EnableAutoLogin=true

Lo más fácil ahora es reiniciar KDE, pero yo opté por ejecutar lo siguiente:

$ dcopserver_shutdown
$ dcopserver

Como véis estoy utilizando dcop, esta solución es para KDE3, aunque supongo que para KDE4 habrá alguna solución sin usar dbus. Por otra parte, en mi sistema no uso KDE como gestor de ventanas, sólo utilizo algunas aplicaciones de KDE, por lo que no garantizo que se reinicie el gestor de ventanas.

Con esta solución, desde Konqueror pude abrir un FTP cuyo nombre de usuario contenía una arroba

Visita otras webs de la red