Monday, April 29, 2013

การใช้ curl extension สำหรับ ดึงส่วนต่างๆ ของหน้าเว็บ จากที่อื่น มาแสดงผลในหน้าเว็บเรา

การใช้ curl extension สำหรับ ดึงส่วนต่างๆ ของหน้าเว็บ จากที่อื่น มาแสดงผลในหน้าเว็บเรา


บทความนี้นะครับ ก็เป็นการ ใช้ extension cure เพื่อ ติดต่อ กับ URL อื่น และ ตัดข้อความบางส่วนออกมาใช้นะครับ
การใช้ cure นั้น จะมีลักษณะ คล้ายๆ กับ ajax คือ cure สามารถติดต่อ และส่ง ค่าตัวแปร ด้วย get หรือ post ไปยัง url อื่น และรับข้อมูลประมวลผล กลับมาแสดงในหน้าเว็บได้ ซึ่ หากเป้น ajax process การทำงานนั้นจะ อยู่ที่ agent ฝั่ง client นั่นคือ object xmlHTTPRequest นะครับ
แต่หากเป็น cure นั้น agent หรือตัวกลาง จะอยู่ที่ฝั่ง server ภายใต้ environment ของ PHP ที่เปิด extension cure ใน php.ini นะครับ
อันดับแรก ผมอยากจะให้ดูวิธีการใช้ cure ซักนิด ด้วยตัวอย่างง่ายๆ เช่นการ Login
โจทย์ของผมคือ สร้าง ฟอร์ม Login ขึ้นมา และส่งค่า username และ password ไปยัง ไฟล์ curl_service.php ซึ่ง จะให้บริการ ตรวจสอบ username และ password จาก database ซึ่ง ฟอร์ม Login และ curl_service.php นั้น จะอยู่กัน คนละ server และ server ของ formLogin.php นั้นไม่สามารถติดต่อ database ได้

ที่ server 1 (ไม่สามารถติดต่อ Db ได้ แต่เปิด curl) ไฟล์ formLogin.php โคดดังนี้
  1. <?php
  2. $submit=$_POST["Submit"];
  3. $curlurl ="http://server2/curl/curl_service.php"; // url เพื่อเรียก ไปที่ curl_service ที่อยู่ใน server ที่สามารรถติดต่อดาต้าเบสได้


  4. function reg_login($username,$password)
  5. {
  6. global $curlurl;
  7. $user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
  8. $params = "username=$username&password=".$password;


  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  11. curl_setopt($ch, CURLOPT_HEADER, 0);
  12. curl_setopt($ch, CURLOPT_POST,1); // method ที่เราจะส่ง เป็น get หรือ post
  13. curl_setopt($ch, CURLOPT_POSTFIELDS,$params); // paremeter สำหรับส่งไปยังไฟล์ ที่กำหนด
  14. curl_setopt($ch, CURLOPT_URL,$curlurl);
  15. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  16. curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);

  17. $result = curl_exec($ch); // ผลการ execute กลับมาเป็น ข้อมูลใน url ที่เรา ส่งคำร้องขอไป
  18. curl_close ($ch);
  19. return $result;
  20. }
  21. ?>

  22. <HTML>
  23. <HEAD>
  24. <TITLE> New Document </TITLE>
  25. <META NAME="Generator" CONTENT="EditPlus">
  26. <META NAME="Author" CONTENT="">
  27. <META NAME="Keywords" CONTENT="">
  28. <META NAME="Description" CONTENT="">
  29. </HEAD>

  30. <BODY>
  31. <form action="<?php $_SERVER["PHP_SELF"];?>" method="post">
  32. <table width="500" border="0" align="center" cellpadding="1" cellspacing="1" bgcolor="#CCCCCC">
  33. <tr bgcolor="#CCFFFF">
  34. <td colspan="2"><strong>Curl Login Form !!</strong></td>
  35. </tr>
  36. <tr>
  37. <td width="127" bgcolor="#FFFFFF"><strong>username</strong></td>
  38. <td width="366" bgcolor="#FFFFFF"><input type="text" name="txtname"></td>
  39. </tr>
  40. <tr>
  41. <td bgcolor="#FFFFFF"><strong>password</strong></td>
  42. <td bgcolor="#FFFFFF"><input type="text" name="txtpass"></td>
  43. </tr>
  44. <tr>
  45. <td bgcolor="#FFFFFF"> </td>
  46. <td bgcolor="#FFFFFF"><input type="submit" name="Submit" value="Submit">
  47. <input type="reset" name="Submit2" value="Reset"></td>
  48. </tr>
  49. </table>
  50. </form>
  51. <?php
  52. // ตรวจสอบ การกดปุ่ม submit
  53. if (isset($submit)){
  54. $username=$_POST["txtname"];
  55. $password=$_POST["txtpass"];
  56. echo reg_login($username,$password);
  57. }
  58. ?>
  59. </BODY>
  60. </HTML>
คัดลอกไปที่คลิปบอร์ด
ที่ server 2 (สามารถติดต่อ Db ได้ ไม่ได้เปิด curl) ไฟล์ curl_service.php โคดดังนี้
  1. <?php
  2. // รหัส login
  3. $admin_user="admin";
  4. $admin_pass="123";


  5. // เว็บ service โดยใช้ curl เป็นหลัก
  6. $user=$_POST["username"];
  7. $pass=$_POST["password"];


  8. if ($admin_user==$user && $admin_pass==$pass) {
  9. echo "Login ถูกต้องนะครับ ยินดีต้อนรับคุณ ".$user;
  10. }else{
  11. echo "ไม่ถูกต้องกรุณา Login ใหม่ด้วยนะครับ !!";
  12. }
  13. ?>
คัดลอกไปที่คลิปบอร์ด
จะเห็นได้ว่า ใน โคดที่ curl_service.php คือการเขียนโคด ตรวจสอบ login ธรรมดา ทั่วไป และมีการ echo ข้อความเท่านั้น
ซึ่งทั้งหมดนี้ process ของการ ส่งค่า และรับค่าไปแสดงผล จะอยู่ที่กระบวนการทางฝั่งของ formLogin.php โดยผ่านตัวกลาง agent ก็คือ curl นั่นเอง

ที่กล่าวมานี้ จะเป็น แค่ตัวอย่าง การใช้ curl เป็นตัวกลางในการส่งค่า ไปยังเว็บอื่น เพื่อ แสดงผลข้อมูล ต่อไป เราจะ ได้ทดลอง การตัดต่อ ข้อความเฉพาะส่งจาก เว็บไซต์อื่นนะครับ ด้วย ตัวอย่าง การ ดึง บทความจากเว็บไซต์ เมืองนอก มาแสดงผลในหน้าเว็บเรา โดยการ ตัดเอาเฉพาะ ข้อมูล ตรง ส่วน main บทความเท่านั้น นะครับ
  1. <?php
  2. $url="http://www.4guysfromrolla.com/webtech/";
  3. if ($viewcat<>"")
  4. $url.=$viewcat;
  5. else
  6. $url.="index_asp.shtml";


  7. function replaceLink($data){
  8. $data = ereg_replace('<a href="/webtech/','<a href="aspnet_article.php?viewcat=',$data);
  9. return $data;
  10. }

  11. function callArticle(){
  12. global $url;
  13. $user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
  14. // $params = "";
  15. // $url .="?".$params;
  16. $ch = curl_init();
  17. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  18. curl_setopt($ch, CURLOPT_HEADER, 0);
  19. curl_setopt($ch, CURLOPT_POST,0);
  20. //curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
  21. curl_setopt($ch, CURLOPT_URL,$url);
  22. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  23. curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);

  24. $result = curl_exec($ch);
  25. $start_result = strpos($result,"<!--content_start-->");


  26. $end_result = strpos($result,"<P><CENTER>",$start_result+11);
  27. $substring .= substr($result,$start_result,$end_result-$start_result);
  28. curl_close ($ch);
  29. return replaceLink($substring);
  30. }
  31. ?>
  32. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  33. <HTML>
  34. <HEAD>
  35. <TITLE> New Document </TITLE>
  36. <meta http-equiv="Content-Type" content="text/html; charset=tis-620">
  37. </HEAD>

  38. <BODY>
  39. <h2>การตัดต่อ Article http://www.4guysfromrolla.com/webtech/index_asp.shtml <br>ผลลัพธ์ที่ได้คือ</h2><hr>
  40. <?php
  41. echo callArticle();
  42. ?>
  43. </BODY>
  44. </HTML>
คัดลอกไปที่คลิปบอร์ด
จะเห็นว่า เมื่อ curl ไปดึงบทความจากเว็บไซต์ตัวอย่างมาแล้ว ผมจะทำการ ใช้ function strpos ของ php เพื่อ ค้นหา เอา tag ที่ เป็นส่วน content ที่ผมต้องการ โดยการ find หา จุด string start และ หา string end ก็คือ บริเวณที่ tag ของ content สิ้นสุด ที่เราต้องการ
เราก็จะได้ข้อมูล บริเวณ ภายใต้แทก start และ end ของข้อมูลครับ
ทั้งนี้ ก่อนที่เราจะหา content start ได้ เราจำเป็นจะต้อง มอง content ของเว็บที่เราต้องการ ให้เป็น Dom เพื่อหา บริเวณ แทก ที่เป็นจุดเริ่มของ content ที่เราต้องการ มาครับ และ มองหา บริเวณ ของ dom จุดที่เป็น จุดสิ้นสุด ของ content ที่เราต้องการ เพื่อมาตัดต่อเอา ข้อมูลเฉพาะนะครับ

1 comments:

Unknown said...

ผมอยากได้วิธีการสอนดึงข้อมูลจากเว็ป พี่พอจะมีวิธีการดึงแบบระเอียดรึป่าวครับ อยากจะทำมาทำโปรเจ็ค

Post a Comment

 
Design by I Love PHP