Página 1 de 2

Acceso a MediaFire con Perl

NotaPublicado: 2012-12-31 05:52 @286
por n3td1srupt
Hola a todos...
Antes que nada me presento: soy n3td1srupt, joven de 15 años pues interesado en programación y el mundo del hacking :) ...

Bueno, esta duda la he buscado por Internet y no he visto nada relacionado. He encontrado en esta web diferentes soluciones para integrar PHP y perl, pero no sé si esto es lo mismo...

Veréis: estoy diseñando o tengo en mente más bien, realizar un administrador de MediaFire desde la consola, es decir: subir archivos, gestionarlos, etc... todo ello a MediaFire desde la consola de Linux, así que lo primero que busqué fue el acceso a la API de MediaFire la cual se encuentra ya liberada: http://developers.mediafire.com/index.php/REST_API

Después busqué la integración de Perl con PHP, pero, ahora bien, mi duda viene de aquí:

Para ingresar a MediaFire desde mi script Perl usando la API de PHP de MediaFire, ¿cómo se visualizarán los datos?

Aún no he empezado a programarlo pero antes de llevarme el chasco me gustaría saber si debo saber algo demás para integrar la API y Perl en el mismo script, y dado que lo hago desde consola también me han venido dudas sobre la visualización de los datos una vez dentro de la cuenta de MediaFire...

Salu2 y Gracias.

¡¡¡Espero poder aportar también por aquí!!!

Re: Acceder a una API de PHP mediante Perl

NotaPublicado: 2012-12-31 08:19 @388
por explorer
Bienvenido a los foros de Perl en Español, n3td1srupt.

No necesitas para nada PHP... Una API consiste en una serie de llamadas que hace un cliente hacia un servidor, usando un protocolo más o menos estándar.

En tu caso, ese protocolo es el HTTPS, usando llamadas GET (la petición y los parámetros van todos juntos en la URL de la petición) o POST (la petición y datos van por la salida estándar hacia el servidor). Entonces, te están diciendo que no importa el lenguaje que vayas a usar en el lado del cliente, siempre y cuando hagas las peticiones de forma correcta. Y son simples llamadas HTTPS, así que eso se puede hacer con casi cualquier lenguaje.

En el caso de Perl, se podría resolver con los módulos LWP (con la extensión para HTTPS) y JSON (para interpretar las respuestas), pero no son los únicos.

Lo que sí debes investigar es cómo conseguir los 'application id' para poder usar la API... Yo, al menos, no sé de dónde se puede sacar.

A propósito... en CPAN no hay nada de esto, así que tienes una buena oportunidad para publicar una distribución de módulos que puede ser muy interesante para más gente.

Re: Acceder a una API de PHP mediante Perl

NotaPublicado: 2012-12-31 10:24 @475
por n3td1srupt
Muchas gracias, explorer...

Si mal no he entendido yo lo que realizaría sería identificarme en la misma petición que hago con la URL y ahí mismo decir la acción que solicito. ¿Correcto?

Es que el problema me derivaba en que antes supuestamente pues yo buscaba la API para entrar a MediaFire y pues no estaba publicada y leía que en tal caso no podría acceder ya que MediaFire no me dejaría...

En cuanto a la API entonces ¿no la necesito para construir el script?

Y de antemano, muchas gracias, explorer, y pues ya que me has sacado lo de construir un módulo para esto me has animado mucho, y fijo que lo construyo ;)

Salu2

Re: Acceder a una API de PHP mediante Perl

NotaPublicado: 2012-12-31 16:50 @743
por explorer
n3td1srupt escribiste:Si mal no he entendido yo lo que realizaría sería identificarme en la misma petición que hago con la URL y ahí mismo decir la acción que solicito. ¿Correcto?
En esa página no hay una descripción de los procedimientos, solo una descripción de la API, por lo que no sabemos los pasos que se deben dar, pero leyendo por encima parece que primero debes hacer una petición para obtener una clave de sesión, con get_session_token(), que utilizarás en el resto de llamadas de esa sesión. Y para poder hacer esa primera llamada necesitas saber el 'application id' que no tengo idea de dónde conseguirlo. Así que lo primero es leer toda la documentación posible y preguntar.

n3td1srupt escribiste:Es que el problema me derivaba en que antes supuestamente pues yo buscaba la API para entrar a MediaFire y pues no estaba publicada y leía que en tal caso no podría acceder ya que MediaFire no me dejaría...
Que una API sea pública no implica que se pueda usar. Por ejemplo, hay varias API que son públicas pero no se pueden usar salvo que consigas una clave de acceso, aparte del correspondiente nombre de usuario y contraseña.

n3td1srupt escribiste:En cuanto a la API entonces ¿no la necesito para construir el script?
La API te dice cómo construir las peticiones. El cómo hacerlas y mandarlas no implica un determinado lenguaje (al menos, con esta API. Hay otras que sí son específicas de un determinado sistema -Java, .Net, etc.-).

Re: Acceder a una API de PHP mediante Perl

NotaPublicado: 2013-01-01 07:03 @335
por n3td1srupt
Gracias, explorer, ya encontré lo del aplication id y la API key para la aplicación. La proporciona el mismo MediaFire cuando te has registrado; desde tu cuenta le indicas que vas a desarrollar una app y él te proporciona esos datos.

Bueno, yo empiezo ya a trastear código y si me surge alguna complicación difícil y no la resuelvo, la preguntaré e iré aportando los avances y tal, ¡a ver si logro armar el módulo!

Gracias y Salu2.

Creación de un método POST

NotaPublicado: 2013-01-09 07:31 @354
por n3td1srupt
Holaaaa.

Bueno, dado que estoy en clase no tengo mucho tiempo pero en unos minutos he hecho pruebas y tal y ahora me llega un problema que no consigo resolver... Veréis: si miráis este enlace, es la API de upload de MediaFire: http://developers.mediafire.com/index.p ... API#upload pero no entiendo lo de cómo pasar los parámetros. Dice de una construcción post pero no tengo ninguna idea de cómo hacer todo esto. Esto es lo que dice la API de upload:

Upload API upload URL: http://www.mediafire.com/api/upload/upload.php

Description : Upload a file through POST to the user's account. You can either use the session token to authenticate the user, or pass the dropbox key. This api returns the upload key when successful. You will have to pass this key to upload/poll_upload.php to get the Quickkey. Please refer to the documentation about the API upload/poll_upload for more details.

Required parameters
POST Data

The file content (Binary data).


Optional Parameters


GET Data

uploadkey : This is the folderkey of the target upload folder. If uploadkey is not passed, then the file will be uploaded to the root folder.

session_token : A Session Access Token to authenticate the user's current session. Required if not uploading to a dropbox.

dropbox : Set to '1' to enable dropbox mode. If enabled, the upload_key must be the dropbox type, which is an ecrypted string, not the normal 13 character folderkey.

Header Data

x-filename : File name you want to name the file on the system. If not passed, the original filename is used.

x-filesize : File size of the file.


El problema es ese: no sé cómo construir las peticiones para cargar un archivo. No entiendo la forma en la que se deba construir y he estado buscando información de cómo adjuntar un archivo mediante post en la URL pero no encuentro absolutamente nada...

Gracias.

Dentro de pronto a ver si publico ya el módulo, aunque pienso que volveré a preguntar respecto a la construcción de éste, es decir, de cómo construir el paquete :?: :) :)

¡¡¡Gracias!!!

Re: Creación de un método POST

NotaPublicado: 2013-01-09 17:50 @785
por explorer
En la página de manual de HTTP::Request::Common tienes un buen ejemplo de cómo hacerlo.

Sería algo así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use HTTP::Request::Common qw(POST);
  2.  
  3. my $ruta    = '/home/usuario';
  4. my $archivo = 'archivo_a_enviar.pdf';
  5.  
  6. my $ua = LWP::UserAgent->new;
  7. $ua->request(
  8.     POST "http://www.mediafire.com/api/upload/upload.php?session_token=$sesion",
  9.          x-filename => $archivo,
  10.          x-filesize => -s "$ruta/$archivo",                   # tamaño del archivo
  11.          Content    => [ File => [ "$ruta/$archivo" ] ],      # ruta al archivo
  12. );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Se pueden usar otros módulos, pero lo básico está ahí. Está sacado de la página de manual de HTTP::Request::Common, pero tienes más información en lwpcook.

($sesion guarda el session_token obtenido durante la sesión. De la misma manera se puede indicar el id de la carpeta donde dejar el archivo).

Re: Creación de un método POST

NotaPublicado: 2013-01-14 09:56 @456
por n3td1srupt
Muchas gracias, explorer, pero lamentablemente no funciona...

Me he leído la información de HTTP::Request::Common y veo que para enviar archivos es lo que tu me has enseñado pero obtengo un error de este tipo

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. Input the FILE PATH you want to upload
  2. '/home/n3td1srupt/Escritorio/hola'
  3. Can't open file '/home/n3td1srupt/Escritorio/hola'
  4. : No existe el fichero o el directorio at /home/n3td1srupt/mediafire-test2.pl line 84
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El archivo 'hola' que está en el escritorio pero supuestamente no existe y no logra subir absolutamente nada y siempre devuelve ese error.

Re: Creación de un método POST

NotaPublicado: 2013-01-14 15:48 @700
por explorer
Si Perl dice que no puede acceder a '/home/n3td1srupt/Escritorio/hola', es o porque no existe o porque no tiene los permisos necesarios para acceder a ese archivo.

Desde la línea de comandos, ejecuta el comando

ls -l /home/n3td1srupt/Escritorio/hola

para probar si existe o no.

Problema con el futuro script/módulo MediaFire

NotaPublicado: 2013-01-16 09:44 @447
por n3td1srupt
Holaaaa

Bueno, después de mantener el código en secreto xD no he podido más por que este no funciona. El problema se causa en el upload de archivos a MediaFire el cual definitivamente no consigo realizar. También existe un problema muy grave con SHA1 obligándome así a tener que pedirle al usuario calcular el SHA1 de la firma porque la salida del SHA1 proporcionado por Digest::SHA1 no es comprensible para realizar la petición.

Para calcular manualmente el SHA1:

Si ejecutáis el programa debéis introducir un SHA1. Ese SHA1 para construirlo tendréis que ir por el momento a un enlace externo: http://www.sha1-online.com/ y desde ahí colocar vuestro correo (de cuenta de MediaFire), contraseña, api_key, y application_id, sin espacios -juntos- y generar el sha1. La api_key y app_id están en el código, pero por si acaso, aquí están:

api key=32063
app_id=5606dudsfa60xy0f7p60oac7b31tpi8bethde701

Así pues para generar el sha1 sería algo así:

[email protected]ñaelnumerodelaapikeyelnumerodelaappid

Sin embargo, el problema más grave viene a ser en el upload de archivos ya que no consigo que suba el archivo.

Este es el código actual que tengo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #Fist test version of perl to access into our MediaFire accounts.
  2. #by n3td1srupt
  3. #Twitter-->@n3td1srupt
  4.  
  5. use Data::Dumper;
  6. use XML::Simple;
  7. use HTTP::Request::Common qw(POST);
  8. use LWP::Simple;
  9. use LWP::UserAgent;
  10. use Crypt::SSLeay;
  11.  
  12.  
  13. #URLS TO ACCESS TO SOME FUNCTIONS INTO THE API OF MEDIAFIRE
  14. #######################################################################################
  15.  
  16. @url_session_token=qw(https://www.mediafire.com/api/user/get_session_token.php? email= email &password= pass &application_id= app_id &signature= signature);
  17. @url_login_token=qw(https://www.mediafire.com/api/user/get_login_token.php? email= email &password= pass &application_id= app_id &signature= signature);
  18. $url_login=' http://www.mediafire.com/api/user/login_with_token.php?login_token=';
  19.  
  20. ########################################################################################
  21.  
  22.  
  23. #MEDIAFIRE ACCOUNT DATA PROVIDED BY USER
  24. ###################################################
  25.  
  26. print "Email of your MediaFire account\n";
  27. $email=<STDIN>;
  28. chop $email;
  29. print "Input your password\n";
  30. $pass=<STDIN>;
  31. chop $pass;
  32. print "Input the SHA1 signature\n";
  33. $signature=<STDIN>;
  34.  
  35. ###################################################
  36.  
  37. #KEYS AND SIGNATURES(SHA1 YET NOT IMPLEMENTED IN THE SCRIPT) REQUESTED BY THE API
  38. ###############################################################
  39. $app_id='32063';
  40. $api_key='5606dudsfa60xy0f7p60oac7b31tpi8bethde701';
  41. ###############################################################
  42.  
  43.  
  44. #SOME HTTP REQUESTS AND RESPONSES TO MANIPULATE MEDIAFIRE ACCOUNT
  45. #####################################################################################################
  46. #SESSION TOKEN
  47.  
  48.  
  49. $url_session_token[2]=$email;
  50. $url_session_token[4]=$pass;
  51. $url_session_token[6]=$app_id;
  52. $url_session_token[8]=$signature;
  53. $construct_url_session_token=join("",@url_session_token);
  54. print "$construct_url_session_token";
  55. $request_xml_session_token=getstore("$construct_url_session_token",'mediafire-response.xml');
  56. print $request_xml_session_token;
  57. $xml_session_token=new XML::Simple;
  58. $get_xml_session_token=$xml_session_token->XMLin('mediafire-response.xml');
  59. $session_token="$get_xml_session_token->{session_token}";
  60.  
  61.  
  62. ######################################################################################################
  63.  
  64. #LOGIN TOKEN
  65. ######################################################################################################
  66. $url_login_token[2]=$email;
  67. $url_login_token[4]=$pass;
  68. $url_login_token[6]=$app_id;
  69. $url_login_token[8]=$signature;
  70. $construct_url_login_token=join("",@url_login_token);
  71. $request_xml_login_token=getstore("$construct_url_login_token",'mediafire-response2.xml');
  72. $xml_login_token=new XML::Simple;
  73. $get_xml_login_token=$xml_login_token->XMLin("mediafire-response2.xml");
  74. $login_token="$get_xml_login_token->{login_token}";
  75.  
  76. #MEDIAFIRE LOGIN
  77. #################################################
  78. $mediafire_login="$url_login$login_token";
  79.  
  80. #MEDIAFIRE UPLOAD FILE
  81. print "Input the name of the file\n";
  82. $mediafire_upload_file_name=<STDIN>;
  83. print "Input the FILE PATH you want to upload\n";
  84. $mediafire_file_upload=<STDIN>;
  85. $mediafire_file_upload_send=LWP::UserAgent->new;
  86. $mediafire_file_upload_send->request(
  87. POST "http://www.mediafire.com/api/upload/upload.php?",
  88.  
  89. x-filename=>"$mediafire_upload_file_name",
  90. x-filesize=> -s "$mediafire_file_upload",
  91. Content=> [ File => ["$mediafire_file_upload"] ],
  92.  
  93. );
  94.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Este es otra variante a este mismo (solo cambian las últimas líneas)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #Fist test version of perl to access into our MediaFire accounts.
  2. #by n3td1srupt
  3. #Twitter-->@n3td1srupt
  4.  
  5. use Data::Dumper;
  6. use XML::Simple;
  7. use HTTP::Request::Common qw(POST);
  8. use LWP::Simple;
  9. use LWP::UserAgent;
  10. use Crypt::SSLeay;
  11. use Digest::SHA1 qw(sha1 sha1_hex sha1_base64 sha1_transform);
  12.  
  13. #URLS TO ACCESS TO SOME FUNCTIONS INTO THE API OF MEDIAFIRE
  14. #######################################################################################
  15.  
  16. @url_session_token=qw(https://www.mediafire.com/api/user/get_session_token.php? email= email &password= pass &application_id= app_id &signature= signature);
  17. @url_login_token=qw(https://www.mediafire.com/api/user/get_login_token.php? email= email &password= pass &application_id= app_id &signature= signature);
  18. $url_login=' http://www.mediafire.com/api/user/login_with_token.php?login_token=';
  19.  
  20. ########################################################################################
  21.  
  22.  
  23. #MEDIAFIRE ACCOUNT DATA PROVIDED BY USER
  24. ###################################################
  25.  
  26. print "Email of your MediaFire account\n";
  27. $email=<STDIN>;
  28. chop $email;
  29. print "Input your password\n";
  30. $pass=<STDIN>;
  31. chop $pass;
  32. print "Input the SHA1 signature\n";
  33. $signature=<STDIN>;
  34.  
  35. ###################################################
  36.  
  37. #KEYS AND SIGNATURES(SHA1 YET NOT IMPLEMENTED IN THE SCRIPT) REQUESTED BY THE API
  38. ###############################################################
  39. $app_id='32063';
  40. $api_key='5606dudsfa60xy0f7p60oac7b31tpi8bethde701';
  41. ###############################################################
  42.  
  43.  
  44. #SOME HTTP REQUESTS AND RESPONSES TO MANIPULATE MEDIAFIRE ACCOUNT
  45. #####################################################################################################
  46. #SESSION TOKEN
  47.  
  48.  
  49. $url_session_token[2]=$email;
  50. $url_session_token[4]=$pass;
  51. $url_session_token[6]=$app_id;
  52. $url_session_token[8]=$signature;
  53. $construct_url_session_token=join("",@url_session_token);
  54. print "$construct_url_session_token";
  55. $request_xml_session_token=getstore("$construct_url_session_token",'mediafire-response.xml');
  56. print $request_xml_session_token;
  57. $xml_session_token=new XML::Simple;
  58. $get_xml_session_token=$xml_session_token->XMLin('mediafire-response.xml');
  59. $session_token="$get_xml_session_token->{session_token}";
  60.  
  61.  
  62. ######################################################################################################
  63.  
  64. #LOGIN TOKEN
  65. ######################################################################################################
  66. $url_login_token[2]=$email;
  67. $url_login_token[4]=$pass;
  68. $url_login_token[6]=$app_id;
  69. $url_login_token[8]=$signature;
  70. $construct_url_login_token=join("",@url_login_token);
  71. $request_xml_login_token=getstore("$construct_url_login_token",'mediafire-response2.xml');
  72. $xml_login_token=new XML::Simple;
  73. $get_xml_login_token=$xml_login_token->XMLin("mediafire-response2.xml");
  74. $login_token="$get_xml_login_token->{login_token}";
  75.  
  76. #MEDIAFIRE LOGIN
  77. #################################################
  78. $mediafire_login="$url_login$login_token";
  79.  
  80. #MEDIAFIRE UPLOAD FILE
  81. print "Input the FILE PATH you want to upload\n";
  82. $mediafire_file_upload=<STDIN>;
  83. chop $mediafire_file_upload;
  84. $mediafire_file_upload_send=LWP::UserAgent->new;
  85. $mediafire_file_upload_send->request(
  86. POST 'http://www.mediafire.com/api/upload/upload.php?',
  87. Content_Type=>'form-data',
  88. Content=>
  89. [ undef,$mediafire_file_upload,'x-filename'=>$mediafire_file_upload],
  90.  
  91. );
  92.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿Qué opináis?

Muchas Gracias y Salu2