Php &引用;“会话已过期”;及;请启用cookies“;通过cURL发布网站表单时的警告

Php &引用;“会话已过期”;及;请启用cookies“;通过cURL发布网站表单时的警告,php,session,cookies,post,curl,Php,Session,Cookies,Post,Curl,我一直在开发一个能够登录AWeber.com并执行大量数据导入的程序。该脚本使用PHP cURL库及其CookieJar设置,通过浏览器欺骗普通用户 该脚本工作得很好,允许登录和更改列表,但在发布表单数据(在submitData函数中)时,脚本总是失败。每次网站都会输出一个网页,指出会话已过期,并要求“用户”再次登录。该页面还要求“用户”在其浏览器中启用cookie 过去几天我一直在诊断这个问题,这让我完全不知所措。CURLOPT_VERBOSE设置表示cURL正在将cookies传递给网站,c

我一直在开发一个能够登录AWeber.com并执行大量数据导入的程序。该脚本使用PHP cURL库及其CookieJar设置,通过浏览器欺骗普通用户

该脚本工作得很好,允许登录和更改列表,但在发布表单数据(在submitData函数中)时,脚本总是失败。每次网站都会输出一个网页,指出会话已过期,并要求“用户”再次登录。该页面还要求“用户”在其浏览器中启用cookie

过去几天我一直在诊断这个问题,这让我完全不知所措。CURLOPT_VERBOSE设置表示cURL正在将cookies传递给网站,cookiejar文件包含cookies,并且其他因素(如Referer和Javascript要求)已从原因因素中消除

如果您能提供任何建议,说明为什么会发生这种情况,以及问题的解决方案,我将不胜感激。导致错误的类和代码显示在下面。在发生错误的地方标记代码

<?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'
?>

这可能是因为您正在关闭curl句柄,而curl\u位于会话期间的两次调用之间。只有在会话使用完成后才能关闭它。

您可能需要读取从第一次查询返回的响应头数据。然后将会话信息(JSSESSION/PHPSESSID/etc)作为cookie信息传递回去


我认为您的post data脚本正在重置cookie数据(不确定如何重置)。使用Firebug监视执行这些操作时发送和接收的头。然后检查cookie文件以确保它们没有被覆盖。

您应该检查cookie文件。如果一切正常,它应该有信息。如果没有,也许您应该使用来指定绝对路径。

我认为交钥匙是正确的


这可能是因为您正在关闭 卷曲手柄,卷曲_闭合 会话期间的两次呼叫之间。信息技术 应仅在关闭后关闭 会话使用已完成

不能打开两个不同的curl会话。 尝试在一个会话中完成所有操作,然后关闭会话

尝试在类的析构函数中添加curl_close()。将curl会话存储在变量中。并使用$this->curl\u会话访问它。 这里有一个例子

<?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);

    }
}
?>

在将POST参数指定为数组时,我在使用curl时遇到了一些问题。而不是

curl_setopt( $cu, CURLOPT_POSTFIELDS, $array );
我使用:

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

这对我来说很有用。

哪个对postQuery的调用在submitData函数中失败,第一次还是第二次?