New question

Question:

Date: 30-01-2015 07:41:09 (In Spanish)

Conectar con Mercado libre..[Resolved]

Hola , estoy empezando un proyecto, el cual es un Script PHP que se ejecuta en shell, no en el navegador el cual deberá conectar el inventario de productos de la empresa con Mercado Libre y realizar actividades manejo de inventario, recuperación de ordenes y cosas como esas. El problema que tengo es en la validación de credenciales en el sitio de ML ya que sin estas no puedes entrar como administrador a tu sitio y por obligación hay que pasar por esta ventana, y este login es el que no he podido aun automatizar por medio de CURL, si alguien lo ha echo, por favor envíenme alguna documentación de como hacer esto, de antemano les comento que la documentación de ML es pésima.

Saludos...
Tags: API - Library - Mercadolibre API - PHP - Question Votes: 2 - Answers: 7 - Views: 30 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 31-01-2015 18:30:12 Hola Faustino, te hago una consulta para entender mejor tu necesidad, ¿estas haciendo un login por cURL contra la página de mercado libre o contra un servicio web que ofrece mercado libre?

    No se si estas al tanto, pero mercado libre tiene un foro donde se debaten estos temas, aquí el enlace: http://developers-forum.mercadolibre.com/

    También tenes la página de desarrolladores de mercado libre, aquí el enlace: http://developers.mercadolibre.com/

    Aquí también tienes el detalle de como consumir los distintos servicios por medio de REST: http://developers.mercadolibre.com/api-directory/ (muy facil de usar)

    Y finalmente lo que consultas (hacer el login), aquí toda la documentación: http://developers.mercadolibre.com/authentication-and-authorization/

    Puedes descargar el SDK de GitHub: https://github.com/mercadolibre/php-sdk

    Y usa el código que ellos te ofrecen para obtener el access token:

    <?php
    // Try to put this code at the top (attention to the path)
    require '../MercadoLivre/meli.php';
    
    // Create our Application instance (replace this with your appId and secret).
    $meli = new Meli(123456, "application_secret");
    
    if($_GET['code']):
      $oAuth = $meli->authorize($_GET['code'], 'http://localhost/PHPSDK/examples/example_login.php');
      $_SESSION['access_token'] = $oAuth['body']->access_token;
    else:
      echo 'Login with MercadoLibre';
    endif;
    


    Espero que mi respuesta te sea de ayuda.

    Saludos,
    Fernando
      Votes: 2 - Link answer
     
  • Date: 03-02-2015 04:24:05 Gracias por la respuesta, pero antes del obtener el token debe uno tener autenticacion en el sitio de mercado libre http://developers.mercadolibre.com/authentication-and-authorization/

    Esta es la parte que quiero automatizar...

    Saludos
      Votes: 0 - Link answer
     
  • Date: 04-02-2015 07:21:25 Ok, vos queres automatizar este login?: https://www.mercadolibre.com/jms/mla/lgz/login

    Si es así, luego deberías automatizar el “user consent”, donde el usuario da permisos a tu app, no?

    Para automatizar el login con cURL por lo que veo tenes que enviar los parametros:
    arfRedirUrl
    callback_error https://www.mercadolibre.com/jms/mla/lgz/login
    dps CODIGO
    go http://www.mercadolibre.com.ar
    json_response true
    loginType DEFAULT
    parent_url
    password PASSWORD
    platform_id ml
    remember_me true
    site_id mlapa
    user_id NOMBRE_DE_USUARIO

    Con el método POST a la url: https://www.mercadolibre.com/jms/mla/lgz/login/authenticate/

    El grán problema el código dps que es aleatorio.

    Ahora bien, no se que tan legal es automatizar el login, por lo que veo en el manual de Mercadolibre esto lo debe hacer el usuario contra el formulario.... revisa los aspectos legales antes de hacer algo que pueda ponerte en problemas.

    A modo de ejemplo educativo, te cuento que existe una librería que encapsula cURL y permite trabajar de una forma mas sencilla...

    Librería PHP (guardala como CURL.php, luego deberás incluirla en tu script):

    <?php
    
    /**
    * OO cURL Class
    * Object oriented wrapper for the cURL library.
    * @author David Hopkins (semlabs.co.uk)
    * @version 0.3
    */
    class CURL
    {
    	
    	public $sessions 				=	array();
    	public $retry					=	0;
    	
    	/**
    	* Adds a cURL session to stack
    	* @param $url string, session's URL
    	* @param $opts array, optional array of cURL options and values
    	*/
    	public function addSession( $url, $opts = false )
    	{
    		$this->sessions[] = curl_init( $url );
    		if( $opts != false )
    		{
    			$key = count( $this->sessions ) - 1;
    			$this->setOpts( $opts, $key );
    		}
    	}
    	
    	/**
    	* Sets an option to a cURL session
    	* @param $option constant, cURL option
    	* @param $value mixed, value of option
    	* @param $key int, session key to set option for
    	*/
    	public function setOpt( $option, $value, $key = 0 )
    	{
    		curl_setopt( $this->sessions[$key], $option, $value );
    	}
    	
    	/**
    	* Sets an array of options to a cURL session
    	* @param $options array, array of cURL options and values
    	* @param $key int, session key to set option for
    	*/
    	public function setOpts( $options, $key = 0 )
    	{
    		curl_setopt_array( $this->sessions[$key], $options );
    	}
    	
    	/**
    	* Executes as cURL session
    	* @param $key int, optional argument if you only want to execute one session
    	*/
    	public function exec( $key = false )
    	{
    		$no = count( $this->sessions );
    		
    		if( $no == 1 )
    			$res = $this->execSingle();
    		elseif( $no > 1 ) {
    			if( $key === false )
    				$res = $this->execMulti();	
    			else
    				$res = $this->execSingle( $key );
    		}
    		
    		if( $res )
    			return $res;
    	}
    	
    	/**
    	* Executes a single cURL session
    	* @param $key int, id of session to execute
    	* @return array of content if CURLOPT_RETURNTRANSFER is set
    	*/
    	public function execSingle( $key = 0 )
    	{
    		if( $this->retry > 0 )
    		{
    			$retry = $this->retry;
    			$code = 0;
    			while( $retry >= 0 && ( $code[0] == 0 || $code[0] >= 400 ) )
    			{
    				$res = curl_exec( $this->sessions[$key] );
    				$code = $this->info( $key, CURLINFO_HTTP_CODE );
    				
    				$retry--;
    			}
    		}
    		else
    			$res = curl_exec( $this->sessions[$key] );
    		
    		return $res;
    	}
    	
    	/**
    	* Executes a stack of sessions
    	* @return array of content if CURLOPT_RETURNTRANSFER is set
    	*/
    	public function execMulti()
    	{
    		$mh = curl_multi_init();
    		
    		#Add all sessions to multi handle
    		foreach ( $this->sessions as $i => $url )
    			curl_multi_add_handle( $mh, $this->sessions[$i] );
    		
    		do
    			$mrc = curl_multi_exec( $mh, $active );
    		while ( $mrc == CURLM_CALL_MULTI_PERFORM );
    		
    		while ( $active && $mrc == CURLM_OK )
    		{
    			if ( curl_multi_select( $mh ) != -1 )
    			{
    				do
    					$mrc = curl_multi_exec( $mh, $active );
    				while ( $mrc == CURLM_CALL_MULTI_PERFORM );
    			}
    		}
    
    		if ( $mrc != CURLM_OK )
    			echo "Curl multi read error $mrc\n";
    		
    		#Get content foreach session, retry if applied
    		foreach ( $this->sessions as $i => $url )
    		{
    			$code = $this->info( $i, CURLINFO_HTTP_CODE );
    			if( $code[0] > 0 && $code[0] < 400 )
    				$res[] = curl_multi_getcontent( $this->sessions[$i] );
    			else
    			{
    				if( $this->retry > 0 )
    				{
    					$retry = $this->retry;
    					$this->retry -= 1;
    					$eRes = $this->execSingle( $i );
    					
    					if( $eRes )
    						$res[] = $eRes;
    					else
    						$res[] = false;
    						
    					$this->retry = $retry;
    					echo '1';
    				}
    				else
    					$res[] = false;
    			}
    
    			curl_multi_remove_handle( $mh, $this->sessions[$i] );
    		}
    
    		curl_multi_close( $mh );
    		
    		return $res;
    	}
    	
    	/**
    	* Closes cURL sessions
    	* @param $key int, optional session to close
    	*/
    	public function close( $key = false )
    	{
    		if( $key === false )
    		{
    			foreach( $this->sessions as $session )
    				curl_close( $session );
    		}
    		else
    			curl_close( $this->sessions[$key] );
    	}
    	
    	/**
    	* Remove all cURL sessions
    	*/
    	public function clear()
    	{
    		foreach( $this->sessions as $session )
    			curl_close( $session );
    		unset( $this->sessions );
    	}
    	
    	/**
    	* Returns an array of session information
    	* @param $key int, optional session key to return info on
    	* @param $opt constant, optional option to return
    	*/
    	public function info( $key = false, $opt = false )
    	{
    		if( $key === false )
    		{
    			foreach( $this->sessions as $key => $session )
    			{
    				if( $opt )
    					$info[] = curl_getinfo( $this->sessions[$key], $opt );
    				else
    					$info[] = curl_getinfo( $this->sessions[$key] );
    			}
    		}
    		else
    		{
    			if( $opt )
    				$info[] = curl_getinfo( $this->sessions[$key], $opt );
    			else
    				$info[] = curl_getinfo( $this->sessions[$key] );
    		}
    		
    		return $info;
    	}
    	
    	/**
    	* Returns an array of errors
    	* @param $key int, optional session key to retun error on
    	* @return array of error messages
    	*/
    	public function error( $key = false )
    	{
    		if( $key === false )
    		{
    			foreach( $this->sessions as $session )
    				$errors[] = curl_error( $session );
    		}
    		else
    			$errors[] = curl_error( $this->sessions[$key] );
    			
    		return $errors;
    	}
    	
    	/**
    	* Returns an array of session error numbers
    	* @param $key int, optional session key to retun error on
    	* @return array of error codes
    	*/
    	public function errorNo( $key = false )
    	{
    		if( $key === false )
    		{
    			foreach( $this->sessions as $session )
    				$errors[] = curl_errno( $session );
    		}
    		else
    			$errors[] = curl_errno( $this->sessions[$key] );
    			
    		return $errors;
    	}
    	
    }
    
    ?>
    


    Un ejemplo de uso:

    require_once 'CURL.php';
    $usuario = 'xxxxxxxx';
    $password = '********';
    
    $curl = new CURL();
    $curl->retry = 2;
    $url = 'https://www.mercadolibre.com/jms/mla/lgz/login/authenticate/';
    $opts = array(
        CURLOPT_USERAGENT => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
    //    CURLOPT_COOKIEFILE => 'anc.tmp',
    //    CURLOPT_COOKIEJAR => 'anc.tmp',
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_TIMEOUT => 120
    );
    $opts[CURLOPT_POSTFIELDS] = 'user_id=' . $usuario . '&password=' . $password . '&remember_me=true';
    $curl->addSession( $url, $opts );
    $result = $curl->exec();
    $curl->clear();
    echo '<pre>';
    print_r($result);
    


    Espero que te sea de ayuda,

    Saludos y buen código!
      Votes: 1 - Link answer
     
  • Date: 04-02-2015 08:52:19 Exactamente ese es mi problema, quizá por aspectos legales o algo mas, no se puede automatizar el proceso de conexión completo a ML. El proyecto mas grande que conozco se llama, channeladvisor, y tampoco ha liberado el enlace hacia ML, al parecer hay problemas técnicos del lado de ML...

    Cerramos el caso..

    Gracias por las respuestas...
      Votes: 0 - Link answer
     
  • Date: 04-02-2015 09:24:40 Faustino, fijate que en la pregunta original (vos por ser autor de la pregunta) tenes un botón que dice "Cambiar estado -> Resuelta", hace clic ahí para darle un cierre.

    Si en algun otro momento tengo más información sobre como automatizar el login te adjunto una nueva respuesta, pero por lo pronto parece que no es posible por un tema lega (lo mismo si tu obtienes alguna información extra sería bueno que la adjuntes para nutrir a la comunidad).

    Saludos y como siempre "buen código"!
      Votes: 0 - Link answer
     
  • Date: 04-02-2015 09:49:28 Muchas Gracias...   Votes: 0 - Link answer
     
  • Date: 22-02-2022 12:38:02 Yo mismo estoy con este tema desde hace un tiempo. Es más lo estoy retomando ahora. Ademas, el php sdk de Mercadolibre parece discontinuado pero igual lo haría con otro lenguaje: estoy tratando de entender el proceso. Parece que al hacer el proceso de conexion (oauth/token) con parametros 'grant_type=client_credentials' se puede conseguir un token (que habria que pedir cada vez para asegurar su validez, aqui no habria refresh posible). Eso si, tomaria el ID de quien registró la aplicacion lo cual es un poco inconveniente, pero parece ser la unica forma de hacer una conexion "browserless", tipo en un script php/linux cron, justamente. Falta mucha información al respecto, realmente.   Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In
 
frjcbbae garagebible.com