سؤال

Have one question: when I'm trying to auth on Dfiles dot ru (depositfiles) with php cURL - I have no problems using their API, example:

    <?php 
$login = 'uName';
$password = 'uPass';
$url = 'http://dfiles.ru/api/user/login';
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,true);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');
curl_setopt($curl,CURLOPT_POSTFIELDS,"login=".$login."&password=".$password);
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');

$content = curl_exec($curl);
curl_close($curl); 
echo $content; ?>

After I finish with auth, I'm using cookie file for my next actions, I want to open start page as authorized user with cURL:

    <?php
$header = array ("Accept-Encoding: gzip, deflate", "Content-Type: text/html");
$ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_REFERER, $url);
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
   curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
   curl_setopt($ch, CURLOPT_POST, false);
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
   curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; En expl; rv:1.8.0.2) Gecko/20070306 Firefox/1.0.0.5");

   $result = curl_exec($ch);

   curl_close($ch);

   return $result;
?>

But all I see - white screen :) Maybe I'm missing something, but I also included headers...

هل كانت مفيدة؟

المحلول

your current config doesn't allow CURLOPT_FOLLOWLOCATION.

Try this instead:

<?php 
$login = 'uName';
$password = 'uPass';
$url = 'http://dfiles.ru/api/user/login';
$curl = curl_init();
curl_setopt($curl,CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curl,CURLOPT_POSTFIELDS,"login=".$login."&password=".$password);
curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');

$content = curl_exec_follow($curl);
curl_close($curl); 
echo $content; 


    function curl_exec_follow($ch, &$maxredirect = null) {

      // we emulate a browser here since some websites detect
      // us as a bot and don't let us do our job
      $user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; YB/5.1.3.0; DepositFiles/FileManager 0.9.9.206)";
      curl_setopt($ch, CURLOPT_USERAGENT, $user_agent );

      $mr = $maxredirect === null ? 5 : intval($maxredirect);

      if (ini_get('open_basedir') == '' && ini_get('safe_mode') == 'Off') {

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $mr > 0);
        curl_setopt($ch, CURLOPT_MAXREDIRS, $mr);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

      } else {

        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

        if ($mr > 0)
        {
          $original_url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
          $newurl = $original_url;

          $rch = curl_copy_handle($ch);

          curl_setopt($rch, CURLOPT_HEADER, true);
          curl_setopt($rch, CURLOPT_NOBODY, true);
          curl_setopt($rch, CURLOPT_FORBID_REUSE, false);
          do
          {
            curl_setopt($rch, CURLOPT_URL, $newurl);
            $header = curl_exec($rch);
            if (curl_errno($rch)) {
              $code = 0;
            } else {
              $code = curl_getinfo($rch, CURLINFO_HTTP_CODE);
              if ($code == 301 || $code == 302) {
                preg_match('/Location:(.*?)\n/', $header, $matches);
                $newurl = trim(array_pop($matches));

                // if no scheme is present then the new url is a
                // relative path and thus needs some extra care
                if(!preg_match("/^https?:/i", $newurl)){
                  $newurl = $original_url . $newurl;
                }   
              } else {
                $code = 0;
              }
            }
          } while ($code && --$mr);

          curl_close($rch);

          if (!$mr)
          {
            if ($maxredirect === null)
            trigger_error('Too many redirects.', E_USER_WARNING);
            else
            $maxredirect = 0;

            return false;
          }
          curl_setopt($ch, CURLOPT_URL, $newurl);
        }
      }
      return curl_exec($ch);
    }

?>

SOURCE:

http://slopjong.de/2012/03/31/curl-follow-locations-with-safe_mode-enabled-or-open_basedir-set/

نصائح أخرى

You are missing the CURLOPT_COOKIESESSION. Try the below:

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookiefile");
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookiefile");
  1. I think you need to add RETURNTRANSFER for passing the result to '$result'

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

  2. Cookie must be enabled through setting COOKIESESSION:

    curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE);

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top