Binding mod_curl [Descarga de ficheros de Internet]

Started by josebita, November 25, 2011, 12:32:52 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Erkosone

#105
Se que lo pido desde la mas completa ignorancia, nunca hice algo así, y desconozco lo complejo que pueda ser montar esto en bennu.

josebita

Quote from: Erkosone on February 21, 2012, 05:58:27 PM
Buenas, he estado "intentando" hacer algo con curl en bennu pero sinceramente soy un completo ignorante de esta librería, si alguno de vosotros la conoce lo suficiente como para traducir este Script que os dejo, se podrá postear en Facebook directamente desde los juegos programados en bennu.


De verdad que es muy interesante, mi problema.. la completa ignorancia sobre curl..


Alguien con conocimiento de la lib sabe traducir esto a código bennu??




#!/bin/bash
#cambia esto
email="tu_email_de_usuario_en_facebook"
pass="tu_contraseña_en_facebook"
#a partir de aquí no es necesario cambiar nada más
texto=$1
if [ -z "$texto" ]; then echo -e "Uso:\n$0 \"texto a publicar\"\n\n"; exit 1 ;fi
texto=${texto:0:140}
cokkies="~/.cookies.txt"
user_agent="Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; es-ES)"
#nos logeamos y cogemos la url de la página redirigida
pagina=`curl -L --silent --keepalive-time 5 --user-agent "${user_agent}" --cookie "${cokkies}" --cookie-jar "${cokkies}" -d "email=$email" -d "pass=$pass" -d "login=Entrar" https://m.facebook.com/login.php`
pagina_redirige=`echo $pagina | sed -r 's/.*href="(http:.*;manual_redirect=1)".*/\1/g'`
#conectamos con la nueva página y leemos los datos que contiene su formulario para postear a facebook
pagina_con_formulario=`curl -L --silent --user-agent "${user_agent}" --cookie "${cokkies}" --cookie-jar "${cokkies}" "$pagina_redirige"`
url_action=`echo $pagina_con_formulario | sed -r 's/.*fbb=(.*&amp.*refid=.?)".*/\1/'`
post_form_id=`echo -n $pagina_con_formulario | sed -r 's/.*name="post_form_id" value="([^"]*)".*/\1/g'`
fb_dtsg=`echo -n $pagina_con_formulario | sed -r 's/.*name="fb_dtsg" value="([^"]*)".*/\1/g'`
url_action_completo="http://m.facebook.com/a/home.php?fbb=$direccionForm"
#ya tenemos los datos con los que componer el query final a Facebook, enviamos el mensaje
curl -X POST --user-agent "$user_agent" --cookie "$cokkies" --cookie-jar "$cokkies" --data-urlencode "status='$texto'" -d "update=Compartir" -d "post_form_id=$post_form_id" -d "fb_dtsg=$fb_dtsg" "$url_action_completo"
exit
¡Wow! En principio debería ser posible, pero la verdad es que como te dice Splinter: es una ejemplo relativamente complejo. ¿Alguien se anima a intentarlo y me dice si se puede o tengo que añadir algo más a la librería?

Erkosone

Si funcionase, incluso se podría hacer una función específica para Facebook que posteara algo así como:


Bennu GameCenter: Pepe acaba de superarse consiguiendo 97456 puntos en el juego "lo que sea".  Superalo si te atreves!

Parece una chorrada, pero cosas como estas son las que hacen que la gente se fije en determinados juegos, si mi amigo lo juega, voy a jugarlo también haber si le gano.
Yo en esto no puedo aportar nada.. no se ni como empezarlo, pero si lo consiguierais.. sería algo grande.


SplinterGU

#108
no es algo de escribir un par de lineas, por lo menos toda la parte de regex (sed) no esta implementada en bennugd... habria que hacerlo mano, parsear las strings y demas... y eso es lo mas complejo de lo que pides.

es una tarea de algunas cuantas horas de trabajo...

lamentablemente no puedo dedicar tanto tiempo a desarrollar la funcion... pero si tienes dudas concretas puedo ayudarte respondiendolas.

si te sugiero que te leas en manpages del comando unix sed y del curl... tambien te leas algun articulo de patterns/cadenas regex, que significado tiene cada caracter... que para que te des una idea son como los * y ? de los nombres de archivos cuando haces un dir o ls, pero mucho mas potente y tampoco * y ? significan eso en una cadena regex, tienen otro significado, pero lo mencione para que te des una idea de que hablamos.

una vez que entiendas que hace ese script que pasteaste aca, vas a saber como implementarlo en bennugd.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Estoy mirando de entender el tema.. Splinter ese script es un poco retorcido si, he encontrado otro que tiene una pinta muy buena, por lo menos a mi me parece que es bastante mas factible, es para Twitter:

http://twitter.com/statuses/update.xml';
// Alternative JSON version
// $url = 'http://twitter.com/statuses/update.json';
// Set up and execute the curl process
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, "$url");
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_POST, 1);
curl_setopt($curl_handle, CURLOPT_POSTFIELDS, "status=$message");
curl_setopt($curl_handle, CURLOPT_USERPWD, "$username:$password");
$buffer = curl_exec($curl_handle);
curl_close($curl_handle);
// check for success or failure
if (empty($buffer)) {
    echo 'message';
} else {
    echo 'success';
}
?>
[/size]
[/size]
[/size]
Haber si termino de estudiarme el anterior y pruebo este, pero creo a simple vista que es bastante mas utilizable desde bennu, quizá este si que se pueda traducir facilmente?  disculpad mi ignorancia sobre el tema.. recién empiezo con esto.

SplinterGU

ese ultimo casi no necesitas traducir nada... salvo las diferencias de sintaxis del lenguaje... josebita hizo el wrapper parecido a como se usa en C o php, asi que mirate las funciones, y lo vas a traducir facil.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Voy a ello, haber si funciona este código, si consigo algo dejaré el código en la sección recursos, haber que tal se me da..  ::)

Erkosone

No me aclaro con estas 2 lineas:



   curl_setopt(curl, CURLOPT_CONNECTTIMEOUT, 2);
   curl_setopt(curl, CURLOPT_RETURNTRANSFER, 1);


Haber si veo como se escriben estos parámetros en bennu..


SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Sí, el ejemplo del twitter debería ser muy fácil :)

Erkosone

Me he creado una cuenta personal de Twitter para probar este tema, pero no logro hacerlo funcionar, seguramente estoy haciendo alguna burrada por que no se muy bien como va esta lib..


Así a bote pronto me surge una duda rápida, en que supuesta url debería postear?  no lo tengo del todo claro..  "http://www.twitter.com" directamente ???

Erkosone


Estoy probando con este código, alguien que conozca bien la c_url ve alguna aberración? seguro que algo mal hay..
la variable user en el programa real la tengo con mi usuario y contraseña, por si alguien va a preguntar XD..

import "mod_video"
import "mod_curl"
import "mod_say"
import "mod_mouse"
import "mod_text"
import "mod_map"
import "mod_file"
Import "mod_key"
Import "mod_proc"


Global
   int quit = 0;
   string url = "http://twitter.com/statuses/update.xml";
   
   string user = "username:password";
   string msg_ = "BennuGD post test..";




Process main()
Private
    int i=0, status=0, curl=0;
    string output;


Begin
    set_mode(320, 480, 16);
   set_fps(30,0);
   
   curl = curl_init();
    if(curl == -1)
        say("Curl initialisation failed, quitting");
        quit = 1;
        return;
    end;
   
   
   curl_setopt(curl, CURLOPT_URL, url);
   curl_setopt(curl, CURLOPT_POST, 1);


   
   curl_setopt(curl, CURLOPT_POSTFIELDS, msg_);
   curl_setopt(curl, CURLOPT_USERPWD, user);
   curl_perform(curl, &status);
   
   while(status == 0)
      frame;
   end
   curl_cleanup(curl);
   
   write(0,160,20,4,"Transfer Completed.");   
   loop
      if(key(_esc))
         exit(0,0);
      end
      frame;
   end
end

KeoH

en el script de arriba tienes q la url es " ... update.json" ... igual es eso xDD ni idea q formato es el json ... a mi me suena a personaje biblico xDD

josebita

#118
Bueno, en el bucle de espera debes hacer:
   while(status == -2)
      frame;
   end
Y al ejecutar tu ejemplo twitter me devuelve:

Quote<?xml version="1.0" encoding="UTF-8"?>
<errors>
  <error code="53">Basic authentication is not supported</error>
</errors>
Parece que eliminaron la opción de enviar tweets de esa forma que pones hace tiempo... Ahora es bastante más complejo desde un punto de vista técnico y no sé si se podrá implementar en bennu, dado que hay que usar OAuth, sorry :(

http://es.wikipedia.org/wiki/OAuth


[Edito] Si alguien lo quiere intentar, yo empezaría por aquí:
http://oauth.net/documentation/getting-started/
http://oauth.googlecode.com/svn/code/php/

Erkosone

Haber, voy a preguntar algo que quizá sea una burrada de las grandes.. pero vaya no me quedo tranquilo si no lo pregunto..


Supongamos que tengo un servidor programado en PHP, una web vaya.. y tiene este sistema que comentas ya integrado, si le envío a esta web un post normal con curl de algúna manera podría dicha web reenviar el post a tweeter o facebook? supongo que si pero no estoy seguro.


Lo pregunto por que hay varios SDK para PHP que tienen soporte directo a Facebook y Twitter, y si se pudiera hacer un intermediario para los post´s podría valer como solución.


Haber si lo hablo con pinger y el sabe algo de esto, por que yo de programación web..