[Java] mv6lib: ¡Accede a MV6 desde tu aplicación!

PiradoIV

Buenas,

He estado programando en esta última semana una API para acceder a esta página desde Java. ¿Para qué?, la idea era sacar una aplicación nativa para móviles con Android y, ya que estamos, la hago pública para que aprovechéis y hagáis algún programa útil para la comunidad.

¿Cómo lo he hecho?

No os frotéis las manos, la API no conecta a la base de datos de la web, simplemente hace peticiones HTTP al igual que lo hace un explorador web y extrae los contenidos mediante expresiones regulares. Más adelante podríamos mirar si queremos poder postear, firmar y demás desde la propia API.

¿Qué features tiene?

· Podemos ver las estadísticas básicas de la web (usuarios conectados, registros, hilos, número de posts).
· Ver información del perfil de un miembro.
· Recopilamos los últimos hilos de cada foro.
· Podemos sacar el contenido de cada post (autor, fecha, texto, ...)

¿Planes futuros?

Básicamente preparar excepciones para que los programas que hagáis sean más estables. También falta por sacar más información de los perfiles de los usuarios (de momento no podemos ver los amigos, por ejemplo).

¿Hay Javadoc?

¡Claro!, http://www.piradoiv.com/mv6lib/

¿Desde dónde descargo la biblioteca?

He creado un proyecto en Google Code, podéis participar en esta dirección:
· http://code.google.com/p/mv6lib/

djtonight

interesantísimo!! a picar código se ha dicho.
enhorabuena por el trabajo, voy a verlo

LOc0

Jejeje. Muy buen trabajo. Esto puede dar (y dará) muchísimo juego. En fin, God bless RegEx xD

Salu2 ;)

erdanblo

¿Pues habrá que echarle un vistazo luego no?

:P

dr_Rouman

La verdad es que con MV6 me he preguntado si no pensabáis hacer una API. Es una iniciativa estupenda, aunque molaría más que usara la base de datos, claro xD

¿No vais a poner el código en el svn, sólo en descargas? No tiene mucho sentido que lo pongáis en el svn si no vais a abrir el proyecto para colaborar, claro, pero por curiosidad :P

PiradoIV

#5 Nunca se pondría una conexión directa a la base de datos, sería una locura. Lo que sí que se publicará es el código fuente en el svn de Google Code, que no es nada sensible, son todo expresiones regulares, como dice el maestro LOc0. Una vez que esté publicado el código, no veo por qué no podáis colaborar =)

¡Saludos!

B

Yo lo veo como un a libreria que parsea peticiones html, no es api de mv.

CheLu2K

Siempre he querido una versión nativa de MV para móviles... pero leer lo de "Android" me ha desilusionado... ¿qué pasa si somos unos modernitos fanáticos de Apple con iPhone? :(

dagavi

Pues no está mal.

Lo he probado y me ha ido más o menos bien.
El parseo el nick del creador de un post, cuando estás en una página, no funciona del todo bien ya que sale:

nick
página

O al menos a mi es lo que me ha pasado. (estaba listando todos los autores de las respuestas de todo un trhead, haciendo "for (int i = 1; i <= thead.getRepliesCount(); ++i)" ...

Por otro lado, el nombre Thread puede ser conflictivo si también se quiere usar threads (algo que sería bastante normal teniendo en cuenta el tiempo de respuesta), apostaría por cambiar el nombre o poner algún prefijo como mvThread (y que toda clase fuera mvCosa)

PiradoIV

#7 Yo lo de API lo saqué de la Wikipedia:

"Una interfaz de programación de aplicaciones o API (del inglés Application Programming Interface) es el conjunto de funciones y procedimientos (o métodos, si se refiere a programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción."

Igualmente, mientras entiendas para l oque sirve, me vale.

#8 Creo que puedes programar aplicaciones para iPhone/iPod Touch con Cocoa y Java.

#9 Comprobaré lo que me comentas y vamos corrigiendo errores.

Ninja-edit: Si podéis añadir los issues a la página de Google Code, genial. :D

SiCk

Bueno, en mi opinión, estas mismas peticiones las debería servir directamente MV, es decir un mediavida.com/api/VAR y que fuerais vosotros, mediante una tabla de trusted users (user, key, que se podría pedir desde el perfil) los que dierais acceso a una serie de funcionalidades a modo de servicio web/api en texto plano, pero con un content-type en RSS. Así es como son los apis de toa la vida vamos xD

Para todo lo demás, es una buena noticia la apertura o la facilidad de integración de cualquier website 'social'.

Edit: De esa manera, sería el cliente el encargado de recoger los datos en xml y tratarlos como quisiera en su aplicación, de cocoa, de html, de php o de cualquier cosa.

B

Solo digo una cosa, XML-RPC. Pero ya le estamos pidiendo peras al olivo XD.

dr_Rouman

#6 Hombre, el código está en el jar, pero pensé que no ibáis a ponerlo para usar svn y tal :3

Además eso, en google code edita alguien si le invitas, si no no xD

PiradoIV

#11 & #12 No creo que salga algo así, por lo menos a corto plazo. Bastante tiene Beavis con todo el curro que ya tiene. Este [helado de chocolate] lo he sacado por mi cuenta con los medios que tenemos todos los usuarios ahora mismo, que es básicamente acceso al HTML público, si Beavis se saca el XML, se adapta y tan contentos x) a nivel del programador que vaya a usar este [helado de chocolate] le va a dar igual cómo funcione internamente.

#13 En cuanto prepare el svn os aviso y empezamos a programar en conjunto todos. De momento hay que ir sacando los bugs que tiene que tener esta RC1.

PiradoIV

#9 Eso no lo puedes hacer de esa manera, la biblioteca carga la información página a página, no coge el listado desde la base de datos, tendrás que programarlo pillando las páginas que necesites. Por ejemplo en este post:

String page = Page.getPage("http://www.mediavida.com/foro/9/java-mv6lib-accede-mv6-desde-tu-aplicacion-367539");
Vector<Post> posts = new Vector<Post>();
for(int i = 1; i <= 14; i++) {
	posts.add(new Post(367539, i, page));
}
		
for(int i = 0; i < posts.size(); i++) {
	Post postActual = posts.get(i);
	postActual.refreshPost();
// Como ya le hemos dado la página, refreshPost() no la vuelve a descargar.
	System.out.println("#" + postActual.getPostId() + " " +postActual.getAuthor());
}
Salida

Cada página en MV tiene 30 posts, tendrías que irle pasando la página a cada uno. Tened en cuenta que hay que sobrecargar el servidor lo menos posible, cuantas menos peticiones le hagamos, mejor. Haciéndolo de esta manera, en un hilo de 500 replies, le haríamos 17 consultas al servidor, en vez de las 500.

Fijaros que para agilizar el trabajo, hay un método static para descargar la página de forma adecuada al parser: Page.getPage(String url).

SiCk

#12 Creo que es lo que digo en #11 xD

#14 Evidentemente, un API genera un relativo trabajo, pero es más eficiente. Si tenéis toda la web orientada a objetos, hacer un api es más sencillo (básicamente montar las respuestas en xml) y con php, un case, un poco de OOP y un par de tablas de mysql (una para user-clave, asi se controla quien accede a que y una de log) tendríais todo listo (junto con las de la web claro está).
Aún así, como comentaba, está DPM que se acceso de alguna manera.

djtonight

alguna idea de por que un System.out.println(stats.getUsersOnline());
me da 0?o System.out.println(f.getForumName()); me da null?

import es.gofio.mv6lib.Forum;
import es.gofio.mv6lib.Stats;


public class test {

/**
 * @param args
 */
public static void main(String[] args) {
	// TODO Auto-generated method stub
	Stats stats = new Stats();
    System.out.println(stats.getUsersOnline()); 
    Forum f = new Forum(3);
    System.out.println(f.getForumName()); 
}

}

que me falta/falla?

kolka

Un consejo, en el constructor de ForumLists podrías llamar al refreshForumList directamente, lo mismo para el resto de cosas, (puede parecer una tontería), pero viene a ser normal que no se tenga que actualizar el listado de foros, ¿no?

#17 Ahí te dejo algo básico funcionando... creo que lo de Stats de ejemplo esta mal...
(Esto obtiene la lista de foros e imprime los threads de offtopic).
Por cierto, el tag code, no funciona, ¿no?

import java.util.Vector;
import es.gofio.mv6lib.Forum;
import es.gofio.mv6lib.ForumList;
import es.gofio.mv6lib.Thread;


public class Test {
	public static void main(String[] args) {

	ForumList f = new ForumList();//Creamos la lista de foros
	f.refreshForumList();//Obtenemos la lista de foros actualizada
	Vector<Forum>foros = f.getForumList();//Almacenamos en un vector de foros
	System.out.println(foros.get(0).getForumName());//Imprimimos el nombre del primer foro
	foros.get(0).refreshForum();//obtenemos los hilos del foro
	Vector<Thread> hilos_offtopic = foros.get(0).getLastThreads();//los  almacenamos en un vector
	for (int a=0;a<hilos_offtopic.size();a++)
		System.out.println(" - " + hilos_offtopic.get(a).getTitle());//imprimimos los títulos
}

}

Poisonous

#17 te falta llamar al update stats

import es.gofio.mv6lib.Forum;
import es.gofio.mv6lib.Stats;


public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
Stats stats = new Stats();
[b]stats.updateStats();[/b]
    System.out.println(stats.getUsersOnline()); 
}

}
PiradoIV

#18 En un primer momento se hacía la petición directamente, pero si haces un Vector<Post> de un hilo y el constructor se lía a hacer peticiones a la web, saturarías el servidor a peticiones en seguida. Lo mismo si haces un array de los últimos hilos, etc.

Por eso lo quité, se pide cuando haga falta.

NeB1

Cuando monteis el repositorio SVN avisad, que igual me uno

Poisonous

Despues de probar un poco está bastante bien, para las proximas versiones yo votaría por añadir una clase firma, y en la clase miembro un par de metodos como getFirmas y getFriends o algo por el estilo

PiradoIV

Se sacará la clase Signatures para las firmas, Friends para los amigos y Groups, esta última cuando salga la nueva versión de los Grupos, que está preparando Beavis.

A ver si me pongo y preparo el SVN.

B

como posible utilidad estaria bien una app que filtre los threads de series y obtenga los links correspondientes a jdownloader (por clipboard) o torrent (rss) y sus correspondientes subtitulos... pero de momento estoy empezando con java, asi que si algun maese quiere tomar mi idea que se lance...

PiradoIV

#24 Me creas o no, una de las utilidades que pensé que podría tener la biblioteca era algo como lo que comentas xD

B

Alguna idea de la app me habia planteado, pero 0 algoritmos :S y dudo mucho que te pueda ayudar con la programación de momento. De todas formas si necesitas ayuda con el planteamiento, grafismos o algo MPeame si quieres.

erdanblo

Yo creo que a Sacker le va a venir de puta madre para el recopilatorio de imágenes del post de tetas de FEDA xD.

Yo soy un noob y dicho esto, seguro que alguien lo hace antes que yo, y si no, lo intentaré hacer yo, pero lo dicho, yo soy un noob xDD y no voy a saber.

PiradoIV

Listo el SVN, hoyga.

Ninja-edit: Si tenéis Eclipse...
http://subclipse.tigris.org/servlets/ProjectProcess?pageID=p4wYuA

GaN2

#26 el algoritmo no seria demasiado dificil si se utilizara el nombre del archivo de descarga a la hora de comprobar los links.

dr_Rouman

Buf, puto eclipse y svn, lo tengo que usar para el pfc y me tiene negro xD

Si alguno queremos se colaboradores te damos el mail o cómo?