问题 使用curl登录并移至另一页


我正在尝试使用CURL访问网站中的一个页面,但是需要登录我尝试使用代码登录并且成功

<?php

    $user_agent       = "Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140319 Firefox/24.0 Iceweasel/24.4.0";
    $curl_crack = curl_init();

    CURL_SETOPT($curl_crack,CURLOPT_URL,"https://www.vininspect.com/en/account/login");
    CURL_SETOPT($curl_crack,CURLOPT_USERAGENT,$user_agent);
    CURL_SETOPT($curl_crack,CURLOPT_PROXY,"183.78.169.60:37899");
    CURL_SETOPT($curl_crack,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
    CURL_SETOPT($curl_crack,CURLOPT_POST,True);
    CURL_SETOPT($curl_crack,CURLOPT_POSTFIELDS,"LoginForm[email]=naceriwalid%40hotmail.com&LoginForm[password]=passwordhere&toploginform[rememberme]=0&yt1=&toploginform[rememberme]=0");
    CURL_SETOPT($curl_crack,CURLOPT_RETURNTRANSFER,True);
    CURL_SETOPT($curl_crack,CURLOPT_FOLLOWLOCATION,True);
    CURL_SETOPT($curl_crack,CURLOPT_COOKIEFILE,"cookie.txt"); //Put the full path of the cookie file if you want it to write on it
    CURL_SETOPT($curl_crack,CURLOPT_COOKIEJAR,"cookie.txt"); //Put the full path of the cookie file if you want it to write on it
    CURL_SETOPT($curl_crack,CURLOPT_CONNECTTIMEOUT,30);
    CURL_SETOPT($curl_crack,CURLOPT_TIMEOUT,30);  

    $exec = curl_exec($curl_crack);
    if(preg_match("/^you are logged|logout|successfully logged$/i",$exec))
    {
        echo "yoooha";
    }

?>

现在我遇到的唯一问题就是说我不想重定向到登录页面,我想重定向到这个页面 http://example.com/buy,我怎么能用同样的代码呢?


9079
2017-11-12 00:16


起源



答案:


如果你想去 /buy 登录后,只需使用相同的curl句柄并为该页面发出另一个请求。 cURL将在句柄持续时间内保留cookie(以及随后的请求,因为您将它们保存到文件中并使用cookie jar读回。

例如:

$user_agent       = "Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140319 Firefox/24.0 Iceweasel/24.4.0";
$curl_crack = curl_init();

CURL_SETOPT($curl_crack,CURLOPT_URL,"https://www.vininspect.com/en/account/login");
CURL_SETOPT($curl_crack,CURLOPT_USERAGENT,$user_agent);
CURL_SETOPT($curl_crack,CURLOPT_PROXY,"183.78.169.60:37899");
CURL_SETOPT($curl_crack,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
CURL_SETOPT($curl_crack,CURLOPT_POST,True);
CURL_SETOPT($curl_crack,CURLOPT_POSTFIELDS,"LoginForm[email]=naceriwalid%40hotmail.com&LoginForm[password]=passwordhere&toploginform[rememberme]=0&yt1=&toploginform[rememberme]=0");
CURL_SETOPT($curl_crack,CURLOPT_RETURNTRANSFER,True);
CURL_SETOPT($curl_crack,CURLOPT_FOLLOWLOCATION,True);
CURL_SETOPT($curl_crack,CURLOPT_COOKIEFILE,"cookie.txt"); //Put the full path of the cookie file if you want it to write on it
CURL_SETOPT($curl_crack,CURLOPT_COOKIEJAR,"cookie.txt"); //Put the full path of the cookie file if you want it to write on it
CURL_SETOPT($curl_crack,CURLOPT_CONNECTTIMEOUT,30);
CURL_SETOPT($curl_crack,CURLOPT_TIMEOUT,30);  

$exec = curl_exec($curl_crack);
if(preg_match("/^you are logged|logout|successfully logged$/i",$exec))
{
    $post = array('search' => 'keyword', 'abc' => 'xyz');

    curl_setopt($curl_crack, CURLOPT_POST, 1); // change back to GET
    curl_setopt($curl_crack, CURLOPT_POSTFIELDS, http_build_query($post)); // set post data
    curl_setopt($curl_crack, CURLOPT_URL, 'http://example.com/buy'); // set url for next request

    $exec = curl_exec($curl_crack); // make request to buy on the same handle with the current login session
}

以下是使用PHP和cURL发出多个请求的其他一些示例:

如何使用Curl和SSL以及cookie登录 (链接到其他多个示例)

登录后使用cURL从网站上抓取数据?

使用PHP和cURL登录Pinterest不起作用

使用PHP和Curl登录Google,Cookie已关闭?

PHP Curl - Cookies问题


13
2017-11-15 05:34



你是对的,我错过了那个,我的意思是这个想法。谢谢你,祝贺赏金点:)另外如果你可以修改你的例子,并从示例/购买中发出第二个请求(发布)会更好,这对我很有帮助,非常感谢你 - SniperCoder
嗨@SniperCoder我修改了请求 /buy 要发布。它与您用于登录的逻辑几乎相同。我发布的其他一些示例也显示了多个帖子请求。当为多个请求重新使用相同的curl句柄时,请继续使用 curl_exec 因为您可能只修改请求类型GET / POST,URL和发布数据(如果有)。否则一切都一样。首次设置卷曲手柄时,您只需要设置大多数选项。除此之外,通常需要更改的唯一选项是url和request类型。 - drew010
非常感谢你的帮助,谢谢:) - SniperCoder
如果你能帮助我,我也有这个小问题。我没有在互联网上找到任何答案 stackoverflow.com/questions/33745688/... - SniperCoder


答案:


如果你想去 /buy 登录后,只需使用相同的curl句柄并为该页面发出另一个请求。 cURL将在句柄持续时间内保留cookie(以及随后的请求,因为您将它们保存到文件中并使用cookie jar读回。

例如:

$user_agent       = "Mozilla/5.0 (X11; Linux i686; rv:24.0) Gecko/20140319 Firefox/24.0 Iceweasel/24.4.0";
$curl_crack = curl_init();

CURL_SETOPT($curl_crack,CURLOPT_URL,"https://www.vininspect.com/en/account/login");
CURL_SETOPT($curl_crack,CURLOPT_USERAGENT,$user_agent);
CURL_SETOPT($curl_crack,CURLOPT_PROXY,"183.78.169.60:37899");
CURL_SETOPT($curl_crack,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
CURL_SETOPT($curl_crack,CURLOPT_POST,True);
CURL_SETOPT($curl_crack,CURLOPT_POSTFIELDS,"LoginForm[email]=naceriwalid%40hotmail.com&LoginForm[password]=passwordhere&toploginform[rememberme]=0&yt1=&toploginform[rememberme]=0");
CURL_SETOPT($curl_crack,CURLOPT_RETURNTRANSFER,True);
CURL_SETOPT($curl_crack,CURLOPT_FOLLOWLOCATION,True);
CURL_SETOPT($curl_crack,CURLOPT_COOKIEFILE,"cookie.txt"); //Put the full path of the cookie file if you want it to write on it
CURL_SETOPT($curl_crack,CURLOPT_COOKIEJAR,"cookie.txt"); //Put the full path of the cookie file if you want it to write on it
CURL_SETOPT($curl_crack,CURLOPT_CONNECTTIMEOUT,30);
CURL_SETOPT($curl_crack,CURLOPT_TIMEOUT,30);  

$exec = curl_exec($curl_crack);
if(preg_match("/^you are logged|logout|successfully logged$/i",$exec))
{
    $post = array('search' => 'keyword', 'abc' => 'xyz');

    curl_setopt($curl_crack, CURLOPT_POST, 1); // change back to GET
    curl_setopt($curl_crack, CURLOPT_POSTFIELDS, http_build_query($post)); // set post data
    curl_setopt($curl_crack, CURLOPT_URL, 'http://example.com/buy'); // set url for next request

    $exec = curl_exec($curl_crack); // make request to buy on the same handle with the current login session
}

以下是使用PHP和cURL发出多个请求的其他一些示例:

如何使用Curl和SSL以及cookie登录 (链接到其他多个示例)

登录后使用cURL从网站上抓取数据?

使用PHP和cURL登录Pinterest不起作用

使用PHP和Curl登录Google,Cookie已关闭?

PHP Curl - Cookies问题


13
2017-11-15 05:34



你是对的,我错过了那个,我的意思是这个想法。谢谢你,祝贺赏金点:)另外如果你可以修改你的例子,并从示例/购买中发出第二个请求(发布)会更好,这对我很有帮助,非常感谢你 - SniperCoder
嗨@SniperCoder我修改了请求 /buy 要发布。它与您用于登录的逻辑几乎相同。我发布的其他一些示例也显示了多个帖子请求。当为多个请求重新使用相同的curl句柄时,请继续使用 curl_exec 因为您可能只修改请求类型GET / POST,URL和发布数据(如果有)。否则一切都一样。首次设置卷曲手柄时,您只需要设置大多数选项。除此之外,通常需要更改的唯一选项是url和request类型。 - drew010
非常感谢你的帮助,谢谢:) - SniperCoder
如果你能帮助我,我也有这个小问题。我没有在互联网上找到任何答案 stackoverflow.com/questions/33745688/... - SniperCoder


您只需在登录竞争后更改URL,然后再运行 curl_exec 喜欢这个 :

<?php

//login code goes here

if(preg_match("/^you are logged|logout|successfully logged$/i",$exec))
{
    echo "Logged in! now lets go to other page while we are logged in, shall we?";
    //The new URL that you want to go to while logged in goes in bottom line :
    CURL_SETOPT($curl_crack, CURLOPT_URL, "https://new_url_to_go.com/something");
    $exec = curl_exec($curl_crack);
    // now $exec contains the the content of new page with login
} 


curl_close($curl_crack);//dont forgert to close curl session at last
?>

1
2017-11-15 05:32





首先定义这些函数以获取包含url头和内容的关联数组(参见 http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl):

/**
 * Get a web file (HTML, XHTML, XML, image, etc.) from a URL.  Return an
 * array containing the HTTP server response header fields and content.
 */
function get_web_page( $url, $params, $is_post = true )
{
    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "Mozilla/4.0 (compatible;)", // i'm mozilla
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );

    if($is_post) { //use POST

        $options[CURLOPT_POST] = 1;
        $options[CURLOPT_POSTFIELDS] = http_build_query($params);

    } else { //use GET

        $url = $url.'?'.http_build_query($params);

    }

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['content'] = $content;
    return $header;
}

试试这个加载'http://www.example.com/buy'登录成功后。

// after curl login setup
$exec = curl_exec($curl_crack);
if(preg_match("/^you are logged|logout|successfully logged$/i",$exec))
{
    // close login CURL resource, and free up system resources
    curl_close($curl_crack);

    $params = array('product_id'=>'xxxx', qty=>10);
    $url = 'http://www.example.com/buy';

    //use above function to get the url content via POST params
    $result = get_web_page($url, $params, true);

    if($result['http_code'] == 200) {
        //echo the content
        echo $result['content'];
        die();
    }
}

0
2017-11-15 06:09



您误解了这个问题,OP希望在登录后从远程服务器加载该页面。 - moorscode
哎很抱歉,似乎@moorscode是对的。我会更新我的答案 - David