>>  Site Map >>  Forums >>  PHP+MySql

Forum module - topics in forum:



PHP+MySql - Coding mã nguồn mở rât thông dụng để làm web, và hệ thống cơ sỏ dữ liệu rất mạnh duợc ưa chuộng



code đơn giản để lấy tỉ giá tiền tệ bằng PHP

Như các bạn đã biết (có thể có người chưa biết), trang hxxp://xe.com là 1 trang web cung cấp thông tin tỉ giá rất lớn với rất nhiều đơn vị tiền tệ, cập nhật từng phút một. Tuy nhiên để lấy những thông tin đó trực tiếp từ data-feed của nó thì phải trả tiền, chả lẽ bó tay? Không! Nếu bạn ghé qua trang chủ của nó sẽ thấy nó cho mình 1 form có thể xem được tỉ giá (hxxp://www.xe.com/ucc/) Bingo! Vậy là nó "chít" rồi! Chúng ta có thể tận dụng điểm này để lấy thông tin về trang web của mình

Xem source của nó sẽ thấy có một vài thông tin thú vị:
HTML Code:

Code: :
<form name="ucc" method="post" action="http://www.xe.com/ucc/convert.cgi"> <input type="text" name="Amount" value="1" size=10><br> <select class="uccinpts" name="From" size=5 onChange="CheckMore()"> <option value="EUR" SELECTED>Euro - EUR</option> .... <option value="XPD">Palladium Ounces - XPD</option> </select><br> <select class="uccinpts" name="To" size=5 onChange="CheckMore()"> <option value="USD" SELECTED>United States Dollars - USD</option> .... <option value="XPD">Palladium Ounces - XPD</option> </select><br> <input class="uccsub" type="submit" name="submit" value="Perform Currency Conversion">


Vậy là dữ liệu sẽ gửi theo phương thức POST đến file convert.cgi, dữ liệu bao gồm dữ liệu của textbox tên là i]Amount[/i], 2 hộp chọn tên là From và To. Để "giả lập" 1 lần truy xuất bình thường ta sẽ sử dụng đoạn code sau:
PHP Code:
Code: :
<?php
$neededs = Array ("USD","EUR");

foreach ($neededs as $needed)
{
    $fp = fsockopen("www.xe.com", 80, $errno, $errstr, 30);
    if (!$fp) {
        echo "$errstr ($errno)<br />\n";
    } else {
        $out = "POST /ucc/convert.cgi HTTP/1.1\r\n";
        $out .= "Host: www.xe.com\r\n";
        $out .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1)\r\n";
        $out .= "Referer: http://www.xe.com/ucc/\r\n";
        $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
        $out .= "Content-Length: 59\r\n\r\n";
        $out .= "Amount=1&From=$needed&To=VND&submit=Perform+Currency+Conversion\r\n";

        fwrite($fp, $out);
        while (!feof($fp)) {
           $rt .= fgets($fp, 128);
        }
        fclose($fp);
    }

    preg_match("/1 $needed = [0-9\,\.]+ VND/",$rt,$out);
    echo "<p>$out[0]</p>\r\n";
}
?>

Trong đoạn code trên có 1 vài hàm mới:

fsockopen: mở kết nối tới 1 tên miền Internet/Unix ~> coi như 1 file dữ liệu
Cấu trúc: fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )
- target: chính là trang web hướng tới ~> "www.xe.com"
- port: là cổng sử dụng để kết nối ~> cổng http là 80
- errno: là mã lỗi
- errstr: là xâu chứa thông tin vầ lỗi
- timeout: nếu sau khoảng thời gian này mà không hoàn thành thì sẽ báo lỗi Timed Out
- Hàm này sẽ trả lại 1 resource để ta sử dụng, nếu không thành công sẽ trả về null

fwrite: ghi thông tin nhị phân lên file
Cấu trúc: int fwrite ( resource handle, string string [, int length] )
- handle: là 1 file sẽ dùng để ghi dữ liệu lên
- string: xâu chứa dữ liệu cần ghi
- Hàm náy sẽ trả về số byte đã được ghi

fclose: đóng file
Cấu trúc: bool fclose ( resource handle )
- handle: file cần đóng
- Trả lại TRUE nếu thành công, FALSE nếu thất bại

feof: kiểm tra xem đã cuối file hay chưa
Cấu trúc: bool feof ( resource handle )
- handle: file cần kiểm tra
- Trả lại TRUE nếu đã cuối file hoặc bị lỗi, FALSE nếu chưa phải là cuối file

preg_match: thực hiện tìm kiếm với Regular Expression
Cấu trúc: int preg_match ( string pattern, string subject [, array &matches [, int flags [, int offset]]] )
- pattern: Regular Expression cần tìm
- subject: đoạn string được tìm kiếm
- matches: mảng lưu lại kết quả

Ngoài ra còn có đoạn:
PHP Code:
Quote: :
$out = "POST /ucc/convert.cgi HTTP/1.1\r\n";
$out .= "Host: www.xe.com\r\n";
$out .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1)\r\n";
$out .= "Referer: http://www.xe.com/ucc/\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: 59\r\n\r\n";
$out .= "Amount=1&From=$needed&To=VND&submit=Perform+Currency+Conversion\r\n";

$out sẽ là thông tin được "ghi" vào $fp, trên thực tế, thao tác "ghi" này sẽ gửi nội dung ckủa $out cho target được thiết lập trong fopensock, trong đoạn code thì nội dung của $out sẽ được gửi về www.xe.com
Diễn nôm nội dung của $out sẽ như sau:
- Phương thức gửi: POST
- Gửi tới /ucc/convert.cgi bằng giao thức HTTP/1.1
- Gửi kèm thông tin về trình duyệt User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1)
- Gửi thông tin về trang đã refer http://www.xe.com/ucc/ (để nó "tưởng" là ta đang duyệt site của nó thật! )
Phần sau đây là dữ liệu chính:
- Kiểu dữ liệu: application/x-www-form-urlencoded (đây là kiểu dữ liệu của càc form)
- Độ dài dữ liệu: 59 (byte)
- Nội dung dữ liệu: Amount=1&From=$needed&To=VND&submit=Perform+Curren cy+Conversion

Trong phần nội dung dữ liệu có 4 thông tin tất cả:
- Amount: lượng ngoại tệ
- From: loại ngoại tệ
- To: cũng là loại ngoại tệ
- submit: luôn luôn giữ nguyên
Có thể hiểu đơn giản là khi gửi $out tới www.xe.com thì nó sẽ hiểu là đang có 1 người cần biết đổi {Amout} tiền từ {From} thì được bao nhiêu {To}.

Ta có mảng $neededs là chứa các loại ngoại tệ cần xem tỉ giá với VND. Vòng lặp foreach sẽ duyệt từng giá trị một. Với mỗi giá trị thì $out gần như không thay đổi, chỉ thay đổi ở trong nội dung dữ liệu, phần From. Giả sử đang xét USD thì nội dung dữ liệu được gửi sẽ là
Code:

Quote: :
Amount=1&From=USD&To=VND&submit=Perform+Currency+Conversion


~> Máy chủ của xe.com sẽ trả về 1 trang kết quả như bình thường, nhiệm vụ cả ta bây giờ chỉ là lọc lấy dữ liệu mình cần với preg_match. RegularExpression được sử dụng là /1 $needed = [0-9\,\.]+ VND/. Nếu đang xét USD thì sẽ thành /1 USD = [0-9\,\.]+ VND/ (để hiểu về RegEx, bạn đọc bài viết trong box hướng dẫn hoặc tìm phần mềm RegExBudy để sử dụng). Cuối cùng câu lệnh echo sẽ in kết quả ra màn hình.

Quá trình lặp lại với các giá trị còn lại trong $neededs!

Chúc các bạn thành công






Ít nhất bro cho xin cái link credit về UDS Wink

PS: Sorry vì không PM được Smile






híc em update đây . post vội quá thôi ...
các bài khác UDS đều credit cả mà .. ( nhưng có điều hình như bài này UDS cũng là sưu tầm do đó chỉ lên ghi sưu tầm thôi thì phải )






ham fsockopen ko co ah?
Biet viet ham do nhu the nao?\
Ban post not ham do len di




Search from ALEXA


put your ads here