"Oturum süresi doldu"

5 Cevap php

Ben AWeber.com giriş ve verilerin toplu ithalatını gerçekleştirmek için güçlü bir program geliştirilmesi olmuştur. Komut bir tarayıcı ile normal bir kullanıcı parodi kendi cookiejar ayarlarıyla birlikte, PHP cURL kütüphaneleri kullanır.

Komut giriş sağlayan, mükemmel çalışıyor, ve listelerin değişmesi, ancak bu form verilerini gönderme söz konusu olduğunda (submitData fonksiyonunda) komut her zaman başarısız olur. Her zaman oturumu sona erdiğini belirten, ve tekrar giriş için "kullanıcı" soran web sitesi irade çıktı bir web sayfası. Sayfası da kendi tarayıcınızda çerezleri etkinleştirmek için "kullanıcı" ister.

Ben sorunu teşhis gün son birkaç harcamak var ve bu beni tamamen şaşkına vardır. CURLOPT_VERBOSE ayar cURL web sitesine çerezleri geçtiğini gösterir, cookiejar dosya tanımlama bilgilerini içeren ve bu Referans ve Javascript gereksinimleri gibi ek faktörler nedeni faktörlerin elimine edilmiştir.

Ben bu meydana ve soruna çözüm olabilir neden olarak herhangi bir öneri seviniriz. Hataya neden sınıf ve kod aşağıda görüntülenir. Hata oluştuğu kodu işaretlenir.

<?php
class AWeber {
  private $cj;

  public function __construct() {
    $this->cj = tempnam('/tmp', 'mlcookies_');
  }

  private function postQuery( $url, $array ) {
    $cu = curl_init();
    curl_setopt( $cu, CURLOPT_URL, $url );
    curl_setopt( $cu, CURLOPT_POST, true );
    curl_setopt( $cu, CURLOPT_POSTFIELDS, $array );
    curl_setopt( $cu, CURLOPT_COOKIEJAR, $this->cj );
    curl_setopt( $cu, CURLOPT_COOKIEFILE, $this->cj );
    curl_setopt( $cu, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $cu, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $cu, CURLOPT_HEADER, true );
    curl_setopt( $cu, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)' );

    $return = curl_exec($cu);
    echo $return;
    curl_close($cu);
    return $return;
  }

  private function getQuery( $url ) {
    $cu = curl_init();
    curl_setopt( $cu, CURLOPT_COOKIEJAR, $this->cj );
    curl_setopt( $cu, CURLOPT_COOKIEFILE, $this->cj );
    curl_setopt( $cu, CURLOPT_URL, $url );
    curl_setopt( $cu, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $cu, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $cu, CURLOPT_HEADER, true );
    curl_setopt( $cu, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)' );

    $return = curl_exec($cu);
    curl_close($cu);
    echo $return;
    return $return;
  }

  public function login( $user, $pass ) {
    $this->getQuery( "https://www.aweber.com/login.htm" ); // Get page cookie checks
    $query = array(
      '_method' => 'POST',
      'data[Account][username]' => $user,
      'data[Account][password]' => $pass,
      'data[Account][remember_login]' => '1'
    );
    $return = $this->postQuery( "https://www.aweber.com/login.htm", $query );
    $this->getQuery( "https://www.aweber.com/users/" );
    if ( !$return ) return false;  
    if ( strpos($return, '<div class="aw-status-headline">Error</div>') === false ) {
      return true;
    } else {
      return false;
    }
  }

  public function setList( $list ) {
    $return = $this->getQuery( "https://www.aweber.com/users/lists/change/" . $list );
    if ( !$return ) return false;
    if ( strpos($return, '<option selected="selected" id="listSelectionActiveOption" value="' . $list . '">' ) === false ) {
      return false;
    } else {
      return true;
    }
  }

  public function submitData( $text, $note ) {
    $query = array(   
      'upload_file' => '1',
      'data[ImportWizard][leads]' => $text,
      'data[ImportWizard][delimiter]' => 'TAB',
      'data[ImportWizard][customer_note]' => $note,
      'data[ImportWizard][use_automation]' => '1',
      'cmd' => 'Next',
    );
    $return = $this->postQuery( "https://www.aweber.com/users/lead_imports", $query );
    echo $return;
    if ( !$return || strpos($return, '<h1>Step 2</h1>') === false ) return false;

    $query = array(
      'columnArray' => '',
      'columnArray' => '',
      'data[ImportWizard][column0]' => 'name',
      'data[ImportWizard][column1]' => 'email',
      'cmd' => 'Save',
      );
    $return = $this->postQuery( "https://www.aweber.com/users/lead_imports", $query );
    if ( !$return || strpos($return, '<div class="aw-status-headline">Import Queued</div>') === false ) return false;
    return true;
  }

}

$aw = new AWeber(); // Create new AWeber interface class instance
$aw->login( $aUser, $aPass ) or trigger_error('Login failed', E_USER_ERROR); // Login
$aw->setList( 'list1' ) or trigger_error('List change 1 failed', E_USER_ERROR); // Change mailing list to 'list1'

// *** CODE WILL FAIL HERE WITH "Data submit 1 failed" ERROR ***
$aw->submitData( "Test\tTesterrr\nTest2\tTesterrr2\nTest3\tTesterrr3\n", "Testing Testing Testing Testing Testing Testing Testing" ) or trigger_error('Data submit 1 failed', E_USER_ERROR); // Submit data
$aw->setList( 'list2' ) or trigger_error('List change 2 failed', E_USER_ERROR); // Change mailing list to 'list2'
?>

5 Cevap

Eğer oturum sırasında çağrıları arasında curl_close ile kıvırmak kolu kapatıyoruz, çünkü olabilir. Oturum kullanım tamamlandıktan sonra sadece kapalı olmalıdır.

Sen ilk sorguda geri gönderilen yanıt üstbilgisi verileri okumak gerekebilir. Sonra geri çerez bilgileri gibi oturum bilgilerini (JSSESSION / PHPSESSID / etc) geçmektedir.

Ben senin sonrası veri komut (nasıl emin değil) çerez verilerini sıfırlıyor düşünüyorum. Gönderilir ve bu işlemleri yaparken alınan başlıklarını izlemek için Firebug kullanın. Sonra geçersiz olmamak sağlamak için çerez dosyaları kontrol.

Sen kurabiye dosyasını kontrol etmelisiniz. Eğer herşey yolunda ise, bu bilgilere sahip olmalıdır. Değilse, belki de cwd() mutlak bir yol belirtmek için kullanın.

Ben Anahtar Teslimi doğru olduğunu düşünüyorum.

It may be because you are closing the curl handle with the curl_close in between calls during the session. It should only be closed after the session usage is completed.

You must not open two different curl session. Try doing everything in one session then close the session.

Try adding curl_close() in class's destructor. Store curl session in a variable. And access it using $this->curl_session. Here is an example

<?php
    class AWeber {
    $curl_session;
    $cj;
    function __construct() {
        $this->curl_session = curl_init();
    }
    function __destruct() {
        if($this->curl_session) {
            curl_close($this->curl_session);
        }
    }
    function doWhatever() {
            curl_setopt( $this->curl_session, CURLOPT_COOKIEJAR, $this->cj );
            curl_setopt( $this->curl_session, CURLOPT_COOKIEFILE, $this->cj );
            curl_setopt( $this->curl_session, CURLOPT_URL, $url );
            curl_setopt( $this->curl_session, CURLOPT_RETURNTRANSFER, true );
            curl_setopt( $this->curl_session, CURLOPT_FOLLOWLOCATION, true );
            curl_setopt( $this->curl_session, CURLOPT_HEADER, true );
            curl_setopt( $this->curl_session, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)' );

            $return = curl_exec($this->curl_session);

    }
}
?>

Ben Array olarak POST-Parametreler specifing zaman kıvrılmasını kullanarak bazı sorunları vardı. Yerine

curl_setopt( $cu, CURLOPT_POSTFIELDS, $array );

I kullanın:

curl_setopt( $cu, CURLOPT_POSTFIELDS, http_build_query($array) );

Bu daha sonra benim için çalıştı.