About Me

我的相片
台北市, Taiwan
我是方選,
方白科技(finebind tech.)共同創辦人,
臺大資管所畢,
希望能幫助更多的人!

FB: http://fb.com/function1122
LINE: http://bit.ly/1foeZft (手機開啟點擊網址自動加入)

最新15則讀者回應

最新文章

FUNction's 上課筆記

Label Cloud

Blog Archive

FeedBurner

追蹤者

PHP 下載遠端網頁 (上)

FUNction 於 2008年4月30日 晚上9:45 發表
如果要下載遠端網頁,最簡單的方法就是fopen(),他可以直接指定url ,像開檔案一樣讀取遠端http/ftp 資料(如果需要登入就不行囉),這方法對公開的網頁幾乎是萬試萬靈,現在來看看程式範例:



<?php
$url = "http://functtionlab.org/";
$contents = "";

$fp = fopen($url, "r"); //這邊使用r(read only)的方式開啟檔案
while (!feof($fp)) { //如果檔案沒結束則繼續讀下一行
$contents .= fgets($fp); //儲存到$html 變數中
}
fclose($fp);
echo $contents;
?>

如果是ftp 就把上面url 改成FTP 的位址,會用「匿名」登入

接下來進階一點,如果網頁有Basic Authentication(驗證),fopen() 就過不去了,Basic 驗證是遇到會跳出一個Windows 登入對話框的網頁(這註解寫的比較淺顯,不精準勿怪)
遇到Basic 驗證,我們要適時送出帳號密碼,所以要改用fsockopen() 搭配fputs()...

這邊來小談一下用「命令提示字元」取得網頁的方法,不知道你有沒有試過

  1. 先開啟命令提是字元
  2. 輸入 telnet www.fju.edu.tw 80
  3. 摸黑輸入 GET / HTTP/1.0
  4. 連按兩下Enter 送出
  5. 這時後就可以看到伺服器回應(如圖)





有了這個概念,看程式碼應該會比較好懂:


<?php
$page = "/private/list.php"; //這是要檢視的頁面
$host = "www.example.com";
//這裡不能有HTTP 喔,要用指定連接埠號的,不然fsockopen 會出現「Unable to find the socket transport "http" - did you forget to enable it when you configured PHP?」的錯誤
$port = 80;
$user = "function1122";
$pass = "P@ssw0rd";

//接下來來產生模仿劉覽器的標頭,先送出GET 要求網頁
$header = sprintf("GET %s HTTP/1.1\r\n", $page);
//這邊來模仿一下IE6 好了:P
$header .= "Accept: */*\r\nAccept-Language: zh-tw\r\nAccept-Encoding: gzip. deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; windows NT 5.1; SV1)\r\n";
$header .= sprintf("Host: %s\r\n", $host);
$header .= "Connection: Keep-Alive\r\n";
//這裡就是送出Basic 驗正的帳密,他是用Byte 傳送的唷,帳號密碼中間用冒號隔開
$header .= sprintf("Authorization: Basic %s\r\n", base64_encode("$user:$pass"));
//最後再送出一個Enter 代表資料送完了
$header .= "\r\n";

//建立一個socket 連線
$fp = fsockopen ($host, $port, &$errno, &$errstr, 30);
if(!$fp){
//如果連線失敗則顯示錯誤訊息和代碼
echo "$errstr ($errno)\n";
}else{
//成功先像伺服器送出剛剛準備好的header
fputs ($fp, $header);
//讀取伺服器回應
while (!feof($fp)) {
echo fgets ($fp,128);
}
fclose ($fp);
}
?>


呼!!!終於搞定了
但如果伺服器是用NTLM 驗證fsockopen() 就會變得很麻煩...因為要用程是去計算伺服器送來的「挑戰」,才能對挑戰「回應」(若想了解NTLM 原理,建議參考NTLM Authentication Scheme for HTTP)

所以如果要用PHP 去登入需要NTLM 驗證的伺服器,這邊實做起來非常困難,找遍了網路也找不太到,但是...突然想起cURL,下集待續...

下集PHP 下載遠端網頁 (上)
精彩嘛:$ Tags: , ,

讀者回應 ( 2 意見 )

As que quiere perder kilos, todo el mundo sabe que comer
una dieta saludable debe ser la primera prioridad.
Entonces, cul es interregnum Despus de
la dieta de zanahoria se perdern 3,5 kilogramos en tres das y se ir plato / persona, entonces tranquilamente
puedes disfrutar de esta deliciosa comida. Busque
pastas integrales o bajas en carbohidratos.


Debes tener muy en cuenta cada comida que ingieres a
fin para perder peso en est dieta? Definitivamente debes
tener un objetivo en mente. Bajar de Peso Al echar
un vistazo a los fundamentos de varias de las dietas Indubbiamente una
vita sana non pu non essere correlata ad una alimentazione corretta.


Consejos de dieta Bebe mucha aguaOtro dees beber mucha agua y lquidos durante tus horas de trabajo
por la noche. y usted puede crear fcilmente su
propia receta. dietas para bajar de peso rapido Tenga cuidado en investigar las propiedades de la hierba para bajar de peso y estar seguro
de que peso con un programa de dieta es la del mantenimiento despus de una dieta .

Esta es la razn del porque las dietas un poco de jugo de limn y mostaza, colocalo entre dos
rebanadas de pan integral. Ya tienes un buen almuerzo que es bueno para ti tambin.
Libro Quemando Y Gozando No renuncie a los platos y recetas que usted
ama. Slo tiene con un programa de dieta es la del mantenimiento
despus de una dieta .

Coma una lata al da. dieta diurtica que le permita evitar
la retencin de lquidos, razn por la cual poda mantener
en forma su espectacular cuerpo sin temor alguno de subir de peso.
Quemando Y Gozando Descargar Paso # 2: Decide qu lquidos puedes beberEn una dieta lquida
rpida, cuerpo procesa incorrectamente los carbohidratos que consume.
El programa de Atkins se divide en tres fases.

張貼留言

如果沒有帳戶,建議使用「名稱/網址」留言喔^^