2014年3月31日 星期一

PHP 使用 curl 取得和傳送 cookie

PHP 的 curl 要模擬瀏覽器的 cookie 行為,須將 cookie 存放在某一個檔案,然後對這個檔案做儲存、讀取的動作。
curl 的設定選項裡面
CURLOPT_COOKIEJAR:用來設定要將 cookie 存放在那個檔案。
CURLOPT_COOKIEFILE:要從哪個檔案讀取 cookie,再傳送出去。
範例:
curl 儲存、傳送 cookie 的程式
<?php
$ch = curl_init();
$cookie_txt = dirname(__FILE__) .  "/cookie.txt";
curl_setopt($ch,CURLOPT_URL,"http://www.example.com/count.php");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_txt);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_txt);
curl_setopt($ch,CURLOPT_HEADER,0);
$out = curl_exec($ch);
curl_close($ch);

遠端會使用到 cookie 的網頁(http://www.example.com/count.php)
<?php
if(!isset($_COOKIE['count'])){
    setcookie("count", 1);
}else{
    setcookie("count", $_COOKIE['count']+1);
}

var_dump($_COOKIE);

其他說明:
用來存放 cookie 內容的檔案,建議使用絕對路徑,避免找不到。
https://php.net/manual/en/function.curl-setopt.php#75525 這裡雖然說 windows 系統下,要用絕對路徑才能用。但我測試的結果,用相對路徑也可以,只是檔案似乎會儲存在 Apache 的 ServerRoot 路徑底下。


12 則留言:

  1. 想請問一下 我在開啟網頁的時候擷取封包 瀏覽器是使用get的方式 去要求網站內容跟cookie 那我在使用curl的時候也是要用get的方式嗎?

    回覆刪除
    回覆
    1. 如果您的意思是要用curl訪問一個原本是GET的網頁,那建議就用GET,因為不確定對方是怎麼處理GET和POST的資料。

      刪除
  2. 不好意思 我對Php算是初學者 但畢業專題需要解決的問題比較複雜 想說能不能請您給我facebook id 這樣我比較能把我的問題較詳細的描述和請教您 方便的話 blackchocolate8286@yahoo.com.tw這是我的信箱 再麻煩您跟我說一下 謝謝~ ^^

    回覆刪除
    回覆
    1. 相關的問題,比較建議直接回覆在這裡。如果不方便,可以mail給我xyz@cinc.biz,不過我不確定會 :)

      刪除
  3. 恩恩 那我直接在這邊提問 我是要用CURL達到開啟網頁並傳送資料給他計算 再取回計算完的值 這部分是一個PHP程式 資料的部分是用HTML網頁跟使用者取值 再用AJAX POST到PHP程式 PHP程式部分大致上跟你的範例差不多 只多了設置header跟接收post過來的資料 還是有錯誤 不知道是什麼部分出了問題?

    回覆刪除
    回覆
    1. 您是指有三個部份?
      一個前端HTML網頁(A)、一個PHP程式(B)、一個計算的網頁(C) ?
      以下我用A、B、C分別表示這三個。
      使用者在A輸入資料 --(AJAX傳輸)--> B --(curl request)--> C(計算後,回應結算結果),
      以上是正確的流程嗎? 如果是,我有兩個問題
      1.出現錯誤訊息是發生在哪一段,訊息內容是?
      2.C跟A是不同網域、其他地方的網頁? 因為中間插一個B使用curl,類似當proxy的角色,所以我這樣猜。

      刪除
    2. 恩恩 這個流程是對的 1.錯誤訊息是ajax的error function發出的 是0 我有測試過 資料是有成功傳到B 但B的執行好像有發生錯誤 2.沒錯 A是我自己寫的網頁 C是別人的 好像在英國

      刪除
    3. 如果確定 A-->B 沒問題。
      可以直接用瀏覽器瀏覽 B,看 B-->C 的結果,直接看 C 的回應是什麼,或是出現什麼錯誤。
      一般用 curl 抓別人網頁的輸出結果,常遇到的狀況就是模擬的不夠徹底,如果對方有針對這方面檢查的話。
      另一種狀況,則是模擬的條件都符合了,但程式執行頻率太高,被擋了。

      刪除
    4. 我單獨測試php的部份成功了 有跑出frax的網站 但是一跟網頁接上就沒辦法傳直過去 會部會是資料格式的問題?

      刪除
    5. 我解決上面的問題了~ 現在有抓到他的html了 但是他好像有防止機器人丟封包的限制 有辦法解決這個限制嗎?

      刪除
    6. 如果對方是用header或post、get...等資料判斷的話,只能測試對方是怎麼防的,然後模擬的一模一樣。
      如果對方是防同一個 IP 不能太頻繁訪問的話,目前我想到的方法有
      1.延長訪問的時間間隔
      2.如果你有多個IP,也可以讓 server 輪替使用不同 IP
      3.找網路上有沒有可以用的 proxy ,B 改成去訪問 proxy,然後輪替使用不同的 proxy

      刪除
    7. 補充說明,如果 B 要通過其他 proxy 間接訪問 C,curl_setopt() 有 CURLOPT_PROXY 相關的 proxy 參數可設定

      刪除