HACK#36 รู้จักกับ XooMLe ซึ่งเป็น Google API ในรูปของ Plain Old XML

ตอนที่ Google เปิดตัว Web API เมื่อเดือนเมษายน ค.ศ. 2002 ทุกคนเห็นตรงกันว่าเป็นสิ่งที่น่าสนใจเป็นอย่างยิ่ง แต่บางคนเห็นว่าน่าจะมีอะไรที่ดีกว่านี้ โดยตอนนั้น Google API ใช้โปรโตคอล SOAP (SOAP : Simple Object Access Protocal) ซึ่งไม่ใช่สิ่งที่ทุกคนหวังเอาไว้
SOAP มีอะไรผิดหรือ? Google ได้สร้างเครื่องมือสืบค้นที่ใหญ่ที่สุดและดีที่สุดในโลกสำหรับการบริการบน เว็บอย่างแท้จริง ดังนั้น SOAP ต้องดีด้วยใช่ไหม? อาจจะใช่! แต่หลายๆคนแย้งว่า การใช้ SOAP นั้นทำให้การเข้าถึง Google Service ยุ่งยากเกินความจำเป็น เพราะเพียงแต่ Google ใช้เทคโนโลยีที่อยู่บนฐานของ HTML ก็มีทุกอย่างที่ต้องการอยู่แล้ว แถมยังง่ายกว่าอีกด้วย ซึ่งคำกระทบกระเทียบเหล่านี้ก็ไม่ได้เลือนหายไปง่ายๆ เนื่องจาก Google เป็นที่รู้จักและใช้กันกว้างขวางก็เพราะความเรียบง่ายนั่นเอง หากแต่ตอนนี้กลายเป็นโดนตอกกลับเสียแล้วว่ากำลังเสนอ Service ที่เข้าถึงยากสำหรับนักพัฒนา
มี การโต้เถียงกันว่า SOAP นั้นไม่ดี และสิ่งที่ Google ต้องการจริงๆคือ REST (Representational State Transfer) ต่างหาก REST อันเป็นต้นแบบของ web service ที่ใช้โปรโตคอลและเทคโนโลยีต่างๆที่มีอยู่แล้ว เป็นต้นว่า HTTP GET request, URI หรือ XML ในการตระเตรียมการทำธุรกรรมต่างๆที่เกี่ยวข้องกับ web service ทั้งนี้กลุ่มผู้โต้แย้งเห็นว่า REST ทำให้การทำงานง่ายกว่ากันเยอะ ในขณะที่ได้ผลลัพธ์ในระดับเดียวกัน
ผู้ สนับสนุน REST เห็นว่า Google น่าจะทำให้ API ใช้งานได้ง่ายๆโดยเพียงผ่านการ request URI เท่านั้น รวมไปถึงการค้นหาด้วยพารามิเตอร์ที่เป็นอักขระ (query string-based parameter) อย่างคีย์เวิร์ดที่ใช้ในการสืบค้นและการเข้ารหัสผลลัพธ์ โดยผลที่ได้ควรจะเป็นเอกสาร XML ง่ายๆ ที่ครอบคลุมการแสดงผลลัพธ์ชนิดต่างๆได้รวมไปถึง error message ด้วย
หลัง จากได้ลองเล่น Google API ดูระยะหนึ่ง ผู้เขียนก็ได้ประสบการณ์รวมถึงจับทิศทางได้พอควร อย่างน้อยก็ในเรื่องวิธีการทำงานต่างๆระหว่างผู้เขียนกับ WSDL รวมทั้งเกร็ดเล็กเกร็ดน้อยในการใช้งาน Google ด้วย นอกจากนี้ผู้เขียนได้อ่านคำแนะนำและข้อเสนอที่ว่า Google ควรจะทำอย่างไรบ้าง รวมถึงสิ่งที่ได้เริ่มลงมือทำไปแล้ว ซึ่งผลก็คือ XooMLe (http://www.dentedreality.com.au/xoomle/) นั่นเอง
ลำดับ แรกคือ การสร้างสถาปัตยกรรมที่มั่นคงเพื่อการเข้าถึง Google API ซึ่งผู้เขียนใช้ภาษาสคริปต์ที่โด่งดังและใช้กันแพร่หลายอย่าง PHP ซึ่งทำอย่างง่าย ๆโดยเพียงแค่ไปหยิบคลาสที่มีอยู่แล้วมาใช้งาน ซึ่งก็คือ NuSOAP (ชุดของ Dietrich Ayala) นั่นเอง เมื่อผู้เขียนได้มาแล้ว ขั้นตอนที่เหลือก็ไม่ยากอีกต่อไป ก็เพียงแต่เขียนฟังก์ชันเพิ่มเติมนิดหน่อย และต่อเติมฟังก์ชันที่มีอยู่บ้างเล็กน้อยเพื่อเรียกใช้ SOAP รวมทั้งการทำการคิวรี Google ด้วย และอีกส่วนก็คือการแปลงรูปแบบการตอบสนอง (respond) เพื่อให้บางอย่างชัดเจนยิ่งขึ้น
ผู้ เขียนเลือกที่จะติดตั้งระบบที่รับการ request เพียง URL เดียวพร้อมกับพารามิเตอร์อีกเพียงจำนวนหนึ่งก่อน (เพราะว่าในขั้นนี้ผู้เขียนยังไม่คุ้นเคยกับการทำงานของ RESTful) ทั้งนี้ขึ้นอยู่กับว่า method ไหนจะถูกเรียกจาก Google ซึ่งสำหรับผลลัพธ์ที่ได้กลับคืนมาจะขึ้นกับชนิดของการ request ดังต่อไปนี้
Method ของ Google
ชนิดของผลลัพธ์
doGoogleSearch
เอกสาร XML (XML document) ซึ่งเป็นข้อมูลที่มีรูปแบบเป็นโครงสร้างที่แน่นอน (structured information) ที่เป็นผลลัพธ์ที่ได้จากการค้นหา
doGoogleSpellingSuggestion
ข้อความ plain text แสดงคำแนะนำการสะกดคำที่ถูกต้อง (suggested spelling correction)
doGetCachePage
โค้ด HTML ที่เป็นหน้า cached page ที่ Google ทำการ cache เอาไว้

โดย method เหล่านี้ทั้งหมดจะแสดง error message ในรูปแบบภาษา XML (XML-encoded error message) ซึ่งจะทำให้ง่ายต่อนักพัฒนาโปรแกรม ในการที่จะตัดสินใจได้ว่า request ใดๆสำเร็จ (success) หรือล้มเหลว (failure)
การ ตระเตรียมอินเทอร์เฟซนี้ยังต้องการการประมวลผลเล็กน้อย ก่อนที่จะคืนข้อมูลกลับมายังผู้ใช้งาน อย่างเช่นกรณีของ doGoogleSearch ผลของคำสั่งคือการ map กับ XML template แล้วคืนค่ากลับ (return) สำหรับ doSpellingSuggestion นั้นก็เพียงแต่ดึงคำแนะนำในการสะกดคำออกมาแล้วส่งค่ากลับเท่านั้น ขณะที่ doGetCachePage จะต้อง decode ผลลัพธ์ แล้วก็แยกห้าบรรทัดแรกของรหัส HTML ซึ่งเป็น google header ออกมา ด้วยวิธีนี้จะทำให้ XooMle จะส่งผลลัพธ์ให้แก่ผู้ใช้งานเท่าที่ผู้ใช้ต้องการเท่านั้น นั่นคือ เป็นส่วนแคชของหน้าเว็บเพจ (cached copy of a page) เป็นคำแนะนำในการสะกดคำ และผลของการสืบค้นที่ตรงกับคีย์เวิร์ดที่ใช้สืบค้นนั่นเอง
ผู้เขียนเลือกที่จะใช้ XML template แทนที่จะเขียนโค้ดเองล้วนๆ โดยที่
เท ลมเพลตนี้จะเป็นส่วนที่กำหนดโครงสร้างของรายการผลลัพธ์ที่ได้จากการค้นหา (result set) ทั้งหมดที่ Google ส่งคืนกลับมา รวมถึงส่วนที่เป็นข้อมูลเพิ่มเติมต่างๆด้วย เช่น เวลาที่ใช้ไปในการสืบค้น, Title ของผลลัพธ์, URL ของผลลัพธ์นั้น และอาจรวมไปถึงข้อมูลอื่นๆที่ Google ได้เก็บไว้ โดย XML template นี้จะขึ้นโดยตรงกับโครงสร้างใน WSDL และข้อมูลจริงที่ Google ให้คืนกลับมา โดยจะถูก parse และบางส่วนจะถูกทำซ้ำและแก้ไขดัดแปลงตามต้องการ ดังนั้นจากเอกสาร XML เปล่าๆก็จะเต็มไปด้วยผลลัพธ์แล้วส่งต่อไปยังผู้ใช้อีกทีหนึ่ง และถ้าหากว่ามีบางสิ่งผิดพลาด error message ก็จะถูก encode ในรูปแบบของ XML template ที่แตกต่างกันออกไป แล้วส่งกลับมาแทน
ทันที ที่การค้นหาเริ่มต้นขึ้น ส่วนที่เป็นคำแนะนำในการสะกดคำ (spelling suggestion) จะถูกเพิ่มเข้าไปทันที โดยเพียงแต่เป็นการดึงคำแนะนำออกมาจาก SOAP envelop แล้วคืนออกมาเป็นตัวอักษร plain text ธรรมดาๆเท่านั้น หันไปดูในส่วนของหน้า cached page ซึ่งจะมีการดัดแปลงเล็กน้อย โดยที่ผลลัพธ์จะต้องถูกแปลงกลับเป็นตัวอักษรธรรมดา จากนั้น google header บนหน้า cached page นั้นจะถูกดึงออก เมื่อเสร็จสิ้นกระบวนการดังกล่าวแล้ว ข้อมูลทั้งหมดก็จะถูกส่งไปยังผู้ใช้อย่างต่อเนื่อง
หลัง จากการโพสต์ผลที่ได้ไปยังเว็บไซต์ DentedReality ก็ปรากฏว่าไม่มีอะไรเกิดขึ้นเลย ไม่มีใครรู้จัก XooMLe ดังนั้นจึงไม่มีใครใช้มัน แต่บังเอิญผู้เขียนได้เข้าไปอ่าน Scripting News ของ Dave Winer จึงได้ลองส่งอีเมล์เกี่ยวกับ XooMLe ไปยัง Dave ในทำนองว่า Dave อาจจะสนใจใน XooMLe และหลังจากนั้นเพียงภายในห้านาทีเท่านั้น ก็มีลิงก์เชื่อมโยงไปยังผลงานของผู้เขียนบน Scripting News โดยมีการอธิบายว่าเป็นหนึ่งใน “อินเทอร์เฟซแบบ REST” และภายใน 12 ชั่วโมงเท่านั้น ก็มีคนประมาณ 700 คนเข้ามาเยี่ยมชมเว็บไซต์ และไม่หยุดอยู่แค่นั้น เช้าวันต่อมา เมื่อผู้เขียนเปิดอีเมล์ ก็ได้ข้อความจาก Paul Prescod แนะนำในส่วนอื่นๆของ RESTful อีก รวมทั้งการปรับปรุงฟังก์ชันทั่วไปเพื่อให้มันเป็น service อีกตัวหนึ่ง
หลัง จากการแลกเปลี่ยนอีเมล์โดยตรงกับ Prescod และได้รับคำแนะนำรวมทั้งความเห็นจากคนอื่น ๆใน REST – discuss Yahoo ! Group (ซึ่งผู้เขียนได้สมัครเป็นสมาชิกนับตั้งแต่บัดนั้น) ผู้เขียนได้ปรับปรุง XooMLe เสียใหม่อย่างขนานใหญ่ โดยมีการเปลี่ยนแปลงดังนี้
  • เลี่ยงการใช้ URL เดียวในทุก method โดยเพิ่ม /search/, /cache/ และ /spell/ เข้าไปต่อท้าย URL เพื่อที่ว่าจะได้มี URL แยกเฉพาะในแต่ละ method ไปเลย
  • ข้อ จำกัดที่ Google กำหนดให้มีผลลัพธ์การค้นหาได้ไม่เกิน 10 รายการต่อการคิวรีหนึ่งครั้ง ได้ถูกแก้ไขโดยให้ XooMLe วนลูบ และส่งกลับออกมาเป็นเอกสาร XML เพียงชุดเดียวในตอนท้าย
  • เพิ่มส่วน ของ cachedVersion ลงในผลลัพธ์แต่ละรายการ ซึ่งจะมีลิงก์เตรียมไว้พร้อม เพื่อดึงสำเนาของเว็บเพจที่แคชเอาไว้ผ่าน XooMLe ได้ในทันที
  • ถ้า หากว่าข้อมูลที่เกี่ยวข้องกันมีอยู่ใน Google ด้วย ก็จะมีลิงก์เตรียมไว้เพื่อให้ดึงข้อมูลนั้นออกมาได้ เพิ่ม XLing (สำหรับ relatedInformation และ cachedVersion) เข้าไปยัง URL ซึ่งจะช่วยให้สามารถสร้างลิงก์ได้อย่างอัตโนมัติผ่านเทคโนโลยี XML
  • เพิ่ม ความสามารถในการระบุ XSLT เมื่อทำการสืบค้น ซึ่งจะทำให้สามารถใช้เทคโนโลยี XML ล้วนๆ ในการกำหนดแบบของผลลัพธ์ให้อยู่ในรูปแบบที่คนเราอ่านเข้าใจได้
ดัง นั้น RESTful Web Service จึงได้ถือกำเนิดขึ้นมา ซึ่ง XooMLe มีฟังก์ชันของ Google API อย่างเต็มที่ (ที่จริงแล้วได้ขยายความสามารถออกไปในบางจุดด้วย) โดยอยู่ในรูปแบบที่เรียบง่าย ขณะที่ผลลัพธ์ที่ได้จาก XooMLe นั้นสามารถทำ bookmark ไว้ได้ด้วย ส่วนคำแนะนำในการสะกดนั้นสามารถเข้าถึงอย่างง่ายดายด้วย Bookmaklet นอกจากนี้ผลลัพธ์สามารถ parse ในภาษาคอมพิวเตอร์ได้แทบทุกภาษาโดยใช้ฟังก์ชันง่ายๆที่มีอยู่ และสำหรับหน้า cached page นั้นก็พร้อมเสมอต่อการเรียกใช้งาน
XooMLe ได้แสดงให้เห็นแล้วว่า มันเป็นไปได้ที่ Google จะสร้าง API โดยใช้สถาปัตยกรรมของ REST ซึ่งปัจจุปัน XooMLe ได้ถูกเลือกให้เป็นหนึ่งในตัวอย่างของ REST done right โดยกลุ่มผู้ที่สนับสนุนจำนวนหนึ่งรวมทั้งจากลิงก์บางแห่งจาก Amazon/Google ที่พัฒนาโดยสมาชิกของกลุ่มสนทนา REST (REST-discuss members)
โดย ตัวของมันเอง XooMLe อาจจะไม่มีประโยชน์นัก แต่เมื่อมันถูกผนวกเข้ากับจินตนาการและพลังการเขียนโปรแกรมของชุมชน Web Service แล้วนั้น ไม่ต้องสงสัยเลยว่ามันจะเกิดคลื่นแห่งของเล่น เครื่องมือ และประเด็นพูดคุยใหม่ๆออกมาได้แน่นอน
XooMLe ทำงานอย่างไร
โดย ทั่วๆไป หากจะใช้ XooMLe คุณเพียงแต่ “request” หน้าเว็บสักหน้าหนึ่ง จากนั้นก็ทำอะไรสักอย่างกับผลที่ส่งกลับมาให้เท่านั้น โดยบางคนอาจจะเรียกมันว่าเป็นสถาปัตยกรรมแบบ request-response โดยที่เมื่อคุณ request XooMLe ในบางสิ่งบางอย่าง มันก็จะไป request Google ในสิ่งเดียวกันให้อีกทีหนึ่ง แต่จะจัดรูปแบบของผลที่ได้ตามรูปแบบเฉพาะของมันเอง แล้วจึงส่งต่อให้คุณอีกทอดหนึ่ง จากนั้นคุณจะทำอะไรกับผลลัพธ์ดังกล่าวก็ได้ ซึ่งถ้ากล่าวสั้นๆก็คือ อะไรก็ตามที่คุณถามเอาจาก Google SOAP API ได้ คุณก็ถามเอาจาก XooMLe ได้เหมือนกัน
Google method: doGoogleSearch
  • XooMLe URI อยู่ที่ http://xoomle.dentedreality.com.au/search/
  • Successful Response Format: ตอบกลับด้วยเอกสาร XML document ที่เป็นผลลัพธ์การสืบค้นด้วย Google ที่คุณได้ระบุไว้
  • Failure Response: แสดง error message ที่เป็นเอกสาร XML รวมทั้ง argument ต่างๆทั้งหมดที่คุณส่งไปยังXooMLe ด้วย (มีตัวอย่างอยู่ที่ http://www.dentedreality.com.au/xoomle/sample_error.xml)
คุณสมบัติเพิ่มเติม
  • maxResults : กำหนด maxResults ให้ได้ผลลัพธ์มากกว่า 10 รายการ โดย Google จะทำการวนลูปเพื่อคิวรีสืบค้นข้อมูลให้ได้ตามจำนวนที่ต้องการ แล้วส่งออกมาในตอนท้ายทีเดียวเลย
  • cachedVersion : ในผลลัพธ์แต่ะละรายการจะมีส่วนของ cached version ของผลลัพธ์นั้นๆไว้ด้วย โดยจะให้มาในรูปของ URI ที่ใช้ในการดึงหน้า cached page นั้นๆออกมา
  • xsl : คุณอาจจะระบุตัวแปรที่ชื่อ xsl เพิ่มเข้าไปในการคิวรีด้วย โดยค่านี้จะใช้ในการอ้างอิงไปยัง external XSLT stylesheet และจะถูกใช้ในการกำหนดรูปแบบ XML ที่คืนให้ผู้ใช้
  • relatedInformation : ถ้าหากมีการตรวจพบว่ามีข้อมูลเพิ่มเติมที่เกี่ยวข้องในแต่ละ resultElement แล้ว ก็จะมีลิงก์เพื่อดึงข้อมูลนั้นจาก XooMLe ด้วย
  • xlink : เป็นxlink attribute ที่เพิ่มเข้าไปยัง cachedVersion และ relatedInformation ของผลลัพธ์แต่ละรายการ
Google Method: doSpellingSuggestion
  • XooMLe URI อยู่ที่ http://xoomle.dentedreality.com.au/spell/
  • Successful Response Format: จะแสดงข้อความเป็นตัวอักษรธรรมดา ที่เป็นคำแนะนำให้แก้ไขข้อความหรือคำที่สะกดผิด ที่คุณส่งไปยัง Google ผ่าน XooMLe
  • Failure Response: จะแสดง error message ที่เป็นเอกสาร XML รวมทั้ง argument ต่างๆทั้งหมดที่คุณส่งไปยัง XooMLe ด้วย โดยข้อความจะเปลี่ยนไปตามความผิดพลาดชนิดต่างๆที่เกิดขิ้นตามจริง
Google Method: doGetCachedPage
  • XooMLe URI อยู่ที่ http://xoomle.dentedreality.com.au/cache/
  • Successful Response Format: จะให้ผลลัพธ์เป็นหน้า cached page ที่ request อย่างเดียว โดยปราศจาก google information header อย่างสิ้นเชิง ทั้งนี้เพราะ header ดังกล่าวจะถูกดึงออกก่อนที่จะแสดงผลลัพธ์ ดังนั้นคุณจะไม่ได้รับอะไรอื่นนอกจากโค้ด HTML ที่ใช้ในการสร้างเว็บหน้านั้นๆเพียงอย่างเดียว
  • Failure Respond: แสดง error message ในรูปเอกสาร XML รวมทั้ง argument ต่างๆทั้งหมด ที่คุณส่งไปยัง XooMLe ด้วย
การ request XooMLe
การ ที่จะ request อะไรสักอย่างจาก XooMLe นั้นเป็นเรื่องง่ายนิดเดียว โดยสามารถทำได้ทั้งในรูปของ hyperlink, bookmark หรือกระทั่งจาก favorite โดยการ request ต่อ XooMLe นั้นอยู่ในรูปของ URL ที่มีลักษณะดังนี้
http://xoomle.dentedreality.com.au/search/?key=yourGoogleDeveloperKey&q=dented+reality

เป็นยังไงบ้าง ง่ายไหม? และเมื่อคุณจะคุยกับ XooMLe เมื่อใดก็ตาม address ที่ต้องการก็คือ
http://xoomle.dentedreality.com.au//

โดย request ของคุณอาจจะดูเหมือนข้างต้น หรือไม่ก็อาจเป็นดังข้างล่างนี้ก็ได้
http://xoomel.dentedreality.com.au/search/
?key=YourKey
&q=dented+reality
&maxResults=1
&start=0
&hl=en
&ie=iso-8859-1
&filter=0
&restrict=countryAU
&safeSearch=1
&lr=en
&ie=latin1
&io=latin1
&xsl=myxsl.xsl

ที่ให้ออปชันต่างๆอยู่คนละบรรทัดกัน เหตุผลเพียงอย่างเดียวก็เพื่อทำให้อ่านง่ายนั่นเอง
พารามิเตอร์ทั้งหลายนั้น มีอยู่ในคู่มือของ Google แล้ว ในที่นี้เพียงแต่ทบทวนความจำกันนิดหน่อยเท่านั้นเอง

ส่วน key ในคำสั่งข้างต้นนั้นหมายถึง Google Developer Key ของคุณนั่นเอง ถ้าหากยังไม่มี คุณจะต้องไปลงทะเบียนกับ Google เสียก่อน

อีก อย่างหนึ่งที่คุณอาจจะอยากรู้ก็คือ XooMLe ใช้เทคนิคของการวนรอบเพื่อให้คุณสามารถ request ผลลัพธ์ได้มากกว่า 10 รายการต่อครั้ง เป็นต้นว่าถ้าหากคุณต้องการผลลัพธ์ 300 รายการ มันก็จะ query ไปยัง Google หลายรอบ แล้วส่งผลลัพธ์ทั้ง 300 รายการให้คุณในรูปของ XML ทีเดียวในตอนท้าย อย่างไรก็ตาม อย่าลืมว่าคุณได้ใช้โควต้าที่ Google กำหนดให้สามารถ request ได้ไม่เกิน 1,000 ครั้งต่อวันไปแล้วถึง 30 ครั้ง

Error Message
ถ้า หากว่าคุณทำอะไรผิดไปจากรูปแบบที่กำหนดไว้ XooMLe จะแจ้งให้คุณทราบในรูปของ XML package และสำหรับ error message นั้นมีหลายรูปแบบตามสาเหตุของมัน รายละเอียดข้างล่างนี้เป็น error message ที่คุณอาจได้รับ และเหตุผลว่าทำไมจึงได้รับข้อความเช่นนั้น

Google API key not supplied
คุณ ลืมใส่ Google API key ให้แก่ XooMLe คุณจำเป็นจะต้องใส่คีย์ดังกล่าวเพื่อที่ XooMLe จะได้สื่อสารกับ Google ในนามของคุณได้ วิธีการระบุก็คือใส่คีย์ของคุณลงไปแทน insert key here ถ้าหากว่าคุณยังไม่มีคีย์ ให้ลงทะเบียนขอรับได้จาก Google เสียก่อน มิฉะนั้นจะทำอะไรไม่ได้เลย

Search string not specified

คุณ มีความรู้มากพอที่จะใช้ method=doGoogleSeach แต่ว่ากลับลืมบอก XooMLe ว่าต้องการจะสืบค้นหาอะไร วิธีการแก้ไขทำได้ใช้คำสั่งลักษณะดังนี้ เช่น q=Your+search+terms (คำที่คุณต้องการค้นหา ควรใช้ให้ถูกต้องตามแบบของ URL ที่ถูกต้องด้วย)

Invalid Google API key supplied
มีบางอย่างผิดพลาดเกี่ยวกับคีย์ของคุณ (ลองตรวจดูว่าคุณลืมที่จะแปลงให้อยู่ในรูปแบบที่ URL ยอมรับได้หรือเปล่า)
Your search found no results
คำนี้ชัดเจนในตัวอยู่แล้ว

Phase not specified
ถ้าหากว่าคุณขอคำแนะนำในการสะกดคำ (ใช้ method=doSpellingSuggestion) คุณควรจะบอก XooMLe ด้วย โดยใช้ phase=stoopid+speling+here

No suggestion available
Google เองก็ไม่ได้สมบูรณ์แบบไปซะทุกอย่าง บางครั้ง request ของคุณเกี่ยวกับการสะกดคำก็ไม่คืนผลลัพธ์ใดๆกลับคืนมาเลย (บางที Google อาจจะถอดความจากคำสะกดที่ผิดของคุณไม่ได้ เลยทำให้หาคำที่ถูกมาเสนอไม่ได้ด้วย)

URL not specified
ถ้าหากว่าคุณต้องการหน้า cached page จาก Google ด้วย คุณก็ควรจะระบุให้ชัดเจน โดยใช้ url=http://thepagehere.com

Cached page not available
มี บางสิ่งผิดพลาดในหน้า cached page ที่ Google ให้มา (หรืออาจจะไม่พบหน้า cached page ของเว็บเพจที่อยู่ในรายการผลลัพธ์ในคลังข้อมูลของ Google ก็ได้) แต่ทั้งนี้ต้องไม่ลืมว่า ใช่ทุกหน้าเว็บเพจที่อยู่ใน Google จะต้องมี cached page เสมอ

Couldn’t contact Google server
มีปัญหาในการติดต่อกับ Server ของ Google ทำให้ request ของคุณจึงไม่สามารถประมวลผลได้

XooMLe ในทางปฏิบัติการแทนที่โมดูล SOAP :: Lite
XooMLe ไม่ได้เป็นเพียงวิธีเดียวที่จะทำให้ได้ผลลัพธ์จาก Google ในรูปของเอกสาร XML กลับคืนมาได้ แต่ว่าก็เป็นวิธีการง่ายๆในการที่จะนำมาใช้ทดแทน SOAP :: Lite ซึ่งเป็นโมดูลที่ ISP บางแห่งไม่สนับสนุน ไฟล์ XooMLe.pm จึงเป็นโมดูลเพิ่มเติมของ Perl ซึ่งเหมาะอย่างยิ่ง ที่จะเก็บไว้ในไดเรกทอรีเดียวกับโค้ดที่เป็นวิธีการแฮกรูปแบบต่างๆ ในหนังสือเล่มนี้

# XooMLe.pm
# XooMLe is a drop-in replacement for SOAP::Lite designed to use
# the plain old XML to Google SOAP bridge provided by the XooMLe
# service.

package XooMLe;
use strict;
use LWP::Simple; use XML::Simple;

sub new {
my $self = {};
bless($self);
return $self;
}

sub doGoogleSearch {
my($self, %args); ($self, @args{qw/ key q start maxResults
filter restrict safeSearch lr ie oe /}) = @_;
my $xoomle_url = 'http://xoomle.dentedreality.com.au';

my $xoomle_service = 'search';
# Query Google via XooMLe

my $content = get(
"$xoomle_url/$xoomle_service/?" .
join '&', map { "$_=$args{$_}" } keys %args
);
# Parse the XML my $results = XMLin($content);
# Normalize

$results->{GoogleSearchResult}->{resultElements} =
$results->{GoogleSearchResult}->{resultElements}->{item};

foreach (@{$results->{GoogleSearchResult}->{'resultElements'}}) {
$_->{URL} = $_->{URL}->{content};
ref $_->{snippet} eq 'HASH' and $_->{snippet} = '';
ref $_->{title} eq 'HASH' and $_->{title} = '';
}
return $results->{GoogleSearchResult};

}
1;

การใช้งานโมดูล XooMLe
นี่ เป็นตัวอย่างสคริปต์ที่จะแสดงว่าโมดูล XooMLe ฉบับทำเองนั้นทำงานอย่างไร ทั้งนี้ก็ไม่ต่างจากแฮกอื่นๆที่อยู่ในเล่มนี้นัก ส่วนที่มีการดัดแปลงจากเดิมที่ใช้กับ SOAP::Lite ให้ใช้กับ XooMLe ได้นั้น จะแสดงไว้วยตัวหนา (bold)


#!/usr/bin/perl
# xoomle_google2csv.pl
# Google Web Search Results via XooMLe 3rd party web service
# exported to CSV suitable for import into Excel
# Usage: xoomle_google2csv.pl "{query}" [> results.csv]

# Your Google API developer's key
my $google_key = 'insert key here';

use strict;

# Uses our home-brewed XooMLe Perl module
# use SOAP::Lite
use XooMLe;

$ARGV[0] or die qq{usage: perl xoomle_search2csv.pl "{query}"\n};

# Create a new XooMLe object rather than using SOAP::Lite
# my $google_search = SOAP::Lite->service("file:$google_wdsl");
my $google_search = new XooMLe;

my $results = $google_search -> doGoogleSearch(
$google_key, shift @ARGV, 0, 10, "false", "",
"false", "", "latin1", "latin1"
);

@{$results->{'resultElements'}} or warn 'No results';

print qq{"title","url","snippet"\n};

foreach (@{$results->{'resultElements'}}) {
$_->{title} =~ s!"!""!g;
# double escape " marks
$_->{snippet} =~ s!"!""!g;
my $output = qq{"$_->{title}","$_->{URL}","$_->{snippet}"\n};
# drop all HTML tags
$output =~ s!<.+?>!!g;
print $output;
}

การใช้งานแฮก
ให้ เรียกสคริปต์จากบรรทัดคำสั่ง โดยระบุการคิวรี และส่ง output ไปยังไฟล์ CSV ที่ต้องการ หรือไปยังไฟล์ที่คุณต้องการจะนำผลลัพธ์ที่ได้เข้าไปต่อท้าย (append) เช่น ถ้าจะใช้คำว่า “restful SOAP” ในการ query และส่ง output ไปยังไฟล์ result.csv ให้ระบุดังนี้
$ perl xoomle_google2csv.pl “restful SOAP” > results.csv
แต่ถ้าเอา > และ results.csv ออก จะทำให้ผลลัพธ์ที่ได้ถูกแสดงบนหน้าจอแทน
การนำไปใช้งาน
ด้วย วิธีการเดียวกันนี้ คุณก็สามารถที่จะปรับเปลี่ยนโค้ดที่เป็นการแฮก ที่ใช้กับ SOAP::Lite ในหนังสือเล่มนี้ รวมทั้งโค้ดที่คุณได้สร้างขึ้นมาเอง โดยให้ใช้กับ XooMLe ได้
  1. บันทึกเก็บไฟล์ XooMLe.pm ไว้ในไดเร็กทอรีที่คุณเก็บโค้ดในการแฮกไว้
  2. แทนที่คำว่า SOAP::Lite; ในโค้ดด้วย XooMLe;
  3. แทนที่คำว่า my $google_search = SOAP::Lite -> service (“file:$google_wdsl”); ในโค้ดด้วย my $google_search = new XooMLe;
จงตระหนักว่าจุดประสงค์ในการใช้งานของแต่ละคนไม่เหมือนกัน ดังนั้นจงอย่ากลัวที่จะดัดแปลงโค้ดต่างๆที่มีอยู่
โปรดดูเพิ่มเติม
PoXML (Hack#53) เป็น XML แบบเดิม ที่เป็นทางเลือกทดแทน SOAP::Lite
NoXML (Hack#54) เป็น  XML ที่อยู่บนฐาน expression ธรรมดา ซึ่งเป็นทางเลือกทดแทน SOAP::Lite แบบ Parser-free

โพสต์ยอดนิยมจากบล็อกนี้

I miss you all กับ I miss all of you ต่างกันอย่างไร

ปัญหาและเฉลยวิชาธรรม นักธรรมชั้นตรี สอบในสนามหลวง วันอังคาร ที่ ๒๙ กันยายน พ.ศ.๒๕๕๒

ปัญหาและเฉลยวิชาอนุพุทธประวัติ นักธรรมชั้นโท สอบในสนามหลวง วันอาทิตย์ ที่ ๒๐ พฤศจิกายน พ.ศ. ๒๕๔๘