2013-07-08 99 views
0

我試圖讓它使用保存的cookie,而不是每次訪問該站點時都記錄。重複使用cookie cURL PHP

<?php 
$uid = $_GET['uid']; 
$ch = curl_init(); 
$cookie_file = dirname(__FILE__) . '/cookie.txt'; 
curl_setopt($ch, CURLOPT_URL, "http://www.forum.net/member.php?action=do_login"); 
curl_setopt($ch, CURLOPT_REFERER, "http://www.forum.net/member.php?action=login"); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"); 
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt'); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_COOKIEFILE, '/cookie.txt'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=USERNAME&password=PASSWORD"); 
$exec = curl_exec($ch); 
curl_setopt($ch, CURLOPT_URL, "http://www.forum.net/reputation.php?uid=" . $uid . "&page=1"); 
$exec = curl_exec($ch); 
echo $exec; 
?> 

它不會讓我重複使用的cookie,出於某種原因,而是它只是記錄我該cookie.txt文件中包含該cookie的東西。

+1

您同時設置'CURLOPT_COOKIEJAR'和'CURLOPT_COOKIEFILE'兩次,而最終的結果將是不同的值。 '/ cookie.txt'將把文件存儲在系統根目錄下,並且'dirname(__ FILE__)。 '/ cookie.txt'會將文件存儲在與當前正在執行的腳本相同的目錄中。確保你只設置每個選項一次,具有相同的值(可能是後者)。 – DaveRandom

+0

好吧,我將CURLOPT_COOKIEJAR和CURLOPT_COOKIEFILE設置爲:dirname(__ FILE__)。 '/cookie.txt' - 但是,它不會工作。用新代碼更新OP。 – MortenMoulder

+0

可能的重複http://stackoverflow.com/questions/12885538/php-curl-and-cookies/ – ChrisF

回答

0

您有:

curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt'); 
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt'); 
...[snip]...  
curl_setopt($ch, CURLOPT_COOKIEFILE, '/cookie.txt'); 

要重設cookiefile的位置,你的文件系統的根目錄,其中,web服務器過程幾乎可以肯定沒有寫權限的文件。

同樣,請確保網絡服務器進程CAN將文件寫入dirname(__FILE__)指向的任何位置。

0

你設置這兩個CURLOPT_COOKIEJARCURLOPT_COOKIEFILE兩次,而最終的結果將是不同的值。 '/cookie.txt'會將該文件存儲在系統根目錄中,並且dirname(__FILE__) . '/cookie.txt'將將該文件存儲在與當前正在執行的腳本相同的目錄中。確保你只設置每個選項一次,具有相同的值(可能是後者)。

您也使用相同的句柄發出兩個請求 - 這不是推薦的方法,並且可能在語義上不正確,因爲當第二個頁面應該是GET時,您最終會將POST張貼到這兩個頁面。

我建議將cookie jar路徑存儲在塊頂部的變量中,並將其傳入。這樣可以更容易地看到發生了什麼。

我懷疑你想要更多的東西是這樣的:

<?php 

    // Username and password for login 
    $username = 'USERNAME'; 
    $password = 'PASSWORD'; 

    // Create the target URLs 
    // Don't forget to escape your user input! 
    $loginUrl = "http://www.forum.net/member.php?action=do_login"; 
    $reputationUrl = "http://www.forum.net/reputation.php?uid=" . urlencode($_GET['uid']) . "&page=1"; 

    // Referer value for login request 
    $loginReferer = "http://www.forum.net/member.php?action=login"; 

    // Note that __DIR__ can also be used in PHP 5.3+ 
    $cookieJar = dirname(__FILE__) . '/cookie.txt'; 

    // The User-Agent string to send 
    $userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5"; 


    // Create the cURL handle for login 
    $ch = curl_init($loginUrl); 

    // Set connection meta 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    // Set header-related options 
    curl_setopt($ch, CURLOPT_REFERER, $loginReferer); 
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieJar); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieJar); 

    // Set request body 
    $bodyFields = array(
     'username' => $username, 
     'password' => $password 
    ); 
    $body = http_build_query($bodyFields); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 

    // Execute the request 
    if (!curl_exec($ch)) { 
     exit("ERROR: Login request failed: " . curl_error($ch)); 
    } 
    curl_close($ch); 


    // Create the cURL handle for reputation scrape 
    $ch = curl_init($reputationUrl); 

    // Set connection meta 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 

    // Set header-related options 
    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieJar); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieJar); 

    // Execute the request 
    if (!$result = curl_exec($ch)) { 
     exit("ERROR: Reputation scrape request failed: " . curl_error($ch)); 
    } 

    // Output the result 
    echo $result; 
+0

非常感謝組織我的代碼。那真的很好看!然而...該代碼給了我這個錯誤:解析錯誤:語法錯誤,意外的'「錯誤:登錄請求失敗:'(T_CONSTANT_ENCAPSED_STRING)在線48上的C:\ myfile.php – MortenMoulder

+0

@Snorlax修正我總是忘記' exit''需要大括號,不像'echo'和'print' – DaveRandom

+0

好了,它現在可以工作,但它仍然不使用cookie文件,每次訪問文件時都會登錄,並且是,製作cookie文件,並且正在製作。 – MortenMoulder