<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1320886625518473727</id><updated>2012-02-16T21:45:32.327+07:00</updated><category term='Hack56'/><category term='Hack58'/><category term='Hack52'/><category term='Hack50'/><category term='Hack51'/><category term='Chapter-5'/><category term='Hack54'/><category term='Hack59'/><category term='Hack57'/><category term='Hack53'/><title type='text'>Hack 50-59</title><subtitle type='html'>Google Web API</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-3506679149997669041</id><published>2007-08-08T15:38:00.000+07:00</published><updated>2007-08-08T15:38:15.633+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack59'/><title type='text'>HACK#59 การเขียนโปรแกรม Google Web API ด้วย VB.NET</title><content type='html'>&lt;span style="font-weight: bold;"&gt;สร้าง Google Search Application แบบ GUI ด้วย Visual Basic และ .NET Framework&lt;/span&gt;&lt;br /&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;นอกจากที่มีตัวอย่างในการพัฒนา Google Search Application ด้วย C# [Hack #58] แล้ว Google Web APIs Developer’s Kit ได้มีตัวอย่างของ Google Search ใน Visual Basic รวมเอาไว้อยู่ด้วยเช่นกัน ในขณะที่คุณอาจจะผสมผเสรวบรวมสิ่งต่างๆที่จำเป็นเกือบจะทั้งหมดจาก Google Demo Form.vb&lt;span style=""&gt;  &lt;/span&gt;ซึ่งเป็นโค้ดที่มีมาให้อยู่ในชุด kit ดังกล่าวอยู่แล้ว การแฮ็กในหัวข้อนี้ก็ได้เตรียมโค้ดพื้นฐานอันเป็นเบื้องต้นสำหรับ Google Search Application โดยปราศจากข้อกังขาในการพัฒนาถึงขั้นความสามารถอันเต็มพิกัดของโปรเจ็ค Visual Studio .NET&lt;/p&gt;&lt;ul style="color: rgb(0, 0, 153);"&gt;&lt;li&gt;Tip: การคอมไพล์และรันการแฮ็กนี้จำเป็นต้องมี .NET Framework (http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28000519) ติดตั้งอยู่ด้วย&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดตัวอย่าง&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' googly.vb&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' A Google Web API VB.NET console application&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' Usage: googly.exe &lt;query&gt;&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' Copyright (c) 2002, Chris Sells.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' No warranties extended. Use at your own risk.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Module Googly&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;Sub &lt;st1:place st="on"&gt;Main&lt;/st1:place&gt;(ByVal args As String(&lt;span style=""&gt;  &lt;/span&gt;))&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Dim googleKey As String = "insert key here"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' Take the query from the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;If args.Length &lt;&gt; &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; Then&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine("Usage: google.exe &lt;query&gt;")&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Return&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;End If&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Dim query As String = args(0)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' Create a Google SOAP client proxy, generated by:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' c:\&gt; wsdl.exe /l:vb http://api.google.com/GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Dim googleSearch As GoogleSearchService = New GoogleSearchService(&lt;span style=""&gt;  &lt;/span&gt;)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' Query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Dim results As GoogleSearchResult = googleSearch.doGoogleSearch(googleKey, query, 0, &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0, False, "", False, "", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;")&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' No results?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;If results.resultElements Is Nothing Then Return&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;' Loop through results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Dim result As ResultElement&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;For Each result In results.resultElements&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(&lt;span style=""&gt;  &lt;/span&gt;)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(result.title)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(result.URL)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(result.snippet)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(&lt;span style=""&gt;  &lt;/span&gt;)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Next&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;End Sub&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;End Module&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;โปรดอย่าลืมใส่ Google Developer Key (เช่น &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;2BuCK&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;3mY5h0E/34KNocK@ttH3DoOR)&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ของคุณลงใน “insert key here”&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style=""&gt;            &lt;/span&gt;‘Your Google API developer’s key&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style=""&gt;            &lt;/span&gt;Dim googleKey As String = “&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;2BuCK&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;3mY5h0E/34KNocK@ttH3DoOR”&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การคอมไพล์โค้ด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ก่อนที่จะคอมไพล์โค้ด VB Application&lt;span style=""&gt;  &lt;/span&gt;ได้นั้น คุณจะต้องสร้าง Google SOAP Client Proxy เสียก่อน ซึ่ง Google SOAP Client Proxy นี้จะเป็นโค้ดจำนวนหนึ่งที่สร้างตามรายละเอียด (specification) ในไฟล์ GoogleSearch.wsdl ซึ่งจะประกอบด้วย XML based description เกี่ยวกับ Google Web Service, mothod, parameter, และ return value แต่นับว่าโชคดีที่ .NET Framework kit ที่มีมาให้นั้น มีไฟล์ wsdl.exe ซึ่งทำให้คุณไม่ต้องมาเขียนโค้ดด้วยตัวคุณเอง&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Tip: นี่อาจเป็นสิ่งที่แปลกสักหน่อยหากคุณได้ลองนึกดู เนื่องจากส่วนสำคัญในการเชื่อมต่อกับ Web Service กลับถูกสร้างขึ้นจาก description ของมันเองโดยอัตโนมัติ&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;เรียกไฟล์ wsdl.exe จากไดเรกทอรีที่ GoogleSearch.wsdl อยู่ ดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET&gt;wsdl.exe /l:vb GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;คุณอาจจะระบุถึงไฟล์ wsdl.exe ที่อยู่ในเว็บไซต์ของ Google ก็ได้เช่นกัน&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET\VB&gt;wsdl.exe /l:vb http://api.google.com/GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Microsoft (R) Web Services Description Language Utility&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;[Microsoft (R) .NET Framework, Version &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0.3705.0]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Copyright (C) Microsoft Corporation &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;998-200&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;. All rights reserved.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Writing file 'C:\GOOGLY.NET\VB\GoogleSearchService.vb'.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ผลลัพธ์ที่คุณจะได้รับไฟล์ GoogleSearchService.vb นั้นจะมีหน้าตาลักษณะนี้&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'---------------------------------------------------------------------------&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' &amp;lt;autogenerated&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'&lt;span style=""&gt;     &lt;/span&gt;This code was generated by a tool.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'&lt;span style=""&gt;     &lt;/span&gt;Runtime Version: &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0.3705.288&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'&lt;span style=""&gt;     &lt;/span&gt;Changes to this file may cause incorrect behavior and will be lost if &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'&lt;span style=""&gt;     &lt;/span&gt;the code is regenerated.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;' &amp;lt;/autogenerated&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'---------------------------------------------------------------------------&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Option Strict Off&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Option Explicit On&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System.ComponentModel&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System.Diagnostics&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System.Web.Services&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System.Web.Services.Protocols&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Imports System.Xml.Serialization&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Public Function BegindoGoogleSearch(ByVal key As String, ByVal q As&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;String, ByVal start As Integer, ByVal maxResults As Integer, ByVal&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;filter As Boolean, ByVal restrict As String, ByVal safeSearch As&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Boolean, ByVal lr As String, ByVal ie As String, ByVal oe As String,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;ByVal callback As System.AsyncCallback, ByVal asyncState As Object) As&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;System.IAsyncResult&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;        &lt;/span&gt;Return Me.BeginInvoke("doGoogleSearch", New Object(&lt;span style=""&gt;  &lt;/span&gt;) {key, q, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;start, maxResults, filter, restrict, safeSearch, lr, ie, oe}, callback,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;asyncState) End Function&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;'&amp;lt;remarks/&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;Public Function EnddoGoogleSearch(ByVal asyncResult As System.IAsyncResult) As GoogleSearchResult&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;        &lt;/span&gt;Dim results(&lt;span style=""&gt;  &lt;/span&gt;) As Object = Me.EndInvoke(asyncResult)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;        &lt;/span&gt;Return CType(results(0),GoogleSearchResult)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;End Function&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;End Class&lt;/p&gt;    &lt;p class="BT" style="text-align: left;" align="left"&gt;สำหรับการคอมไพล์ไฟล์ googly.vb&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET\VB&gt;vbc /out:googly.exe *.vb&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Microsoft (R) Visual Basic .NET Compiler version 7.00.9466&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;for Microsoft (R) .NET Framework version &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.00.3705&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Copyright (C) Microsoft Corporation &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;987-200&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;. All rights reserved.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รัน Googly ที่ command line โดยการใส่คำถามที่ต้องการเข้าไปแทนที่ query word&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET\VB&gt;googly.exe “query words”&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;&lt;ul style="color: rgb(0, 0, 153);"&gt;&lt;li&gt;Tip: หน้าต่างของ dos command อาจจะไม่กว้างพอสำหรับการแสดงผล ซึ่งคุณสามารถแก้ปัญหาได้โดยการส่งผลลัพธ์ที่ได้จากการค้นหาไปยังไฟล์อื่นใด เพื่อใช้เอดิเตอร์ (editor) ตรวจดูผลลัพธ์ได้ ซึ่งการส่งผลลัพธ์ไปยังไฟล์ดังกล่าวทำได้โดย เพิ่ม &gt; results.txt ต่อท้ายเข้าไปที่คำสั่งข้างต้น&lt;/li&gt;&lt;/ul&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ขั้นตอนต่างๆของการแฮ็กในหัวข้อนี้จะเหมือนกับในส่วนของ C# [&lt;a href="http://ch5.hack-google.com/2007/08/hack58-google-web-api-c-net.html"&gt;Hack #58&lt;/a&gt;] และตามปกติเมื่อสั่งรันแล้วก็ควรจะได้ผลลัพธ์เหมือนๆกันด้วยเช่นกัน&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-3506679149997669041?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/3506679149997669041/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=3506679149997669041' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/3506679149997669041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/3506679149997669041'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack59-google-web-api-vbnet.html' title='HACK#59 การเขียนโปรแกรม Google Web API ด้วย VB.NET'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-763374371223375035</id><published>2007-08-08T14:57:00.000+07:00</published><updated>2007-08-08T14:57:40.860+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack58'/><title type='text'>HACK#58 การโปรแกรม Google Web API ด้วย C# และ .NET</title><content type='html'>&lt;span style="font-weight: bold;"&gt;สร้าง Google Search Application แบบ GUI ด้วย C# และ .NET framework&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;ใน Google Web API Developer’s Kit [ดู “The Google Web APIs Developer’s Kit”] มีตัวอย่างของ C# Visual Studio .NET&lt;span style=""&gt;  &lt;/span&gt;(&lt;a href="http://msdn.microsoft.com/vstudio"&gt;http://msdn.microsoft.com/vstudio&lt;/a&gt;) ซึ่งเป็น project ทางด้าน GUI Google Search Application (ดูในโฟลเดอร์ dotnet/cSharp) ซึ่งส่วนที่น่าสนใจที่สุดน่าจะเป็นโค้ดในไฟล์ Form&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.cs  &lt;p class="BT" style="text-align: left;" align="left"&gt;การแฮ็กในหัวข้อนี้จะเป็นการเตรียมโค้ดเบื้องต้นสำหรับ Google Search Application&lt;span style=""&gt;  &lt;/span&gt;ซึ่งจะคล้ายๆกับการทำงานใน Perl [&lt;a href="http://ch5.hack-google.com/2007/07/hack50-google-web-api-perl.html"&gt;Hack #50&lt;/a&gt;], Java [&lt;a href="http://ch5.hack-google.com/2007/08/hack55-google-web-api-java.html"&gt;Hack #56&lt;/a&gt;] และ Python [&lt;a href="http://ch5.hack-google.com/2007/08/hack57-google-web-api-python.html"&gt;Hack #57&lt;/a&gt;] &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;Tip:การคอมไพล์และรันการแฮ็กนี้จำเป็นต้องมี .NET Framework (http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28000519) ติดตั้งในเครื่องของคุณอยู่ด้วย&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดตัวอย่าง&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// googly.cs&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// A Google Web API C# console application&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// Usage: googly.exe &lt;query&gt;&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// Copyright (c) 2002, Chris Sells.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// No warranties extended. Use at your own risk.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;class Googly {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;static void &lt;st1:place st="on"&gt;Main&lt;/st1:place&gt;(string[] args) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;string googleKey = "insert key here";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Take the query from the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;if( args.Length != &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine("Usage: google.exe &lt;query&gt;");&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;return;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;string query = args[0];&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Create a Google SOAP client proxy, generated by:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// c:\&gt; wsdl.exe http://api.google.com/GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;GoogleSearchService googleSearch = new GoogleSearchService(&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;GoogleSearchResult results = googleSearch.doGoogleSearch(googleKey, query, 0, &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0, false, "", false, "", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;");&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// No results?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;if( results.resultElements == null ) return;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Loop through results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;foreach( ResultElement result in results.resultElements ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(result.title);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(result.URL);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(result.snippet);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;Console.WriteLine(&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;อย่าลืมใส่ Google Developer’s key [ดู “Using the key in the hack”] (เช่น &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;2BuCK&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;3mY5h0E/34KNocK@ttH3DoOR) ของคุณลงไปแทนใน “insert key here”&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//Your Google API developer’s key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;string googleKey = “&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;2BuCK&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;3mY5h0E/34KNocK@ttH3DoOR”;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การคอมไพล์โค้ด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ก่อนที่จะคอมไพล์โค้ด C#&lt;span style=""&gt;  &lt;/span&gt;ได้นั้น คุณจะต้องสร้าง Google SOAP Client Proxy เสียก่อน ซึ่ง Google SOAP Client Proxy นี้จะเป็นโค้ดจำนวนหนึ่งที่สร้างตาม specification ในไฟล์ GoogleSearch.wsdl ซึ่งจะประกอบด้วย XML based description เกี่ยวกับ Google Web Service, mothod ทั้งหมดของมัน และ parameter ต่างๆ รวมถึง return value ด้วย แต่นับว่าโชคดีที่ .NET Framework Kit ที่มีมาให้ มีไฟล์ wsdl.exe ซึ่งทำให้คุณไม่ต้องมานั่งเขียนโค้ดด้วยตัวคุณเอง&lt;/p&gt;&lt;ul style="color: rgb(0, 0, 153);"&gt;&lt;li&gt; Tip: สิ่งที่น่าสนใจในเรื่องนี้ก็คือ ส่วนสำคัญในการอินเทอร์เฟสกับ web service ที่ถูกสร้างขึ้นจาก description ของมันเอง&lt;/li&gt;&lt;/ul&gt;เรียกไฟล์ wsdl.exe จากไดเรกทอรีที่ GoogleSearch.wsdl อยู่ ดังนี้  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET&gt;wsdl.exe GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;คุณอาจจะระบุถึงไฟล์ wsdl.exe ที่อยู่ในเว็บไซต์ของ Google ก็ได้เช่นกัน&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET\CS&gt;wsdl.exe http://api.google.com/GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Microsoft (R) Web Services Description Language Utility&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;[Microsoft (R) .NET Framework, Version &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0.3705.0]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Copyright (C) Microsoft Corporation &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;998-200&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;. All rights reserved.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Writing file 'C:\GOOGLY.NET\CS\GoogleSearchService.cs'.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ผลลัพธ์รายการสุดท้าย ซึ่งก็คือไฟล์ GoogleSearchService.cs จะมีหน้าตาลักษณะนี้&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//--------------------------------------------------------------------------&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// &amp;lt;autogenerated&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//&lt;span style=""&gt;     &lt;/span&gt;This code was generated by a tool.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//&lt;span style=""&gt;     &lt;/span&gt;Runtime Version: &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0.3705.288&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//&lt;span style=""&gt;     &lt;/span&gt;Changes to this file may cause incorrect behavior and will be lost if &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//&lt;span style=""&gt;     &lt;/span&gt;the code is regenerated.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// &amp;lt;/autogenerated&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//--------------------------------------------------------------------------&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// This source code was auto-generated by wsdl, Version=&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0.3705.288.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System.Diagnostics;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System.Xml.Serialization;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System.Web.Services.Protocols;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System.ComponentModel;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;using System.Web.Services;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;public System.IAsyncResult BegindoGoogleSearch(string key, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;string q, int start, int maxResults, bool filter, string restrict,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;bool safeSearch, string lr, string ie, string oe, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;System.AsyncCallback callback, object asyncState) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;        &lt;/span&gt;return this.BeginInvoke("doGoogleSearch", new object[] {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                  &lt;/span&gt;&lt;span style=""&gt;  &lt;/span&gt;key,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;q,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;start,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;maxResults,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;filter,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;restrict,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;safeSearch,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;lr,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;ie,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;                    &lt;/span&gt;oe}, callback, asyncState);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;สำหรับไฟล์ googly.cs&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET\CS&gt;csc /out:googly.exe *.cs&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Microsoft (R) Visual C# .NET Compiler version 7.00.9466&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;for Microsoft (R) .NET Framework version &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0.3705&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Copyright (C) Microsoft Corporation 200&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;. All rights reserved.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รัน Googly ที่ command line โดยการใส่คำถามที่ต้องการเข้าไปแทนที่ “query word”&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\GOOGLY.NET\CS&gt;googly.exe “query words”&lt;/p&gt;&lt;ul style="color: rgb(0, 0, 153);"&gt;&lt;li&gt;Tip: หน้าต่างของ dos command อาจจะไม่กว้างพอสำหรับการแสดงผล ซึ่งคุณสามารถแก้ปัญหาได้โดยการส่งผลลัพธ์ที่ได้จากการค้นหาไปยังไฟล์อื่นใด เพื่อใช้เอดิเตอร์ (editor) ในการตรวจดูผลลัพธ์ก่อน ซึ่งการส่งผลลัพธ์ไปยังไฟล์ดังกล่าวทำได้โดย เพิ่ม &gt; results.txt ต่อท้ายเข้าไปที่คำสั่ง&lt;/li&gt;&lt;/ul&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;&lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% googly.exe "WSDL while you work"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Axis/Radio interop, actual and potential&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.intertwingly.net/stories/2002/02/08/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;axisradioInteropActualAndPotential.html &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; But&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;you&amp;lt;/b&amp;gt; might find more exciting services here&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; Instead, we should &amp;lt;b&amp;gt;work&amp;lt;/b&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;together and&amp;lt;br&amp;gt; continuously strive to &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;While&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;WSDL&amp;lt;/b&amp;gt; is certainly far from&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;perfect and has many &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Simplified &amp;lt;b&amp;gt;WSDL&amp;lt;/b&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://capescience.capeclear.com/articles/simplifiedWSDL/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; So how does it &amp;lt;b&amp;gt;work&amp;lt;/b&amp;gt;?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; If &amp;lt;b&amp;gt;you&amp;lt;/b&amp;gt; would like to edit&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;WSDL&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;while&amp;lt;/b&amp;gt; still avoiding&amp;lt;br&amp;gt; all&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;those XML tags, check out the &amp;lt;b&amp;gt;WSDL&amp;lt;/b&amp;gt; Editor in&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;CapeStudio. &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-763374371223375035?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/763374371223375035/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=763374371223375035' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/763374371223375035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/763374371223375035'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack58-google-web-api-c-net.html' title='HACK#58 การโปรแกรม Google Web API ด้วย C# และ .NET'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-4671464381298242560</id><published>2007-08-08T14:48:00.000+07:00</published><updated>2007-08-08T14:48:38.209+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack57'/><title type='text'>HACK#57 การเขียนโปรแกรม Google Web API ด้วย Python</title><content type='html'>&lt;span style="font-weight: bold;"&gt;การโปรแกรม Google Web API ด้วย Python นี้ค่อนข้างง่าย ลองดูไปตามที่สคริปต์และตัวอย่างนี้ได้สาธิตเอาไว้&lt;br /&gt;&lt;/span&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;การเขียนโปรแกรม Google Web API ด้วย Python เป็นสิ่งที่ง่ายเป็นอย่างมาก และต้องขอขอบคุณ PyGoogle wrapper module ของ Mark Pilgrim (http://diveintomark.org/projects/pygoogle/) ซึ่งได้เตรียมสิ่งต่างๆสำหรับรองรับ SOAP, XML และ request/response layer ช่วยให้คุณมีเวลาเหลือสำหรับศึกษาข้อมูลจากสิ่งเหล่านั้นมากขึ้น&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การติดตั้ง PyGoogle&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ให้ดาวน์โหลด PyGoogle มา แล้วทำตามคำแนะนำในไฟล์ readme.txt (http://diveintomark.org/projects/pygoogle/readme.txt) ซึ่งถ้าไม่ติดขัดประการใด การติดตั้งไม่น่าจะยุ่งยากไปกว่าเพียงแค่ใช้คำสั่ง&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% python setup.py install&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;อีกวิธีหนึ่ง ถ้าคุณต้องการไปอย่างรวดเร็วและไม่ต้องการติดตั้ง PyGoogle หรือต้องการติดตั้งแต่ไม่ได้รับอนุญาต&lt;span style=""&gt;(&lt;/span&gt;Permission) ในการติดตั้งในระบบของคุณ คุณก็เพียงแต่บันทึกไฟล์ SOAP.py และ google.py ลงไปในไดเรกทอรีเดียวกันเท่านั้น &lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดตัวอย่าง&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;#!/usr/bin/python&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# googly.py&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# A typical Google Web API Python script using Mark Pilgrim's&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# PyGoogle Google Web API wrapper &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# [http://diveintomark.org/projects/pygoogle/]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Usage: python googly.py &lt;query&gt;&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;import sys, string, codecs&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Use the PyGoogle module&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;import google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Grab the query from the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;if sys.argv[&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;:]:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;query = sys.argv[&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;else:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;sys.exit('Usage: python googly.py &lt;query&gt;')&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;google.LICENSE_KEY = 'insert key here'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;data = google.doGoogleSearch(query)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Teach standard output to deal with utf-8 encoding in the results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;sys.stdout = codecs.lookup('utf-8')[-&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;](sys.stdout)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Output&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;for result in data.results:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;print string.join( (result.title, result.URL, result.snippet), "\n"), "\n"&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;สั่งสคริปต์ให้ทำงานที่ command line ด้วยคำสั่งดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% python googly.py "query words"&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;ผลลัพธ์&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% python googly.py "learning python"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;oreilly.com -- Online Catalog: &amp;lt;b&amp;gt;Learning&amp;lt;/b&amp;gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;Python&amp;lt;/b&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.oreilly.com/catalog/lpython/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;Learning&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;Python&amp;lt;/b&amp;gt; is an &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;introduction to the increasingly popular interpreted programming&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;language that's portable, powerful, and remarkably easy to use in both &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Book Review: &amp;lt;b&amp;gt;Learning&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;Python&amp;lt;/b&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www2.linuxjournal.com/lj-issues/issue66/354&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.html&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; Issue 66: Book Review: &amp;lt;b&amp;gt;Learning&amp;lt;/b&amp;gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;Python&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt; Enter &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;b&amp;gt;Learning&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;Python&amp;lt;/b&amp;gt;. My executive summary &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;is that this is the right book for me and probably for many others &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;as well. &amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;     &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Hacking the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;Python มีความสามารถในการเชื่อมต่อการทำงานแบบ Interactive ร่วมกับตัวแปลภาษา (Interpreter) ได้อย่างดีเยี่ยม ซึ่งเป็นที่ที่ดีในการทดลองกับโมดูลต่างๆอย่างเช่น PyGoogle เป็นต้น ซึ่งจะทำให้การส่งค่า Google Web API อย่างรวดเร็ว รวมทั้งค้นหาตลอดโครงสร้างข้อมูล (Data Structure) ที่ได้รับมา&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ข้างล่างนี้คือตัวอย่างแบบ Interactive ของ PyGoogle Session ซึ่งใช้ฟังก์ชัน doGoogleSearch, deGetCatchedPage และ doSpellingSuggestion ในการทำงาน&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% python&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Python 2.2 (#&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;, 07/&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;4/02, 23:25:09) &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;[GCC Apple cpp-precomp 6.&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;4] on &lt;st1:place st="on"&gt;&lt;st1:city st="on"&gt;darwin&lt;/st1:City&gt;&lt;/st1:place&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Type "help", "copyright", "credits" or "license" for more information.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; import google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; google.LICENSE_KEY = 'insert key here'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; data = google.doGoogleSearch("Learning Python")&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; dir(data.meta)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;['_&lt;span style=""&gt;  &lt;/span&gt;_doc_&lt;span style=""&gt;  &lt;/span&gt;_', '_&lt;span style=""&gt;  &lt;/span&gt;_init_&lt;span style=""&gt;  &lt;/span&gt;_', '_&lt;span style=""&gt;  &lt;/span&gt;_module_&lt;span style=""&gt;  &lt;/span&gt;_', 'directoryCategories', &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'documentFiltering', 'endIndex', 'estimateIsExact', &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'estimatedTotalResultsCount', 'searchComments', 'searchQuery', &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'searchTime', 'searchTips', 'startIndex']&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; data.meta.estimatedTotalResultsCount&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;5000&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; data.meta.directoryCategories&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;[{u'specialEncoding': '', u'fullViewableName': "Top/Business/Industries/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Publishing/Publishers/Nonfiction/Business/O'Reilly_and_Associates/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Technical_Books/Python"}]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; dir(data.results[5])&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;['URL', '_&lt;span style=""&gt;  &lt;/span&gt;_doc_&lt;span style=""&gt;  &lt;/span&gt;_', '_&lt;span style=""&gt;  &lt;/span&gt;_init_&lt;span style=""&gt;  &lt;/span&gt;_', '_&lt;span style=""&gt;  &lt;/span&gt;_module_&lt;span style=""&gt;  &lt;/span&gt;_', 'cachedSize', &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'directoryCategory', 'directoryTitle', 'hostName', &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'relatedInformationPresent', 'snippet', 'summary', 'title']&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; data.results[0].title&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'oreilly.com -- Online Catalog: &amp;lt;b&amp;gt;Learning&amp;lt;/b&amp;gt; &amp;lt;b&amp;gt;Python'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; data.results[0].URL&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'http://www.oreilly.com/catalog/lpython/'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; google.doGetCachedPage(data.results[0].URL)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;"&amp;gt;\n&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;BASE HREF="http://www.oreilly.com/catalog/lpython/"&amp;gt;&amp;lt;table border=&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;gt;&amp;gt;&amp;gt; google.doSpellingSuggestion('lurn piethon')&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;'learn python' &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-4671464381298242560?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/4671464381298242560/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=4671464381298242560' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/4671464381298242560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/4671464381298242560'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack57-google-web-api-python.html' title='HACK#57 การเขียนโปรแกรม Google Web API ด้วย Python'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-7139116501882861849</id><published>2007-08-08T14:42:00.001+07:00</published><updated>2007-08-08T14:42:52.313+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack56'/><title type='text'>HACK#56 การโปรแกรม Google Web API ด้วย Java</title><content type='html'>&lt;span style="font-weight: bold;"&gt;การโปรแกรม Google Web API ในจาวานั้นสามารถทำใด้อย่างรวดเร็ว เนื่องจากมีไลบรารี่ให้มาพร้อมกับ Google Web API Developer’s Kit อยู่แล้ว&lt;br /&gt;&lt;/span&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ต้องขอขอบคุณ Java Archive (JAR) ซึ่งมีมาให้พร้อมกับ Google Web API Developer’s Kit [ใน “The Google Web APIs Developer’s Kit”] ซึ่งใน googleapi.jar archive ได้รวมเอา com.google.soap.search ซึ่งเป็น wrapper ที่ดีมากมาให้ด้วย พร้อมทั้ง Crimson XML parser (http://xml.apache.org/crimson) ของ Apache Software Foundation และตัวสุดท้ายที่มาพร้อมกันก็คือ Apache SOAP stack (http://xml.apache.org/soap) &lt;/p&gt;&lt;ul&gt;&lt;li&gt;  Tip:คุณอาจจำเป็นต้องใช้ copy ของ Java 2 Platform, Standard Edition (J2SE, http://java.sun.com/downloads/) ในการคอมไพล์และรันการแฮ็กด้วยวิธีนี้&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;โค้ดตัวอย่าง&lt;/span&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// Googly.java&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;// Bring in the Google SOAP wrapper&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;import com.google.soap.search.*;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;import java.io.*;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;public class Googly {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;// Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;private static String googleKey = "insert key here"; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;public static void main(String[] args) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Make sure there's a Google query on the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;if (args.length != &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;System.err.println("Usage: java [-classpath classpath] Googly &lt;query&gt;");&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;System.exit(&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Create a new GoogleSearch object&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;GoogleSearch s = new GoogleSearch(&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;try {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;s.setKey(googleKey);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;s.setQueryString(args[0]); // Google query from the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span style=""&gt;  &lt;/span&gt;s.setMaxResults(&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;// Query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;GoogleSearchResult r = s.doSearch(&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;// Gather the results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;GoogleSearchResultElement[] re = r.getResultElements(&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;// Output&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;for ( int i = 0; i &lt;&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;System.out.println(re[i].getTitle(&lt;span style=""&gt;  &lt;/span&gt;));&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;System.out.println(re[i].getURL(&lt;span style=""&gt;  &lt;/span&gt;));&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;System.out.println(re[i].getSnippet(&lt;span style=""&gt;  &lt;/span&gt;) + "\n");&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;// Anything go wrong?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;} catch (GoogleSearchFault f) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;System.out.println("GoogleSearchFault: " + f.toString(&lt;span style=""&gt;  &lt;/span&gt;));&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;&lt;br /&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;โปรดอย่าลืมใส่ Google Developer Key (เช่น &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;2BuCK&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;3mY5h0E/34KNocK@ttH3DoOR) ของคุณลงไปแทนใน “insert key here”&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;//Your Google API developer’s key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;private static String googleKey = “&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;2BuCK&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;3mY5h0E/34KNocK@ttH3DoOR”;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การคอมไพล์โค้ด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;สำหรับการคอมไพล์ Googly application (Googly.java) คุณจำเป็นต้องมี googleapi.jar archive ก่อน สำหรับผู้เขียนได้เก็บเอาไว้ในไดเรกทอรีเดียวกับ googly.java แต่ถ้าหากคุณเก็บไว้ในที่อื่น ให้เปลี่ยนพาธหลัง –classpath ไปตามนั้น&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% javac -classpath googleapi.jar Googly.java&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ด้วยวิธีนี้คุณจะได้ไฟล์ Googly.class ใหม่ ซึ่งพร้อมที่จะทำงานได้แล้ว&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รัน Googly ที่ command line โดยการใส่คำถามที่ต้องการลงไปแทนที่ “query word”&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% java -classpath .:googleapi.jar Googly "query words"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left; text-indent: -36pt;" align="left"&gt;&lt;b style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% java -classpath .:googleapi.jar Googly "Learning Java"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;oreilly.com -- Online Catalog: Learning Java&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.oreilly.com/catalog/learnjava/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;For programmers either just migrating to Java or already working &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;steadily in the forefront of Java development, Learning Java gives &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;a clear, systematic&lt;span style=""&gt;   &lt;/span&gt;...&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;oreilly.com -- Online Catalog:&lt;span style=""&gt;   &lt;/span&gt;Learning&lt;span style=""&gt;     &lt;/span&gt;Java&lt;span style=""&gt;  &lt;/span&gt;, 2nd Edition&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.oreilly.com/catalog/learnjava2/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;This new edition of Learning Java has been expanded and updated for&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Java 2 Standard Edition SDK &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.4. It comprehensively addresses ...&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Java Programming...From the Grounds Up / Web Developer&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.webdeveloper.com/java/java_programming_grounds_up.html&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... WebDeveloper.com. Java Programming... From the Grounds Up. by &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Mark C. Reynolds ... Java Classes and Methods. Java utilizes the &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;basic object technology found in C++. ...&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-7139116501882861849?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/7139116501882861849/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=7139116501882861849' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/7139116501882861849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/7139116501882861849'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack55-google-web-api-java.html' title='HACK#56 การโปรแกรม Google Web API ด้วย Java'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-7039022648559688089</id><published>2007-08-08T14:39:00.000+07:00</published><updated>2007-08-08T14:39:13.390+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack54'/><title type='text'>HACK#55 การเขียนโปรแกรม Google Web API ด้วย PHP</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ตัวอย่างง่ายๆในการโปรแกรม Google Web API ด้วย PHP และโมดูล NuSOAP&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;PHP (http://www.php.net) ซึ่งย่อมาจาก “PHP Hypertext Processing” เป็นภาษาสคริปต์ที่ใช้งานร่วมกับ HTML และได้รับการยอมรับเป็นอย่างมาก ในการพัฒนาโปรแกรมทางด้านเว็บ และสำหรับการเพิ่มโมดูลของ PHP ที่ชื่อ NuSOAP เข้าไป (http://dietrich.ganx4.com/nusoap) จะทำให้สามารถสร้างและใช้งาน SOAP based web service ได้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;การแฮ็กในหัวข้อนี้ จะแสดงให้เห็นการใช้งาน PHP และ NuSOAP ในการทำงานร่วมกับ Google Web API&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดตัวอย่าง&lt;/p&gt;&lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;!--&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# googly.php&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# A typical Google Web API php script&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Usage: googly.php?query=&amp;lt;query&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;--&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;html&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;head&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&amp;lt;title&amp;gt;googly.php&amp;lt;/title&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;/head&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;body&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Use the NuSOAP php library&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;require_once('nusoap.php');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Set parameters&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$parameters = array(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'key'=&amp;gt;'insert key here',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'q' =&amp;gt; $HTTP_GET_VARS['query'],&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'start' =&amp;gt; '0',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'maxResults' =&amp;gt; '&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'filter' =&amp;gt; 'false',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'restrict' =&amp;gt; '',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'safeSearch' =&amp;gt; 'false',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'lr' =&amp;gt; '',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'ie' =&amp;gt; 'latin',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;'oe' =&amp;gt; 'latin'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Create a new SOAP client, feeding it GoogleSearch.wsdl on Google's site&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$soapclient = new soapclient('http://api.google.com/GoogleSearch.wsdl', 'wsdl');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$results = $soapclient-&amp;gt;call('doGoogleSearch',$parameters);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Results?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;if ( is_array($results['resultElements']) ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;print "&amp;lt;p&amp;gt;Your Google query for '" . $HTTP_GET_VARS['query'] . "' found " . $results['estimatedTotalResultsCount'] . " results, the top ten of which are:&amp;lt;/p&amp;gt;";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;foreach ( $results['resultElements'] as $result ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;print &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;"&amp;lt;p&amp;gt;&amp;lt;a href='" . $result['URL'] . "'&amp;gt;" . &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;( $result['title'] ? $result['title'] : 'no title' ) .&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;"&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;" . $result['URL'] . "&amp;lt;br /&amp;gt;" .&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;( $result['snippet'] ? $result['snippet'] : 'no snippet' ) .&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;"&amp;lt;/p&amp;gt;";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# No Results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;else {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;print "Your Google query for '" . $HTTP_GET_VARS['query'] . "' returned no results";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;?&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;/body&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ดำเนินการแฮ็กด้วยวิธีการเดียวกันกับที่คุณทำในการเรียกใช้ CGI Script ทั่วไป โดยให้คุณใส่คำถาม (query) ที่ต้องการลงไปแทน your google query&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://localhost/googly.php?query=your google query&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;จากภาพที่ 5-&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; เป็นการค้นหาด้วยคำว่า php&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;รูปที่ 5-&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; ผลลัพธ์จากการค้นหาโดยใช้คำว่า&lt;/i&gt;&lt;i style=""&gt;&lt;span style=""&gt; PHP&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-7039022648559688089?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/7039022648559688089/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=7039022648559688089' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/7039022648559688089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/7039022648559688089'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack55-google-web-api-php.html' title='HACK#55 การเขียนโปรแกรม Google Web API ด้วย PHP'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-8441793963397718596</id><published>2007-08-08T14:29:00.000+07:00</published><updated>2007-08-08T14:29:17.944+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack54'/><title type='text'>HACK#54 NoXML อีกทางเลือกหนึ่งสำหรับใช้แทน SOAP::Lite</title><content type='html'>&lt;span style="font-weight: bold;"&gt;NoXML เป็นทางเลือกในการใช้แทน SOAP::Lite ซึ่งใช้เพียง  regular expression ทำงาน โดยไม่ต้องมี XML parser แต่อย่างใด&lt;br /&gt;&lt;/span&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;NoXML เป็นอีกโมดูลหนึ่ง ที่ใช้แทน SOAP::Lite ได้ ซึ่ง NOXML นี้จะใช้เพียง&lt;span style=""&gt;  &lt;/span&gt;regular expression ทำงาน โดยปราศจาก XML parser ทุกชนิด ดังที่ชื่อของโมดูลนี้ได้แนะนำไว้ &lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าหากคุณมีเพียงความรู้พื้นฐานในการติดตั้ง Perl เพื่อใช้งานของคุณเองเท่านั้น รวมทั้งไม่มีทั้ง SOAP::Lite [&lt;a href="http://ch5.hack-google.com/2007/08/hack52-soaplite-perl.html"&gt;Hack #52&lt;/a&gt;] และ XML::Parser แล้วล่ะก็ NoXML นับเป็นทางเลือกที่ดีทีเดียวสำหรับการแฮ็กเกือบจะทั้งหมดในหนังสือเล่มนี้&lt;/p&gt;&lt;ul style="color: rgb(0, 0, 153);"&gt;&lt;li&gt;Tip: ผู้เชี่ยวชาญ XML บางท่านยืนยันว่า ไม่มีอะไรมาแทนที่ XML parser จริงๆได้ ซึ่งเป็นสิ่งที่ถูกต้องอย่างยิ่ง เพราะยังมีประเด็นเรื่องการ Encode และ Hierarchy ที่ regular expression-based parser ไม่สามารถทำได้ แต่สำหรับตัว NOXML  นั้นก็ยังเป็นตัวที่ง่ายที่สุดสำหรับการใช้งานและติดตั้ง&lt;/li&gt;&lt;/ul&gt;NoXML สามารถใช้แทน SOAP::Lite โดยการแก้ไขสคริปต์ที่ใช้ในการแฮ็กเพียงเล็กน้อยเท่านั้น  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดของ NoXML&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ไฟล์สำคัญในการแฮ็กในหัวข้อนี้ก็คือ NoXML.pm ซึ่งควรจะบันทึกลงในไดเรกทอรีเดียวกันกับสคริปต์ที่ใช้ในการแฮ็ก&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;# NoXML.pm&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# NoXML [pronounced "no xml"] is a dire-need drop-in &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# replacement for SOAP::Lite designed for Google Web API hacking.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;package NoXML;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use strict;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;no strict "refs";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# LWP for making HTTP requests, XML for parsing Google SOAP&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use LWP::UserAgent;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use XML::Simple;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Create a new NoXML&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;sub new {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $self = {};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;bless($self);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;return $self;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Replacement for the SOAP::Lite-based doGoogleSearch method&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;sub doGoogleSearch {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my($self, %args);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;($self, @args{qw/ key q start maxResults filter restrict &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;safeSearch lr ie oe /}) = @_;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# grab SOAP request from _&lt;span style=""&gt;  &lt;/span&gt;_DATA_&lt;span style=""&gt;  &lt;/span&gt;_&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $tell = tell(DATA);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $soap_request = join '', ; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;seek(DATA, $tell, 0);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$soap_request =~ s/\$(\w+)/$args{$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;}/ge; #interpolate variables&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Make (POST) a SOAP-based request to Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;my $ua = LWP::UserAgent-&gt;new;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $req = HTTP::Request-&gt;new(POST =&gt; 'http://api.google.com/search/beta2');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$req-&gt;content_type('text/xml');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$req-&gt;content($soap_request);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $res = $ua-&gt;request($req);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $soap_response = $res-&gt;as_string;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Drop the HTTP headers and so forth until the initial xml element&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$soap_response =~ s/^.+?(&lt;\?xml)/$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;/migs;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Drop element namespaces for tolerance of future prefix changes&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$soap_response =~ s!(&lt;\/?)[\w-]+?:([\w-]+?)!$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;$2!g;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Set up a return dataset&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;my $return;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Unescape escaped HTML in the resultset&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my %unescape = ('&lt;'=&gt;'&lt;', '&gt;'=&gt;'&gt;', '&amp;'=&gt;'&amp;amp;amp;amp;', '"'=&gt;'"', '''=&gt;"'"); &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $unescape_re = join '|' =&gt; keys %unescape;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Divide the SOAP response into the results and other metadata&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my($before, $results, $after) = $soap_response =~ &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;m#(^.+)(.+?)(.+$)#migs ;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $before_and_after = $before . $after;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Glean as much metadata as possible (while being somewhat lazy ;-)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;while ($before_and_after =~ m#([^&lt;]*?)&lt;#migs) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$return-&gt;{$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;} = $3; # pack the metadata into the return dataset&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Glean the results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my @results;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;while ($results =~ m#(.+?)#migs) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;my $item = $&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;my $pairs = {};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;while ( $item =~ m#([^&lt;]*)#migs ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;my($element, $value) = ($&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;, $2);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;$value =~ s/($unescape_re)/$unescape{$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;}/g;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;$pairs-&gt;{$element} = $value;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;push @results, $pairs;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Pack the results into the return dataset&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$return-&gt;{resultElements} = \@results;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Return nice, clean, usable results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;return $return;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# This is the SOAP message template sent to api.google.com. Variables&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# signified with $variablename are replaced by the values of their &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# counterparts sent to the doGoogleSearch subroutine.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;_&lt;span style=""&gt;  &lt;/span&gt;_DATA_&lt;span style=""&gt;  &lt;/span&gt;_&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;?xml version='&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0' encoding='UTF-8'?&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;SOAP-ENV:Envelope &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;xmlns:xsi="http://www.w3.org/&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;999/XMLSchema-instance" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;xmlns:xsd="http://www.w3.org/&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;999/XMLSchema"&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;SOAP-ENV:Body&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;ns&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;:doGoogleSearch xmlns:ns&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;="urn:GoogleSearch" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;key xsi:type="xsd:string"&amp;gt;$key&amp;lt;/key&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;q xsi:type="xsd:string"&amp;gt;$q&amp;lt;/q&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;start xsi:type="xsd:int"&amp;gt;$start&amp;lt;/start&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;maxResults xsi:type="xsd:int"&amp;gt;$maxResults&amp;lt;/maxResults&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;filter xsi:type="xsd:boolean"&amp;gt;$filter&amp;lt;/filter&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;restrict xsi:type="xsd:string"&amp;gt;$restrict&amp;lt;/restrict&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;safeSearch xsi:type="xsd:boolean"&amp;gt;$safeSearch&amp;lt;/safeSearch&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;lr xsi:type="xsd:string"&amp;gt;$lr&amp;lt;/lr&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;ie xsi:type="xsd:string"&amp;gt;$ie&amp;lt;/ie&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;oe xsi:type="xsd:string"&amp;gt;$oe&amp;lt;/oe&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;/ns&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;:doGoogleSearch&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&amp;lt;/SOAP-ENV:Body&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ข้างล่างนี้เป็นตัวอย่างสคริปต์ NoXML ในแง่การใช้งาน ซึ่งก็ไม่แตกต่างอะไรไปจากการแฮ็กในหัวข้ออื่นๆในหนังสือเล่มนี้ จะมีก็เพียงแต่การเน้นข้อความเป็นตัวหนา (bold) ตรงส่วนที่มีการ comment บรรทัดเดิมที่ใช้กับ SOAP::Lite และแทรกบรรทัดใหม่ เพื่อให้ใช้กับ PoXML ได้เท่านั้น&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;#!/usr/bin/perl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# noxml_google2csv.pl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Google Web Search Results via NoXML ("no xml") module&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# exported to CSV suitable for import into Excel&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Usage: noxml_google2csv.pl "{query}" [&gt; results.csv]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_key='insert key here';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use strict;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# use SOAP::Lite;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use NoXML;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$ARGV[0]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;or die qq{usage: perl noxml_search2csv.pl "{query}"\n};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# my $google_search = SOAP::Lite-&gt;service("file:$google_wdsl");&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_search = new NoXML;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$google_key, shift @ARGV, 0, &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0, "false", &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;"", "false", "", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;@{$results-&gt;{'resultElements'}} or die('No results');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;print qq{"title","url","snippet"\n};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;foreach (@{$results-&gt;{'resultElements'}}) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$_-&gt;{title} =~ s!"!""!g; # double escape " marks&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$_-&gt;{snippet} =~ s!"!""!g;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $output = qq{"$_-&gt;{title}","$_-&gt;{URL}","$_-&gt;{snippet}"\n};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$output =~ s!&lt;.+?&gt;!!g; # drop all HTML tags&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;print $output;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;} &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รันสคริปต์นี้ที่ command line โดยการใส่คำถามลงไปที่ command line และระบุให้แสดงผลลัพธ์ในไฟล์ CSV ที่คุณต้องการสร้างขึ้นมา หรือที่ต้องการให้นำผลลัพธ์ไปต่อท้าย (appending) ตัวอย่างเช่นข้างล่างนี้ใช้ “no xml” เป็นคำถาม และกำหนดให้ไฟล์ results.csv เป็นไฟล์รับผลลัพธ์ที่ได้กลับคืนมา&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$ perl noxml_google2csv.pl "no xml" &gt; results.csv&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;หรือจะตัดส่วนของ &gt; และ results.csv ออก เพื่อส่งผลลัพธ์ให้ไปแสดงที่หน้าจอเพื่อตรวจสอบก่อนก็ได้ และเห็นผลลัพธ์ทันที&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl noxml_google2csv.pl "no xml"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"title","url","snippet"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"site-comments@w3.org from January 2002: No XML specifications",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"http://lists.w3.org/Archives/Public/site-comments/2002Jan/00&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;5.html",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"No XML specifications. From: Prof. ... Next message: Ian B. Jacobs: &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"Re: No XML specifications"; Previous message: Rob Cummings: &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"Website design..."; ...&lt;span style=""&gt;  &lt;/span&gt;"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"Re: [xml] XPath with no XML Doc",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"http://mail.gnome.org/archives/xml/2002-March/msg00&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;94.html",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;" ... Re: [xml] XPath with no XML Doc. From: "Richard Jinks" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;cyberthymia&gt;; To: &lt;xml&gt;; Subject: &lt;/xml&gt;&lt;/cyberthymia&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Re: [xml] XPath with no XML Doc; ...&lt;span style=""&gt;  &lt;/span&gt;"&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การใช้งานและข้อจำกัด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ด้วยวิธีเดียวกันนี้ คุณสามารถดัดแปลงวิธีการแฮ็กด้วย SOAP::Lite ที่ได้อธิบายไว้ในหัวข้อต่างๆ ตลอดหนังสือเล่มนี้ มาเป็นการใช้ PoXML ในการแฮ็กแทนก็ได้ โดยมีข้อกำหนดดังนี้&lt;/p&gt;        &lt;ol&gt;&lt;li&gt;&lt;o:p&gt;&lt;/o:p&gt;วางไฟล์ NoXML.pm ไว้ในไดเรกทอรีเดียวกันกับสคริปต์ของเรื่องที่จะแฮ็ก&lt;/li&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;แทนที่บรรทัดในสคริปต์ที่เป็น use SOAP::Lite; ด้วย use NoXML;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;แทนที่ my $google_search = SOAP::Lite-&gt;service(“file:$google_wdsl”); ด้วย my $google_search = new NoXML;&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/li&gt;&lt;/ol&gt;    &lt;p class="BT" style="text-align: left;" align="left"&gt;อย่างไรก็ตาม ยังมีข้อจำกัดในการใช้งานอยู่บ้าง ในขณะที่ NoXML ทำงานได้ดีในการดึงผลลัพธ์รวมทั้งสรุปผลลัพธ์ที่ได้จากการค้นหา แต่ก็ไม่ประสบผลสำเร็จในด้านการรวบรวมผลลัพธ์ในขั้นละเอียดขึ้น (advanced result) บางอย่าง เช่น &lt;code&gt;&amp;lt;directoryCategories&amp;gt;&lt;/code&gt; เป็นต้น&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ดูเพิ่มเติม&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;PoXML [&lt;a href="http://ch5.hack-google.com/2007/08/hack53-plain-old-xml.html"&gt;Hack #53&lt;/a&gt;] เป็นทางเลือกในการใช้ plain old XML แทน SOAP::Lite &lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;XooMLE [&lt;a href="http://ch3.hack-google.com/2007/03/hack36-xoomle-google-api-plain-old-xml.html"&gt;Hack #36&lt;/a&gt;] เป็น third-party service ซึ่งเป็นตัวกลาในการ interface ระหว่าง Plain Old XML กับ Google Web API&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-8441793963397718596?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/8441793963397718596/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=8441793963397718596' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/8441793963397718596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/8441793963397718596'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack54.html' title='HACK#54 NoXML อีกทางเลือกหนึ่งสำหรับใช้แทน SOAP::Lite'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-2074870600451724564</id><published>2007-08-08T14:21:00.000+07:00</published><updated>2007-08-08T14:21:41.450+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack53'/><title type='text'>HACK#53 Plain Old XML</title><content type='html'>&lt;span style="font-weight: bold;"&gt;PoXML เป็นโมดูลที่สามารถใช้แทน SOAP::Lite  ในกรณีที่ไม่สามารถติดตั้ง SOAP::Lite ได้&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;PoXML นับเป็นทางเลือกทางหนึ่งสำหรับท่านที่ไม่สามารถใช้ SOAP::Lite [&lt;a href="http://ch5.hack-google.com/2007/08/hack52-soaplite-perl.html"&gt;Hack #52&lt;/a&gt;] ได้ ซึ่งอาจจะเป็นด้วยเพราะการติดตั้งที่ยุ่งยากหรืออะไรก็ตามแต่&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 153);"&gt;&lt;li&gt;Tip: ผู้รู้เกี่ยวกับ Perl ยืนยันว่าการติดตั้งโมดูลนี้มีขั้นตอนที่ง่ายมาก อย่างไรก็ตาม หลายๆคนแย้งว่า การติดตั้งไม่ได้ง่ายดายอย่างที่กล่าวเอาไว้นัก&lt;/li&gt;&lt;/ul&gt;PoXML นั้นสามารถใช้แทน SOAP::Lite ได้ในระดับที่ดีพอใช้ โดยการที่ทำงานร่วมกับ SOAP ของ Google ตามแบบ Plain Old XML โดยการใช้ LWP::UserAgent ในการสร้าง HTTP request และใช้ XML::Simple ในการประมวลผล XML แต่ส่วนที่เป็นข้อดีที่สุดก็คือ มีการแก้ไขสคริปต์เพียง 2 บรรทัดเท่านั้น เมื่อมีการใช้งานแทน SOAP::Lite ในการแฮ็กเป้าหมายต่างๆในหนังสือเล่มนี้  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดของ PoXML&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ไฟล์สำคัญที่ใช้ในหัวข้อนี้ก็คือไฟล์ PoXML.pm ซึ่งเป็นเพิร์ลโมดูลเล็กๆที่เหมาะสมที่จะบันทึกเก็บไว้ในไดเรกทอรีเดียวกันกับสคริปต์ที่ใช้ในการแฮ็ก&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ประมวลผล XML แต่ส่วนที่เป็นข้อดีที่สุดก็คือ มีการแก้ไขสคริปต์เพียง 2 บรรทัดเท่านั้น เมื่อมีการใช้งานแทน SOAP::Lite ในการแฮ็กเป้าหมายต่างๆในหนังสือเล่มนี้&lt;/p&gt;  &lt;p class="HD20" style="text-align: left;" align="left"&gt;โค้ดของ PoXML&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ไฟล์สำคัญที่ใช้ในหัวข้อนี้ก็คือไฟล์ PoXML.pm ซึ่งเป็นเพิร์ลโมดูลเล็กๆที่เหมาะสมที่จะบันทึกเก็บไว้ในไดเรกทอรีเดียวกันกับสคริปต์ที่ใช้ในการแฮ็ก&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# PoXML.pm&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# PoXML [pronounced "plain old xml"] is a dire-need drop-in &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# replacement for SOAP::Lite designed for Google Web API hacking.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;package PoXML;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use strict;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;no strict "refs";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# LWP for making HTTP requests, XML for parsing Google SOAP&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use LWP::UserAgent;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use XML::Simple;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Create a new PoXML&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;sub new {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $self = {};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;bless($self);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;return $self;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Replacement for the SOAP::Lite-based doGoogleSearch method&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;sub doGoogleSearch {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;my($self, %args);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;($self, @args{qw/ key q start maxResults filter restrict &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;safeSearch lr ie oe /}) = @_;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# grab SOAP request from __DATA_&lt;span style=""&gt;  &lt;/span&gt;_&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $tell = tell(DATA);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $soap_request = join '', ; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;seek(DATA, $tell, 0);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;$soap_request =~ s/\$(\w+)/$args{$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;}/ge; #interpolate variables&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Make (POST) a SOAP-based request to Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $ua = LWP::UserAgent-&gt;new;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $req = HTTP::Request-&gt;new(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;POST =&gt; 'http://api.google.com/search/beta2');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$req-&gt;content_type('text/xml');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$req-&gt;content($soap_request);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $res = $ua-&gt;request($req);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $soap_response = $res-&gt;as_string;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Drop the HTTP headers and so forth until the initial xml element&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$soap_response =~ s/^.+?(&lt;\?xml)/$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;/migs;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Drop element namespaces for tolerance of future prefix changes&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$soap_response =~ s!(&lt;\/?)[\w-]+?:([\w-]+?)!$&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;$2!g;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Parse the XML&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $results = XMLin($soap_response);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Normalize and drop the unnecessary encoding bits&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $return = $results-&gt;{'Body'}-&gt;{'doGoogleSearchResponse'}-&gt;{return};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;foreach ( keys %{$return} ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$return-&gt;{$_}-&gt;{content} and &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$return-&gt;{$_} = $return-&gt;{$_}-&gt;{content} || '';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my @items;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;foreach my $item ( @{$return-&gt;{resultElements}-&gt;{item}} ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;foreach my $key ( keys %$item ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;$item-&gt;{$key} = $item-&gt;{$key}-&gt;{content} || '';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;push @items, $item;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$return-&gt;{resultElements} = \@items;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my @categories;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;foreach my $key ( keys %{$return-&gt;{directoryCategories}-&gt;{item}} ) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$return-&gt;{directoryCategories}-&gt;{$key} = &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$return-&gt;{directoryCategories}-&gt;{item}-&gt;{$key}-&gt;{content} || '';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Return nice, clean, usable results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;return $return;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# This is the SOAP message template sent to api.google.com. Variables&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# signified with $variablename are replaced by the values of their &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# counterparts sent to the doGoogleSearch subroutine.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;__DATA_&lt;span style=""&gt;  &lt;/span&gt;_&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;?xml version='&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.0' encoding='UTF-8'?&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;SOAP-ENV:Envelope &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;xmlns:xsi="http://www.w3.org/&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;999/XMLSchema-instance" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;xmlns:xsd="http://www.w3.org/&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;999/XMLSchema"&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;&amp;lt;SOAP-ENV:Body&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;ns&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;:doGoogleSearch xmlns:ns&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;="urn:GoogleSearch" &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;key xsi:type="xsd:string"&amp;gt;$key&amp;lt;/key&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;q xsi:type="xsd:string"&amp;gt;$q&amp;lt;/q&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;start xsi:type="xsd:int"&amp;gt;$start&amp;lt;/start&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;maxResults xsi:type="xsd:int"&amp;gt;$maxResults&amp;lt;/maxResults&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;filter xsi:type="xsd:boolean"&amp;gt;$filter&amp;lt;/filter&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;restrict xsi:type="xsd:string"&amp;gt;$restrict&amp;lt;/restrict&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;safeSearch xsi:type="xsd:boolean"&amp;gt;$safeSearch&amp;lt;/safeSearch&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;lr xsi:type="xsd:string"&amp;gt;$lr&amp;lt;/lr&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;     &lt;/span&gt;&amp;lt;ie xsi:type="xsd:string"&amp;gt;$ie&amp;lt;/ie&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt;    &lt;/span&gt;&amp;lt;oe xsi:type="xsd:string"&amp;gt;$oe&amp;lt;/oe&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;&amp;lt;/ns&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;:doGoogleSearch&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&amp;lt;/SOAP-ENV:Body&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&amp;lt;/SOAP-ENV:Envelope&amp;gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;b style=""&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ข้างล่างนี้เป็นตัวอย่างสคริปต์ PoXML ในแง่การใช้งาน ซึ่งก็ไม่แตกต่างอะไรไปจากการแฮ็กในหัวข้ออื่นๆในหนังสือเล่มนี้ จะมีแต่ก็เพียงการเน้นข้อความเป็นตัวหนา (bold) ตรงส่วนที่มีการ comment ในบรรทัดที่เดิมใช้กับ SOAP::Lite และแทรกบรรทัดใหม่ เพื่อให้ใช้กับ PoXML ได้เท่านั้น&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;#!/usr/bin/perl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# poxml_google2csv.pl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Google Web Search Results via PoXML ("plain old xml") module&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# exported to CSV suitable for import into Excel&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Usage: poxml_google2csv.pl "{query}" [&gt; results.csv]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_key = 'insert key here';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use strict;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# use SOAP::Lite;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use PoXML;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$ARGV[0]&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;or die qq{usage: perl poxml_search2csv.pl "{query}"\n};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# my $google_search = SOAP::Lite-&gt;service("file:$google_wdsl");&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_search = new PoXML;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$google_key, shift @ARGV, 0, &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0, "false", &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;"", "false", "", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;@{$results-&gt;{'resultElements'}} or die('No results');&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;print qq{"title","url","snippet"\n};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;foreach (@{$results-&gt;{'resultElements'}}) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$_-&gt;{title} =~ s!"!""!g; # double escape " marks&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$_-&gt;{snippet} =~ s!"!""!g;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;my $output = qq{"$_-&gt;{title}","$_-&gt;{URL}","$_-&gt;{snippet}"\n};&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$output =~ s!&lt;.+?&gt;!!g; # drop all HTML tags&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;print $output;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;} &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Hack&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รันสคริปต์นี้ที่ command line โดยการใส่คำถามลงไปที่ command line และระบุให้แสดงผลลัพธ์ในไฟล์ CSV ที่คุณต้องการสร้างขึ้นมา หรือที่ต้องการให้นำผลลัพธ์ไปต่อท้าย (เดิมมีผลลัพธ์อยู่บ้างแล้ว) ตัวอย่างเช่นข้างล่างนี้ใช้ “plain old xml” เป็นคำถาม และกำหนดไฟล์ results.csv เป็นไฟล์รับผลลัพธ์ที่ได้กลับคืนมา&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$ perl poxml_google2csv.pl "plain old xml" &gt; results.csv&lt;/p&gt;    &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;หรือจะตัดส่วนของ &gt; และ results.csv ออก เพื่อส่งผลลัพธ์ให้ไปแสดงที่หน้าจอเพื่อตรวจสอบก่อนก็ได้&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl poxml_google2csv.pl "plain old xml"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"title","url","snippet"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"XML.com: Distributed XML [Sep. 06, 2000]",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"http://www.xml.com/pub/2000/09/06/distributed.html",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;" ... extensible. Unlike plain old XML, there's no sense of &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;constraining what the document can describe by a DTD or schema. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;This means ... "&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"Plain Old Documentation",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"http://axkit.org/wiki/view/AxKit/PlainOldDocumentation",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;" ... perlpodspec - Plain Old Documentation: format specification&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;and notes. ... Examples: =pod This is a plain Pod paragraph. ... &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;encodings in Pod parsing would be as in XML ... "&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การใช้งานและข้อจำกัด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ด้วยวิธีเดียวกันนี้ คุณสามารถดัดแปลงวิธีการแฮ็กด้วย SOAP::Lite ที่ได้อธิบายไว้ในหัวข้อต่างๆ ตลอดหนังสือเล่มนี้ มาเป็นการใช้ PoXML ในการแฮ็กแทนก็ได้ โดยมีข้อกำหนดดังนี้&lt;/p&gt;      &lt;ol&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;/span&gt;วางไฟล์ PoXML.pm ไว้ในไดเรกทอรีเดียวกันกับสคริปต์ของเรื่องที่จะแฮ็ก&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;!--[if !supportLists]--&gt;แทนที่บรรทัดในสคริปต์ที่เป็น use SOAP::Lite; ด้วย use PoXML;&lt;/li&gt;&lt;li&gt;แทนที่ my $google_search = SOAP::Lite-&gt;service(“file:$google_wdsl”); ด้วย my $google_search = new PoXML;&lt;/li&gt;&lt;/ol&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;อย่างไรก็ตาม ยังมีข้อจำกัดในการใช้งานอยู่บ้าง ในขณะที่ PoXML ทำงานได้ดีในการดึงผลลัพธ์รวมทั้งสรุปผลลัพธ์ที่ได้จากการค้นหา แต่ก็ไม่ประสบผลสำเร็จในด้านการรวบรวมผลลัพธ์ในขั้นละเอียดขึ้น (&lt;span style=""&gt;A&lt;/span&gt;dvanced Result) บางอย่าง เช่น &lt;span style="font-family:arial;"&gt;&lt;code&gt;&amp;lt;directoryCategories&amp;gt;&lt;/code&gt;&lt;/span&gt;&lt;directorycategories&gt; &lt;/directorycategories&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;directorycategories&gt;ซึ่งเป็นลิสต์รายการหมวดของไดเรกทอรี เป็นต้น&lt;/directorycategories&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ดูเพิ่มเติม&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;NoXML [&lt;a href="http://ch5.hack-google.com/2007/08/hack54.html"&gt;Hack #54&lt;/a&gt;] เป็นทางเลือกในการใช้แทน SOAP::Lite ซึ่งใช้เพียง&lt;span style=""&gt;  &lt;/span&gt;regular expression ทำงาน โดยไม่ต้องใช้ XML parser แต่อย่างใด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;XooMLE [&lt;a href="http://ch3.hack-google.com/2007/03/hack36-xoomle-google-api-plain-old-xml.html"&gt;Hack #36&lt;/a&gt;] เป็น Third-party service ซึ่งเป็นตัวกลางในการเชื่อมต่อระหว่าง Plain Old XML กับ Google We&lt;a href="posts.g?blogID=1320886625518473727"&gt; แก้ไขบทความ &lt;/a&gt;b API&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-2074870600451724564?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/2074870600451724564/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=2074870600451724564' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/2074870600451724564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/2074870600451724564'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack53-plain-old-xml.html' title='HACK#53 Plain Old XML'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-2105990318989437861</id><published>2007-08-08T14:07:00.000+07:00</published><updated>2007-08-08T14:07:38.837+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack52'/><title type='text'>HACK#52 โมดูล SOAP::Lite ของ Perl</title><content type='html'>&lt;span style="font-weight: bold;"&gt;อธิบายการติดตั้งโมดูล SOAP::Lite ของ Perl ซึ่งถือเป็นหัวใจสำคัญในการพัฒนาแอพพลิเคชันที่เป็นเว็บเซอร์วิส&lt;br /&gt;&lt;/span&gt;&lt;span style=""&gt;&lt;br /&gt;&lt;/span&gt;SOAP::Lite (&lt;a href="http://www.soaplite.com/"&gt;http://www.soaplite.com&lt;/a&gt;) เป็นมาตรฐานในการติดต่อกับ Saop-Based Web Service จาก Perl&lt;span style=""&gt;  &lt;/span&gt;ที่ถูกใช้เป็นส่วนใหญ่ในหนังสือเล่มนี้ ซึ่งเนื้อหาในบทที่ 6 เกือบทั้งหมดจะใช้โมดูลนี้เป็นหลัก  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ปัญหาระหว่าง SOAP::Lite กับ ISP ของคุณ&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;โชคไม่ดีสักเท่าไหร่ ที่ ISP บางแห่งไม่สนับสนุนการใช้งาน SOAP::Lite ให้แก่สมาชิกของเขา โดยทั่วไปแล้ว ISP ส่วนใหญ่จะจำกัดการใช้งานโมดูลเพิ่มเติมบางอย่าง รวมทั้งความสามารถในการ &lt;span style=""&gt;E&lt;/span&gt;xecute สคริปต์ต่างๆของบรรดาสมาชิก ดังนั้นก่อนที่คุณจะเสียเวลาทำการติดตั้ง SOAP::Lite&lt;span style=""&gt;  &lt;/span&gt;ก็น่าจะสอบถาม ISP ที่คุณใช้บริการอยู่ว่าสนับสนุนการใช้งาน SOAP::Lite หรือเปล่า&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การติดตั้ง SOAP::Lite&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;บางครั้งวิธีที่ง่ายที่สุดในการติดตั้งโมดูล SOAP::Lite ก็คือการติดตั้งผ่านโมดูลอีกอันหนึ่งของ Perl ซึ่งก็คือ CPAN (มีอยู่แล้วในดิสทริบิวชันรุ่นใหม่ๆของ Perl) ซึ่งจะทำการติดตั้งโมดูลต่างๆของ Perl ให้โดยอัตโนมัติ รวมทั้งรับเอาคอมโพเนนต์ต่างๆเข้ามาด้วย&lt;/p&gt;&lt;ul style="color: rgb(0, 0, 153); font-family: arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Tip: &lt;/span&gt;&lt;span style=";font-size:100%;" &gt;CPAN จะติดตั้งโมดูลต่างๆลงไปในโฟลเดอร์มาตรฐานของแต่ละระบบที่นิยมติดตั้งโปรแกรมลงไป ดังนั้นคุณจึงต้องทำการติดตั้งในฐานะ Root User เท่านั้น แต่ถ้าหากคุณเป็นผู้ใช้ทั่วไป (regular user) คุณจะต้องติดตั้ง SOAP::Lite รวมถึงสิ่งที่อาจจะต้องติดตั้งก่อนหน้านั้น (prerequisite) โดยตัวคุณเอง (ดู “การติดตั้งภายใต้ Unix ด้วยตัวเอง”)&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;span style="font-weight: bold;" class="StyleBT18ptThaiDistributedBold1Char"&gt;การติดตั้ง SOAP::Lite ด้วย CPAN ภายใต้ระบบ Unix และ Mac OS X &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าหากคุณมีโมดูล CPAN อยู่แล้ว รวมทั้งคุณเป็น root ของระบบและเชื่อมต่อกับอินเทอร์เน็ตอยู่ การติดตั้งจะทำโดยการใช้คำสั่งดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% su&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Password:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# perl -MCPAN -e shell&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;cpan shell -- CPAN exploration and modules installation (v&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;.52)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;ReadLine support available (try ``install Bundle::CPAN'')&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;cpan&gt; install SOAP::Lite&lt;/p&gt;&lt;br /&gt; &lt;p class="BT" style="text-align: left;" align="left"&gt;หรือถ้าหากต้องการติดตั้งง่ายๆด้วยคำสั่งเพียงบรรทัดเดียวก็ย่อมทำได้ ดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% sudo perl -MCPAN -e 'install SOAP::Lite'&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;คุณอาจจะถูกถามคำถามสัก 2-3 คำถาม ซึ่งก็สามารถตอบได้ง่ายๆโดยเพียงการกดปุ่ม Enter&lt;span style=""&gt;  &lt;/span&gt;เพื่อตอบคำถามนั้นๆตามค่าเริ่มต้น (default) ที่โปรแกรมกำหนดมาให้เท่านั้น&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;span class="StyleBT18ptThaiDistributedBold1Char"&gt;&lt;span style="font-weight: bold;"&gt;การติดตั้งภายใต้ระบบ Unix &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;span class="StyleBT18ptThaiDistributedBold1Char"&gt;&lt;/span&gt;ถ้าหากการติดตั้ง SOAP::Lite ด้วย CPAN ไม่สำเร็จ มีอีกวิธีหนึ่งคือคุณต้องติดตั้งด้วยตัวคุณเองทีละขั้นตอน แต่ก่อนอื่นคุณต้องดาวน์โหลด SOAP::Lite เวอร์ชันล่าสุดมาจาก SOAPLite.com (&lt;a href="http://www.soaplite.com/"&gt;http://www.soaplite.com&lt;/a&gt;) เสียก่อน จากนั้นก็ unpack ไฟล์ที่ได้มาแล้วทำตามขั้นตอนดังต่อไปนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% tar xvzf SOAP-Lite-latest.tar.gz&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;SOAP-Lite-0.55&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;SOAP-Lite-0.55/Changes&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;SOAP-Lite-0.55/t/37-mod_xmlrpc.t&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;SOAP-Lite-0.55/t/TEST.pl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% cd SOAP-Lite-0.55&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl Makefile.PL&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% make&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;mkdir blib&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;mkdir blib/lib&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% make test&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;PERL_DL_NONLAZY=&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt; /usr/bin/perl -Iblib/arch -Iblib/lib&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;-I/System/Library/Perl/darwin -I/System/Library/Perl -e 'use&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Test::Harness qw(&amp;runtests $verbose); $verbose=0; runtests @ARGV;'&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;t/0&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;-core.t t/02-payload.t t/03-server.t t/04-attach.t t/05-customxml.t&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;t/06-modules.t t/07-xmlrpc_payload.t t/08-schema.t t/0&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;-core...........&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% su&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Password:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# make install&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Installing /Library/Perl/XMLRPC/Lite.pm&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Installing /Library/Perl/XMLRPC/Test.pm&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าหากในระหว่างการติดตั้งอยู่นั้น คุณได้รับข้อความเตือน (warning message) ให้ติดตั้งโปรแกรมที่จำเป็นต้องมีก่อน (prerequisite) จึงจะติดตั้ง SOAP::Lite ได้แล้วล่ะก็ คุณจำเป็นต้องติดตั้งโปรแกรมนั้นๆก่อน แล้วค่อยกลับมาติดตั้ง SOAP::Lite ใหม่อีกที ซึ่งโดยปกติข้อความดังกล่าวมักจะมีลักษณะดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Checking if your kit is complete...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Looks good&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Warning: prerequisite HTTP::Daemon failed to load: Can't locate&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;HTTP/Daemon.pm in @INC (@INC contains: /System/Library/Perl/darwin&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;/System/Library/Perl /Library/Perl/darwin /Library/Perl /Library/Perl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;/Network/Library/Perl/darwin /Network/Library/Perl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;/Network/Library/Perl .) at (eval 8) line 3.&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าหากคุณเป็น User ทั่วไปที่ไม่ใช่ Root แล้วต้องการติดตั้ง SOAP::Lite ด้วยตัวคุณเอง คุณจะต้องติดตั้งสิ่งต่างๆทั้งหมดที่กล่าวมาแล้วลงใน home directory ของคุณเท่านั้น ซึ่งใน ~/lib นับเป็นที่ที่ค่อนข้างเหมาะสมในการติดตั้งสิ่งต่างๆลงไป โดยการใช้คำสั่งดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl Makefile.PL LIB=/home/login/lib&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;span style="font-weight: bold;" class="StyleBT18ptThaiDistributedBold1Char"&gt;การติดตั้ง SOAP::Lite ในวินโดว์ด้วย PPM &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าหากคุณจะใช้ Perl ภายใต้ระบบปฏิบัติการวินโดว์ ก็นับเป็นโอกาสอันดีของ ActivePerl ซึ่งเป็นดิสทริบิวชันจากบริษัท ActiveState (&lt;a href="http://www.activestate.com/Products/ActivePerl"&gt;http://www.activestate.com/Products/ActivePerl&lt;/a&gt;) ที่จะได้รับใช้คุณ และคงต้องขอขอบคุณ ActivePerl สำหรับโมดูลการติดตั้งที่ทำหน้าที่คล้ายกับ CPAN ซึ่งนั่นก็คือ Programmer’s Package Manager (PPM, &lt;a href="http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/"&gt;http://aspn.activestate.com/ASPN/Downloads/ActivePerl/PPM/&lt;/a&gt;)&lt;span style=""&gt;  &lt;/span&gt;ซึ่งจะทำการติดตั้งโมดูลต่างๆจาก ActiveState ลงสู่วินโดว์ด้วยความง่ายดาย โดยคุณแทบจะไม่ต้องสั่งคำสั่งใดๆเพิ่มเติมเลย&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ขั้นตอนก็เพียงเรียก PPM จาก command line ในดอสแล้วติดตั้ง SOAP::Lite ด้วยคำสั่งนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\&gt;ppm&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;PPM interactive shell (2.&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;.6) - type 'help' for available commands.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;PPM&gt; install SOAP::Lite&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าหากคุณดาวน์โหลด ActivePerl เวอร์ชันใหม่ๆมา คุณอาจจะได้รับข้อความแจ้งว่า SOAP::Lite ได้ถูกติดตั้งอยู่แล้ว&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;C:\&gt;ppm&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;PPM interactive shell (2.&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;.6) - type 'help' for available commands.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;PPM&gt; install SOAP::Lite&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Version 0.55 of 'SOAP-Lite' is already installed.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ทางเลือกอื่นๆนอกจาก SOAP::Lite&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;บางครั้ง ISP ของคุณอาจจะไม่ได้มองว่า SOAP::Lite มีความสำคัญพอที่จะให้การสนับสนุน ซึ่งถ้าเป็นดังนั้น การติดตั้งของคุณอาจจะทำให้คุณเสียเวลาเปล่าก็ได้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ในขณะที่ SOAP::Lite เป็นโมดูลที่ค่อนข้างลงตัวสำหรับการติดต่อกับ Google Web API รวมถึง Web Service โดยทั่วไปด้วย แต่ก็เป็นการยากที่จะยอมให้ผู้ใช้งานที่ไม่สามารถใช้ SOAP::Lite อันเนื่องมาจาก ISP ที่ใช้อยู่ไม่สนับสนุน พลาดโอกาสใช้งานจากประโยชน์อันมากมายของหนังสือเล่มนี้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ไม่ต้องเป็นห่วง! เรายังมีทางเลือกอยู่ โดยการใช้ PoXML [Hack #53] ซึ่งเป็นเพิร์ลโมดูลขนาดเล็กๆของเราเอง ซึ่งจะทำงานร่วมกับ SOAP ของ Google ในแบบ Plain Old XML ด้วยการใช้ LWP::UserAgent เพื่อสร้าง HTTP request และใช้&lt;span style=""&gt;  &lt;/span&gt;XML::Simple สำหรับประมวลผล XML response&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;นอกจาก PoXML แล้วยังมี NoXML [Hack #54] ซึ่งไม่ต้องการแม้กระทั่งตัวประมวลผล XML (XML parser) ใดๆเลย แต่จะทำงานทุกอย่างด้วย Regular Expression จากนั้นก็มี XooMLe [Hack #36] ซึ่งเป็น third-party service มาเป็นตัวกลางในการติดต่อกับ Google Web API อีกทีหนึ่ง ซึ่งการใช้งานทั้ง PoXML และ NoXML&lt;span style=""&gt;  &lt;/span&gt;แทน SOAP::Lite นั้น ไม่ได้ยุ่งยากไปกว่าการแก้ไขในสคริปต์ที่เดิมใช้กับ SOAP::Lite เพียงแค่ 2 บรรทัดเท่านั้น&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-2105990318989437861?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/2105990318989437861/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=2105990318989437861' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/2105990318989437861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/2105990318989437861'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack52-soaplite-perl.html' title='HACK#52 โมดูล SOAP::Lite ของ Perl'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-4615949903369388150</id><published>2007-08-08T11:54:00.000+07:00</published><updated>2007-08-08T11:54:27.257+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack51'/><title type='text'>HACK#51 การวนลูปเพื่อเพิ่มจำนวนผลลัพธ์</title><content type='html'>&lt;span style="font-weight: bold;"&gt;ถ้าหากคุณต้องการผลลัพธ์มากกว่า 10 รายการขึ้นไป คุณจำเป็นต้องใช้การวนลูปเข้าช่วย&lt;/span&gt;&lt;br /&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;ดังที่ทราบว่า Google Web API จะคืนค่าผลลัพธ์ให้เพียง &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 รายการต่อการค้นหาหนึ่งครั้งเท่านั้น ซึ่งอาจจะเพียงพอสำหรับคำถามบางคำถาม แต่สำหรับบางคำถามแล้ว ผลลัพธ์ &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 รายการอาจจะไม่เพียงพอก็เป็นได้ อย่างไรก็ตาม หากคุณต้องการผลลัพธ์ที่มากกว่านั้น คุณสามารถใช้การวนลูปเข้าช่วย โดยการวนลูปเพื่อส่ง query (ดูสคริปต์) เข้าไปสอบถามเพื่อให้ได้ผลลัพธ์ &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 รายการถัดไป ซึ่งก็คือรายการที่ &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; ถึงรายการที่ 20 และรอบถัดไปก็คือรายการที่ 2&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; ถึงรายการที่ 30 เป็นเช่นนี้ไปเรื่อยๆ ซึ่งจำนวนผลลัพธ์ที่ได้&lt;span style=""&gt;  &lt;/span&gt;ขึ้นอยู่กับจำนวนลูปที่คุณกำหนด&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;หัวข้อนี้เป็นการนำสิ่งที่ได้แนะนำเอาไว้ใน “การเขียนโปรแกรม Google Web API ด้วยภาษา Perl” [&lt;a href="http://ch5.hack-google.com/2007/07/hack50-google-web-api-perl.html"&gt;Hack #50&lt;/a&gt;] มาใช้ ซึ่งการเพิ่มจำนวนผลลัพธ์จากการค้นหาให้ได้มากกว่า &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 รายการนั้น ไม่มีสิ่งใดต้องโปรแกรมเพิ่ม นอกจากการวนลูปเท่านั้น ซึ่งสคริปต์ที่เห็นข้างล่างนี้เขียนด้วยภาษา Perl โดยส่วนที่เป็นตัวหนา (bold) เป็นส่วนที่เพิ่มขึ้นมาจาก &lt;a href="http://ch5.hack-google.com/2007/07/hack50-google-web-api-perl.html"&gt;Hack#50&lt;/a&gt; เพื่อใช้ในการสร้างลูปเท่านั้น&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดตัวอย่าง&lt;/p&gt;    &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;#!/usr/local/bin/perl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;# looply.pl&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# A typical Google Web API Perl script&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;# Usage: perl looply.pl &lt;query&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/query&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_key='insert key here';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Location of the GoogleSearch WSDL file&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_wdsl = "./GoogleSearch.wsdl";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;# Number of times to loop, retrieving &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 results at a time&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;my $loops = 3; # 3 loops x &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 results per loop = top 30 results&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use strict;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Use the SOAP::Lite Perl module&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use SOAP::Lite;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Take the query from the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $query = shift @ARGV or die "Usage: perl looply.pl &lt;query&gt;\n";&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Create a new SOAP::Lite instance, feeding it GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_search = SOAP::Lite-&gt;service("file:$google_wdsl");&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Keep track of result number&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $number = 0;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;for (my $offset = 0; $offset &lt;= ($loops-&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;)*&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0; $offset += &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0) {&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;# Query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$google_key, $query, $offset, &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0, "false", "", "false",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;"", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;&lt;span style=""&gt; &lt;/span&gt;# No sense continuing unless there are more results&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;b style=""&gt;&lt;span style=""&gt; &lt;/span&gt;last unless @{$results-&gt;{resultElements}};&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;# Loop through the results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;foreach my $result (@{$results-&gt;{'resultElements'}}) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;# Print out the main bits of each result&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;print&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;join "\n",&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;++$number,&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;$result-&gt;{title} || "no title",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;$result-&gt;{URL},&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;$result-&gt;{snippet} || 'no snippet',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;   &lt;/span&gt;"\n";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;สังเกตว่าสคริปต์ข้างบนจะแจ้ง Google ถึงจำนวนรอบที่ต้องการโดยเพียงการผ่านค่าตัวแปร $offset เท่านั้น ซึ่ง $offset += &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 หมายถึงการเพิ่มผลลัพธ์ครั้งละ &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0 รายการต่อรอบนั่นเอง&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;Running the Script&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รันสคริปต์นี้ที่ command line โดยการใส่คำที่ต้องการค้นหาลงไปแทน query&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;            &lt;/span&gt;$perl looply.pl “query”&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;ผลลัพธ์&lt;/span&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl looply.pl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Usage: perl looply.pl &lt;query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl looply.pl "learning perl"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;oreilly.com -- Online Catalog: Learning Perl, 3rd Edition&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.oreilly.com/catalog/lperl3/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... Learning Perl, 3rd Edition Making Easy Things &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Easy and Hard Things Possible By Randal&lt;br /&gt; L. Schwartz, Tom Phoenix &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;3rd Edition July 200&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt; 0-596-00&lt;st1:personname st="on"&gt;1&lt;/st1:PersonName&gt;32-0, Order Number ... &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;29&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Intro to Perl for CGI&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://hotwired.lycos.com/webmonkey/98/47/index2a.html&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... Some people feel that the benefits of learning &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Perl scripting are few.&lt;br /&gt; But ... part. That's right. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Learning Perl is just like being a cop. ...&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;30&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;WebDeveloper.com ฎ: Where Web Developers and Designers Learn How ... &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.webdeveloper.com/reviews/book6.html&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... Registration CreditCard Processing Compare Prices. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Learning Perl. Learning&lt;br /&gt; Perl, 2nd Edition. &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Publisher: O'Reilly Author: Randal Schwartz ...&lt;span style=""&gt;    &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;i style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ดูเพิ่มเติม&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;การเขียนโปรแกรม Google Web API ด้วย Perl [&lt;a href="http://ch5.hack-google.com/2007/07/hack50-google-web-api-perl.html"&gt;Hack #50&lt;/a&gt;]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-4615949903369388150?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/4615949903369388150/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=4615949903369388150' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/4615949903369388150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/4615949903369388150'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/08/hack51.html' title='HACK#51 การวนลูปเพื่อเพิ่มจำนวนผลลัพธ์'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-3109141490533354352</id><published>2007-08-08T11:49:00.000+07:00</published><updated>2007-08-08T11:49:47.638+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hack50'/><title type='text'>HACK#50 การเขียนโปรแกรม Google Web API ด้วยภาษา Perl</title><content type='html'>&lt;span style="font-weight: bold;"&gt;บทนี้เป็นสคริปต์ง่ายๆ ซึ่งจะแสดงให้เห็นพื้นฐานการเขียนโปรแกรม&lt;span style=""&gt;  &lt;/span&gt;Google Web API ด้วย Perl และเป็นการแนะนำส่วนที่เป็นพื้นฐานสำคัญ ซึ่งเป็นส่วนที่มีการใช้มากสุดในหนังสือเล่มนี้&lt;/span&gt;&lt;br /&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;การแฮ็กส่วนใหญ่ในหนังสือเล่มนี้จะใช้ภาษา Perl เป็นหลัก ซึ่งรายละเอียดเพิ่มเติมจะแตกต่างกันไป แล้วแต่วิธีการแฮ็ก แต่โดยส่วนใหญ่แล้วจะเป็นการส่งค่าผ่าน Google Web API รวมทั้งการแสดงผลลัพธ์เป็นหลัก สำหรับใน Hack #50 นี้เป็นส่วนที่เป็นพื้นฐานสำคัญ ในการที่จะทำให้คุณได้ทราบถึงวิธีการพัฒนาแอ&lt;span style=""&gt;พ&lt;/span&gt;พลิเคชันที่น่าสนใจและซับซ้อนมากยิ่งขึ้น สำหรับท่านที่ยังไม่มีวิธีการ หรือขั้นตอนในการทดสอบที่เตรียมเอาไว้ในใจก่อนหน้านี้ เนื้อหาใน Hack#50 นี้น่าจะเป็นจุดเริ่มต้นที่ดีในการทดสอบผลการทำงานผ่าน Google Web API เนื่องจากในแฮ็กนี้จะเป็นการส่งคำสั่งค้นหาไปยัง Google และแสดงผลลัพธ์ของคำสั่งนั้นออกมานั่นเอง&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;โค้ดตัวอย่าง&lt;br /&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;#!/usr/local/bin/perl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# googly.pl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# A typical Google Web API Perl script&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Usage: perl googly.pl &lt;query&gt;&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_key='insert key here';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Location of the GoogleSearch WSDL file&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_wdsl = "./GoogleSearch.wsdl";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use strict;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Use the SOAP::Lite Perl module&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;use SOAP::Lite;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Take the query from the command-line&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $query = shift @ARGV or die "Usage: perl googly.pl &lt;query&gt;\n";&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Create a new SOAP::Lite instance, feeding it GoogleSearch.wsdl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_search = SOAP::Lite-&gt;service("file:$google_wdsl");&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Query Google&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;$google_key, $query, 0, &lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;0, "false", "",&lt;span style=""&gt;  &lt;/span&gt;"false",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;      &lt;/span&gt;"", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;", "latin&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# No results?&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;@{$results-&gt;{resultElements}} or exit;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Loop through the results&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;foreach my $result (@{$results-&gt;{resultElements}}) {&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;# Print out the main bits of each result&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;print&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;join "\n",&lt;span style=""&gt;  &lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$result-&gt;{title} || "no title",&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$result-&gt;{URL},&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;$result-&gt;{snippet} || 'no snippet',&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;"\n";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;}&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="HD20" style="text-align: left;" align="left"&gt;&lt;span style="font-weight: bold;"&gt;Running the Hack&lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;การใช้งานก็เพียงรันสคริปต์นี้ที่ command line โดยใส่คำถามที่คุณต้องการลงไปแทน query keywords&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$ perl googly.pl “query keywords”&lt;/p&gt;  &lt;p class="StyleFirstline127cm" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ข้างล่างนี้เป็นตัวอย่างผลลัพธ์ที่ได้จากการรันสคริปต์ ซึ่งในการค้นหาครั้งแรกเราไม่ได้ระบุคำถามในการค้นหาลงไป ซึ่งทำให้ไม่มีผลลัพธ์ใดๆออกมา นอกจากข้อความว่า Usage: perl googly.pl &lt;query&gt; ส่วนครั้งที่สองระบุคำว่า learning perl เป็นคำถาม ซึ่งก็ได้ผลลัพธ์ตามที่เห็นข้างล่างนี้&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl googly.pl&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Usage: perl googly.pl &lt;query&gt;&lt;/query&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% perl googly.pl "learning perl"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;oreilly.com -- Online Catalog: Learning &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Perl, 3rd Edition&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.oreilly.com/catalog/lperl3/&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... learning perl, 3rd Edition Making Easy Things Easy and Hard Things &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Possible By Randal L. Schwartz, Tom Phoenix 3rd Edition July &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;200&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt; 0-596-00&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;32-0&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Amazon.com: buying info: learning perl (2nd Edition)&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;http://www.amazon.com/exec/obidos/ASIN/&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;565922840&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;... learning perl takes common programming idioms and expresses them &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;in "perlish"&lt;br /&gt;terms. ... (learning perl, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;Programming Perl, Perl Cookbook).&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ดูเพิ่มเติม&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;การวนลูปเพื่อเพิ่มจำนวนผลลัพธ์ [&lt;a href="http://ch5.hack-google.com/2007/08/hack51.html"&gt;Hack #5&lt;st1:personname st="on"&gt;1&lt;/st1:personname&gt;&lt;/a&gt;]&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-3109141490533354352?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/3109141490533354352/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=3109141490533354352' title='0 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/3109141490533354352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/3109141490533354352'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/07/hack50-google-web-api-perl.html' title='HACK#50 การเขียนโปรแกรม Google Web API ด้วยภาษา Perl'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1320886625518473727.post-6555076247609283835</id><published>2007-08-08T11:48:00.000+07:00</published><updated>2007-08-08T11:48:32.380+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chapter-5'/><title type='text'>บทที่ 5 ทำความรู้จักกับ Google Web API</title><content type='html'>&lt;p class="BT" style="text-align: left;" align="left"&gt;การแนะนำ Google Web API และการลงทะเบียนเพื่อขอ&lt;span style=""&gt; API Code กับ Google&lt;/span&gt;&lt;/p&gt;  &lt;p class="HD22" style="text-align: left; font-weight: bold;" align="left"&gt;ทำไมจึงต้องเป็น API&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;เมื่อแรกเริ่มที่ Search Engine ต่างๆทยอยเกิดขึ้นนั้น จะค่อนข้างเปิดกว้างสำหรับการนำทรัพยากรต่างๆใน Search Engine นั้นๆมาใช้ประโยชน์ค่อนข้างมาก เว็บไซต์อย่าง Excite และ AltaVista นั้นแทบจะไม่สนใจกับบุคคลบางกลุ่มที่ใช้ภาษา Perl เป็นเครื่องมือในการดึงข้อมูลบางส่วนไปใช้ประโยชน์ในงานของตัวเองเลย หรืออาจจะเป็น Meta Search Engine (Search Engine ที่ไม่ได้สร้างฐานข้อมูลของตนเอง แต่จะค้นหาข้อมูลจากจากฐานข้อมูลของ Search Engine ตัวอื่นอีกทีหนึ่ง) ซึ่งรวมเอาผลลัพธ์จากการค้นหาภายในฐานข้อมูลของหลายๆที่เข้าเป็นฐานข้อมูลของตัวเองอีกทีหนึ่ง ซึ่งแน่นอนที่สุดที่บางส่วนอาจถูกปิดกั้นไม่ให้กระทำเช่นนั้นได้ แต่โดยทั่วไปแล้ว Search Engine เหล่านั้นก็ไม่ได้กังวลหรือหวงแหนอะไรมากนัก สำหรับการแบ่งปันข้อมูลที่ไม่ได้สลักสำคัญอะไร&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;แต่สำหรับ Google แล้วกลับไม่ได้คิดเช่นนั้น ตรงกันข้าม Google พยายามป้องกันเหล่า Meta Search Engine ทั้งหลายที่ใช้เนื้อหา (content) ของตัวเองโดยปราศจากใบอนุญาต (License) รวมทั้งพยายามอย่างเต็มที่ที่จะบล็อก Web Agent ที่ไม่รู้จัก อย่างเช่นโมดูล LWP::Simple ของ Perl หรือแม้แต่ wget ที่ทำงานแบบ command line และยิ่งไปกว่านั้น Google จะทำการบล็อก IP address ที่ได้ทำการรันคำสั่งค้นหา (query) ข้อมูลใน Google โดยอัตโนมัติด้วย&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;Google มองว่าตัวเองมีสิทธิ์เต็มที่ในการกระทำเช่นนั้น ทั้งนี้เนื่องจากไม่ว่าจะเป็นเทคโนโลยีในการค้นหา (&lt;span style=""&gt;S&lt;/span&gt;earch Technology) &lt;span style=""&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;/span&gt;ฐานข้อมูล (Database) และเครื่องคอมพิวเตอร์ที่สร้างสิ่งเหล่านี้ขึ้นมา ก็ล้วนแต่เป็นของ Google เองทั้งสิ้น แม้กระนั้นก็ตาม Google เองก็ตระหนักเช่นกันว่า นโยบายนี้เป็นการปิดโอกาสในการที่เราๆท่านๆทั้งหลายจะสามารถใช้ประโยชน์จากฐานข้อมูลอันกว้างใหญ่ไพศาลของ Google ได้อย่างอัตโนมัติ&lt;/p&gt;  &lt;span style=""&gt;แต่แล้วในฤดูใบไม้ผลิปี 2002 ทุกสิ่งทุกอย่างก็ได้เปลี่ยนไป โดยที่ Google ได้ให้กำเนิด Google Web API (&lt;a href="http://api.google.com/"&gt;http://api.google.com/&lt;/a&gt;) เป็นครั้งแรก ซึ่งแม้เราจะไม่สามารถค้นหาทุกสิ่งทุกอย่างผ่าน Google Web API นี้ได้ (เช่นซินแท็กซ์พิเศษอย่าง Phonebook: ใน &lt;a href="http://ch1.hack-google.com/2007/02/hack17-phonebook.html"&gt;Hack #17 &lt;/a&gt;เป็นต้น) แต่ก็เปิดโอกาสให้นักพัฒนาโปรแกรมสามารถเข้าถึงฐานข้อมูลขนาดมหึมา ทำให้สามารถสร้างอินเทอร์เฟสของพวกเขาเองเพื่อใช้ผลลัพธ์ของการค้นหา (search result) จาก Google ได้ตามแบบที่เขาต้องการ&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="font-weight: bold;"&gt;Tip :&lt;/span&gt;  &lt;/span&gt;&lt;span style=""&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="font-weight: bold;"&gt;API ย่อมาจาก “Application Programming Interface”&lt;/span&gt; ซึ่งถือเป็นเสมือนประตูสำหรับการพัฒนาโปรแกรมเพื่อเข้าใช้ทรัพยากรบางอย่างหรือแอพพลิเคชันบางตัว ซึ่งในกรณีนี้ ทรัพยากรดังกล่าวก็คือ Google Index หรือฐานข้อมูลที่ Google ได้จัดทำอินเด็กซ์เอาไว้นั่นเอง&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;มาถึงตรงจุดนี้บางท่านคงจะสนใจที่จะเข้ามีส่วนร่วมในการใช้งาน Google Web API กันบ้างแล้วสินะ&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ถ้าเป็นเช่นนั้น ก่อนอื่นคุณต้องลงทะเบียนเพื่อรับ Developer Key กันเสียก่อน เพื่อให้สามารถใช้งาน Google Web API ได้ ซึ่งคีย์ที่คุณได้รับมานั้น Google จะอนุญาตให้ใช้คีย์ดังกล่าวเข้าติดต่อเพื่อค้นหาข้อมูลได้วันละไม่เกิน 1,000 ครั้ง และถึงแม้คุณไม่ได้คิดจะสร้างแอพพลิเคชันใดๆเลยก็ตาม คุณก็ยังสามารถใช้ประโยชน์จาก Developer Key นี้ได้อีกประการหนึ่ง เนื่องจากมีพวก Third-&lt;span style=""&gt;P&lt;/span&gt;arty Application &lt;span style=""&gt;(แอพพลิเคชันที่บริษัทอื่นๆ ที่ไม่ใช่ Google พัฒนาขึ้นมา)&lt;/span&gt; จำนวนมากที่สร้างขึ้นมา และคุณก็สามารถนำมาใช้งานได้เลย โดยที่แอพพลิเคชันเหล่านั้นก็ &lt;span style=""&gt;จำเป็นต้องใช้&lt;/span&gt; &lt;span style=""&gt;D&lt;/span&gt;eveloper Key ในการติดต่อกับ Google ด้วยเหมือนกัน&lt;/p&gt;    &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;span style="font-weight: bold;"&gt;การลงทะเบียน (Sign Up) กับ Google&lt;/span&gt;&lt;br /&gt;การลงทะเบียนเพื่อที่จะได้รับ Developer Key สำหรับ Google Web API นั้นค่อนข้างง่ายมาก ขั้น&lt;span style=""&gt;ตอน&lt;/span&gt;แรกคุณต้องเปิดบัญชีกับ&lt;span style=""&gt; Google&lt;/span&gt; เสียก่อน จากนั้นก็จะได้ Google Web API และคำตอบรับจาก Google ส่งกลับคืนมา สำหรับการลงทะเบียนก็เพียงแค่กรอก&lt;span style=""&gt; E&lt;/span&gt;-mail Address และ Password ที่ถูกต้องเท่านั้น คุณก็จะสามารถ&lt;span style=""&gt; Login เข้าไปหารายละเอียดเพิ่มเติมและสามารถใช้งานแอพพลิเคชันของ Google ได้ด้วยตนเอง&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;แน่นอนที่สุด คุณต้องเห็นด้วยและยอมรับ Terms &amp; Conditions ต่างๆที่ Google ประกาศเอาไว้ด้วย (&lt;a href="http://www.google.com/apis/download.html"&gt;http://www.google.com/apis/download.html&lt;/a&gt;) ก่อนที่คุณจะสามารถดำเนินการอย่างหนึ่งอย่างใดได้ต่อไป โดยคำประกาศดังกล่าว พอจะสรุปคร่าวๆได้ดังนี้&lt;/p&gt;      &lt;ul&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Google อาจจะไม่สามารถควบคุมเนื้อหาที่ปรากฏใน Google Index ได้ทั้งหมด ดังนั้นการใช้งาน Google Web API อาจจะให้ผลลัพธ์ที่เป็นข้อความที่ไม่พึงประสงค์ก็ย่อมได้&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;การใช้งาน Google Web API สามารถใช้ได้กับเฉพาะงานส่วนบุคคลเท่านั้น ไม่สามารถใช้งานในลักษณะก่อให้เกิดประโยชน์ในเชิงการค้าได้ ไม่ว่าจะเป็นการนำไปขาย ให้บริการ หรือการโฆษณาก็ตาม&lt;/li&gt;&lt;li&gt;&lt;!--[if !supportLists]--&gt;&lt;span style="font-family:Symbol;"&gt;&lt;span style=""&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Google ไม่รับผิดชอบต่อความเสียหายอันเนื่องมาจากการใช้งาน และจริงๆแล้ว Google Web API ก็ยังเป็น&lt;span style=""&gt; Beta Version&lt;/span&gt; อยู่ด้วย&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;คุณอาจจะระบุว่าโปรแกรมที่คุณพัฒนาขึ้นมีการใช้ Google Web API แต่โปรแกรมนั้นจะต้องไม่ “(1) ทำให้เสื่อมเสีย ล่วงละเมิด หรือทำให้เสียหายซึ่งเครื่องหมายการค้าของ Google (2) ผิดกฎหมายโดยชัดแจ้ง (3) ละเมิดสิทธิ์อย่างหนึ่งอย่างใดในโปรแกรมของบุคคลที่สาม” และสำหรับการใช้เครื่องหมายการค้า (Trademark) หรือสัญลักษณ์ (Logo) ของ Google จะต้องได้รับการอนุญาตเป็นลายลักษณ์อักษรเท่านั้น&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Google Web API Developer’s Kit (ชุดพัฒนาแอพพลิเคชั่นสำหรับ&lt;/span&gt;&lt;span style=""&gt;&lt;span style="font-weight: bold;"&gt; Google)&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br /&gt;&lt;p class="BTBulleted18" style="text-align: left; text-indent: -17.85pt;" align="left"&gt;ถ้าหากคุณสนใจที่จะเขียนโปรแกรม คุณสามารถดาวน์โหลด Google Web API Developer’s Kit ได้ที่ http://www.google.com/apis/download.html เช่นกัน ซึ่งในชุดจะประกอบด้วย&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-size:85%;" &gt;(หมายเหตุ : Link อาจมีการเปลี่ยนแปลง)&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;!--[endif]--&gt;ไฟล์ WSDL ในหลากหลายแพล็ตฟอร์ม&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;Java &lt;span style=""&gt;W&lt;/span&gt;rapper Library ซึ่งรวบรวมวิธีเชื่อมต่อกับ SOAP เอาไว้&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;ตัวอย่างของแอพพลิเคชันที่สร้างด้วยเทคโนโลยี .NET ของไมโครซอฟต์&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;เอกสารประกอบ (documentation) ซึ่งรวมทั้ง JavaDoc และ SOAP XML &lt;/li&gt;&lt;/ul&gt;        &lt;p class="BT" style="text-align: left;" align="left"&gt;เพียงแค่คลิกลิงก์ download จากนั้น unzip ไฟล์ที่ได้มา อ่านไฟล์ readme.txt แล้วทำตามคำแนะนำในไฟล์เท่านั้น คุณก็สามารถพัฒนาแอพพลิเคชันของตนเองได้แล้ว&lt;/p&gt;  &lt;p class="HD22" style="text-align: left; font-weight: bold;" align="left"&gt;การใช้คีย์ในการแฮ็ก&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ทุกๆครั้งที่คุณส่ง request ไปยังเซิร์ฟเวอร์ของ Google คุณจะต้องใส่คีย์ของคุณไปพร้อมกันด้วย ซึ่ง Google จะทำการเช็คคีย์ว่าถูกต้องหรือเปล่า รวมทั้งตรวจสอบด้วยว่ามีการส่งคำสั่งค้นหา (query) เกินกว่า 1000 ครั้งในวันนั้นแล้วหรือไม่ หากทุกอย่างถูกต้องไม่มีปัญหา Google จึงจะ&lt;span style=""&gt;ทำการ&lt;/span&gt;ประมวลผล request ของคุณ และทำการส่งค่ากลับมาให้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;โปรแกรมทั้งหมดในหนังสือเล่มนี้ ไม่ว่าจะใช้ภาษาอะไรหรือแพล็ตฟอร์มใดก็ตาม จะมีจุดสำหรับแทรกคีย์ของคุณลงไปในโปรแกรมนั้นๆเสมอ ซึ่งโดยปกติแล้วคีย์ดังกล่าวนั้นจะเป็นแถวของอักขระ (string) ที่เกิดจากการสุ่มขึ้นมานั่นเอง&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;สำหรับภาษา Perl แล้วมักจะอยู่ในรูปแบบดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_key='insert key here';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="Style10pt"&gt;&lt;span lang="TH"  style="font-size:16;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;ส่วน Java GoogleAPIDemo ที่มาพร้อมกันกับ Google Web APIs Developer’s Kit&lt;span style=""&gt;  &lt;/span&gt;จะมีรูปแบบดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;% java -cp googleapi.jar com.google.soap.search.GoogleAPIDemo &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;insert_key_here search ostrich&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;จะเห็นว่าในทั้งสองกรณี จะมีคำว่า insert key here หรือ insert_key_here (มีขีดล่าง) ซึ่งจะถูกแทนที่ด้วยคีย์ของคุณ ตัวอย่างเช่น ผู้เขียนแทรกคีย์เข้าไปใน Perl Script ในลักษณะนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Your Google API developer's key&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_key='12BuCK13mY5h0E/34KN0cK@ttH3Do0R';&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span lang="TH"&gt;...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="HD22" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD22" style="text-align: left; font-weight: bold;" align="left"&gt;WSDL คืออะไร?&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;span style=""&gt; &lt;/span&gt;คำว่า WSDL นี้อ่านว่า “whiz-dill”&lt;span style=""&gt;  &lt;/span&gt;ซึ่งย่อมาจาก Web Service Description Language ซึ่งเป็น XML รูปแบบหนึ่งในการอธิบาย Web Service ซึ่งส่วนที่สำคัญและมีประโยชน์ที่สุดเป็นส่วนหนึ่งของ Google Web APIs Developer’s Kit นั้นก็คือ GoogleSearch.wsdl ซึ่งเป็นไฟล์ WSDL ที่จะอธิบายเซอร์วิสรวมทั้งชื่อเมธอดและอาร์กิวเมนต์ต่างๆที่จะสามารถนำมาใช้งานได้ &lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;โดยปกติแล้ว การเก็บไฟล์ GoogleSearch.wsdl เอาไว้ในไดเร็กทอรีเดียวกันกับสคริปต์ที่คุณเขียนจะเป็นวิธีที่ง่ายที่สุด อย่างไรก็ตาม ถ้าหากคุณต้องการที่จะเก็บไฟล์นี้เอาไว้ในไดเร็กทอรีอื่น อย่าลืมเปลี่ยนตำแหน่งของ&lt;span style=""&gt;ไฟล์ (path) &lt;/span&gt;ให้ถูกต้องด้วยก็แล้วกัน ซึ่งโดยปกติแล้วมักจะระบุตำแหน่งของไฟล์ WSDL ดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Location of the GoogleSearch WSDL file&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_wdsl = "./GoogleSearch.wsdl";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span lang="TH"&gt;...&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;สำหรับผู้เขียนเก็บไฟล์ดังกล่าวเอาไว้ในไดเรกทอรี library ดังนั้นจึงเปลี่ยนพาธจากเดิมที่เหมือนข้างบน มาเป็นข้างล่างนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;...&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;# Location of the GoogleSearch WSDL file&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $google_wdsl = "/home/me/lib/GoogleSearch.wsdl";&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span lang="TH"&gt;...&lt;span style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="HD22" style="text-align: left; font-weight: bold;" align="left"&gt;ทำความเข้าใจกับ Google API Query&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;หัวใจหลักของ Google application ก็คือ “การค้นหา” (query) ซึ่งถ้าปราศจากการค้นหาแล้ว ก็ย่อมไม่มีข้อมูลกลับคืนมาอย่างแน่นอน และเนื่องจากเป็นสิ่งสำคัญ เราจึงน่าจะมาทำความเข้าใจโครงสร้างของการส่งคำสั่งค้นหากันสักหน่อย&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left;" align="left"&gt;รูปแบบการค้นหา (query essential)&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;สำหรับ Google Web API ที่ใช้ภาษา Perl ซึ่งจะส่งคำสั่งค้นหาไปยัง Google จะมีลักษณะดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;key, query, start, maxResults, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;filter, restrict, safeSearch, lr, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span lang="TH"&gt;ie, oe&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span lang="TH"&gt;&lt;span style=""&gt;  &lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;span style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;รายการที่อยู่ในวงเล็บจะเป็นตัวแปร ตัวเลข หรือค่าตรรกะอย่างใดอย่างหนึ่ง สำหรับตัวอย่างข้างบนนี้ เป็นชื่อของอาร์กิวเมนต์ (&lt;span style=""&gt;N&lt;/span&gt;ame of Argument) ชนิดต่างๆซึ่งอธิบายได้ดังนี้&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;key&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;เป็นจุ&lt;blockquote&gt;&lt;/blockquote&gt;ดที่คุณต้องแทรกคีย์ของ Google API เข้าไป ซึ่งถ้าหากปราศจากคีย์แล้ว การส่งคำสั่งค้นหาจะไม่ทำงาน&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;query&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;ส่วนนี้เป็นคำค้นหา (query word) ของคุณ ซึ่งประกอบด้วยคีย์เวิร์ด วลี และซินแท็กซ์ต่างๆ&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;start&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;เป็นการกำหนดจุดเริ่มต้นของรายการผลลัพธ์ที่จะแสดงว่า ต้องการให้แสดงผลลัพธ์ตั้งแต่รายการที่เท่าไหร่เป็นต้นไป เช่นถ้ากำหนดเอาไว้ที่ 16 สำหรับการค้นหาผลลัพธ์ 10 รายการ Google Web API จะส่งผลลัพธ์รายการที่ 16-25 มาให้ แต่ถ้ากำหนดเอาไว้ที่ 300 รายการ ก็จะได้ผลลัพธ์ตั้งแต่รายการที่ 300-309 กลับมา เป็นต้น (ทั้งนี้ผลลัพธ์ที่ได้จากการค้นหาทั้งหมดจะต้องมากพอสำหรับตัวเลขนั้นๆด้วย) การนับจะเริ่มนับที่เลข 0 (zero-based index) ไม่ใช่เลข 1 ดังนั้นผลลัพธ์รายการแรกก็คือผลลัพธ์หมายเลข 0 นั่นเอง ซึ่งจริงอยู่ที่มันอาจจะดูแปลกสักหน่อย แต่มันก็สามารถใช้งานได้สะดวกดี ข้อสังเกตก็คือ ค่าที่สามารถใช้ได้จะอยู่ระหว่าง 0-999 เนื่องจาก Google จะส่งผลลัพธ์กลับคืนมาได้ไม่เกิน 1,000 รายการต่อการค้นหาหนึ่งครั้งนั่นเอง&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;maxResults&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;เป็นตัวเลขที่ระบุจำนวนรายการผลลัพธ์ของการค้นหาที่คุณประสงค์จะให้ Google Web API คืนค่าให้คุณ ซึ่งจะมีค่าอยู่ระหว่าง 1 ถึง 10&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;filter&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;คุณอาจนึกถึง filter ที่เป็นออปชันซึ่งมีให้เลือกในโปรแกรมที่สามารถกรองข้อมูลไม่ให้เด็กดู แต่จริงๆแล้วค่า true หรือ false ในส่วนนี้จะเป็นการกรองข้อมูลที่ได้จากการค้นหา ให้ผลของการค้นหาที่มีหัวข้อซ้ำกันถูกตัดออกไป โดยเฉพาะอย่างยิ่งที่มาจากโฮสต์ตัวเดียวกัน ซึ่งการ enable ในส่วนของ filter นี้ จะทำให้มีเพียงผลลัพธ์ของการค้นหาเพียงสองรายการแรกในหนึ่งโฮสต์เท่านั้น ที่จะแสดงออกมาในรายการผลลัพธ์ของการค้นหาทั้งหมด&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;restrict&lt;/p&gt;  &lt;p class="StyleBT18ptThaiDistributedLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;ในส่วนนี้จะเป็นการจำกัดผลลัพธ์ของการค้นหาของคุณ ให้ตรงกับความต้องการมากยิ่งขึ้น หรืออาจจะเป็นการระบุประเทศที่&lt;span class="BTLeft127cmChar"&gt;เป็นแหล่งที่มาของผลลัพธ์ก็ได้ ซึ่ง Google มีการจำกัดในส่วนนี้แบ่งได้เป็น 4 หั&lt;/span&gt;วข้อ (Topic) ด้วยกัน คือ US. Government (unclesam), Linux (linux), Macintosh (mac) และ FreeBSD (bsd) ซึ่งสำหรับการจำกัดผลลัพธ์ที่เป็นประเทศนั้น จะมีรายชื่อประเทศพร้อมชื่อย่อใน Google Web API Documentation อยู่แล้ว คุณสามารถนำมาใช้ได้เลย สำหรับการค้นหาที่ไม่ต้องการจำกัดผลลัพธ์ด้วยวิธีนี้ สามารถทำได้โดยเพียงใส่เครื่องหมาย “” ลงไปเท่านั้น&lt;/blockquote&gt;&lt;span style=""&gt;                        &lt;/span&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;safeSearch&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;ตรงส่วนนี้จะเป็นการกรองเนื้อหาที่ได้รับ มีค่าให้เลือกใส่เป็นค่าบูลีน true หรือ false ซึ่งจะเป็นการระบุให้ผลลัพธ์ มีการกรองข้อมูลที่ไม่เหมาะสม หรือข้อมูลที่มีเนื้อหาไม่เหมาะสม (questionable content) ออกไป&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;lr&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;lr ย่อมาจาก “Language Restrict”&lt;span style=""&gt;  &lt;/span&gt;ซึ่ง Google มีลิสต์รายการภาษาต่างๆใน Google Web API Documentation อยู่แล้ว คุณสามารถใช้ภาษาเป็นเครื่องมือในการจำกัดผลลัพธ์ได้ หรือถ้าไม่ต้องการทำเช่นนั้น ก็ปล่อยอาร์กิวเมนต์นี้ให้เว้นว่างไว้&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;ในการจำกัดผลลัพธ์ในการแสดงเป็นภาษาต่างๆนั้น สามารถทำได้หลายวิธี เช่น คุณสามารถใส่รหัสของภาษา (language code) นั้นๆลงไป เช่น สมมุติคุณต้องการจำกัดผลลัพธ์ให้เป็นเฉพาะภาษาอังกฤษเท่านั้น&lt;span style=""&gt;  &lt;/span&gt;คุณก็เพียงใส่ lang_en ลงไป นอกจากนี้คุณสามารถจำกัดผลลัพธ์ได้มากกว่าหนึ่งภาษา โดยการคั่นรหัสของภาษาที่ต้องการด้วยเครื่องหมาย | (pipe) ตัวอย่างเช่น lang_en|lang_de ซึ่งจะเป็นการจำกัดผลลัพธ์เป็นภาษาอังกฤษหรือเยอรมันเท่านั้น&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;เพื่อไม่ให้ผลลัพธ์มีข้อความที่คุณไม่เข้าใจ คุณสามารถกำหนดไม่ให้ภาษาอื่นใดที่ไม่ต้องการ หรือไม่เกี่ยวข้องกับสิ่งที่ต้องการค้นหา ปรากฏในผลลัพธ์ได้ด้วย โดยการใส่เครื่องหมาย – (ลบ) นำหน้ารหัสของภาษานั้นๆ เช่น –lang_de จะแสดงผลลัพธ์ของการค้นหาได้ทุกภาษานอกจากภาษาเยอรมันเท่านั้น&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;ie&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;อาร์กิวเมนต์ ie ย่อมาจาก “Input Encoding” ซึ่งจะทำให้คุณสามารถระบุ Character Encoding ที่ใช้ในการส่งคำสั่งค้นหาได้ ในเอกสารประกอบ (Documentation) ของ Google แนะนำเอาไว้ว่า “เครื่องที่ติดต่อเข้ามา ควรจะส่ง request มาในรูปแบบ UTF-8 และคาดหวังว่าจะได้รับผลการค้นหาในรูปแบบ UTF-8 กลับไปด้วย”&lt;span style=""&gt;  &lt;/span&gt;เนื่องจากปัจจุบันนี้ทุกอย่างเป็น UTF-8 ไปเกือบหมดแล้ว และในแง่ปฏิบัติจริงๆแล้ว request ใดที่ไม่ได้ใช้ UTF-8 จะไม่ถูกรับเข้ามาประมวลผลไปโดยปริยายเลยทีเดียว&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;oe&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;/p&gt;&lt;blockquote&gt;อาร์กิวเมนต์ตัวนี้ย่อมาจาก “Output Encoding” ซึ่งก็เหมือนกันกับ Input Encoding คือทุกสิ่งทุกอย่างเป็น UTF-8 ไปหมดแล้ว&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ตัวอย่าง&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;คราวนี้เราลองมาดูตัวอย่างกัน สมมุติให้เป็นการส่งคำสั่งค้นหา ที่มีการใช้ตัวแปรแทน key และ query และระบุผลลัพธ์ของการค้นหาที่ต้องการจำนวน 10 รายการ โดยเริ่มต้นจากรายการหมายเลขที่ 100 และมีการกำหนดให้ filter และ safeSearch ทำงาน ซึ่งการค้นหาด้วย Perl จะมีลักษณะดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;$google_key, $query, 100, 10, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"true", "", "true", "", &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"utf8", "utf8"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span lang="TH"&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;โปรดสังเกตว่า key และ query ซึ่งแทนด้วยตัวแปรจะมีเครื่องหมาย “” ครอบอยู่ด้วย&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"12BuCK13mY5h0E/34KN0cK@ttH3Do0R", "+paloentology +dentistry" , 100, 10, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"true", "", "true", "", &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;"utf8", "utf8"&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;);&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การจำกัดผลลัพธ์ของการค้นหา&lt;/p&gt;บางครั้งคุณอาจต้องการจำกัดผลลัพธ์ให้ออกมาเป็นภาษาใดภาษาหนึ่ง และจากประเทศใดประเทศหนึ่งโดยเฉพาะ หรืออาจเป็นภาษา ประเทศและหัวข้อใดหัวข้อหนึ่งโดยเฉพาะ นี่เป็นคำแนะนำหลักทั่วไปเล็กน้อย เกี่ยวกับการจำกัดผลลัพธ์บางประการ&lt;ul&gt;&lt;li&gt;&lt;!--[endif]--&gt;จำกัดไม่ให้มีคำบางคำในผลลัพธ์การค้นหา โดยการใช้เครื่องหมาย&lt;span style=""&gt;  &lt;/span&gt;- (ลบ) หน้าคำนั้นๆ&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;แยกประเภทอาร์กิวเมนต์แต่ละประเภทด้วยเครื่องหมาย . (จุด) โดยไม่มีช่องว่างระหว่างคำ เช่น “linux.contryCA”&lt;span style=""&gt;  &lt;/span&gt;เป็นต้น&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;ระบุความสัมพันธ์แบบ OR ระหว่างค่าของอาร์กิวเมนต์ 2 ค่าที่เป็นประเภทเดียวกันด้วยเครื่องหมาย | (pipe) เช่น contryCA|contryFR เป็นการเลือกผลลัพธ์ที่มาจากประเทศแคนาดาหรือฝรั่งเศสก็ได้&lt;/li&gt;&lt;li&gt;&lt;!--[endif]--&gt;ครอบค่าของอาร์กิวเมนต์ที่เป็นประเภทเดียวกันด้วยเครื่องหมายวงเล็บ&lt;/li&gt;&lt;/ul&gt;        &lt;p class="BT" style="text-align: left;" align="left"&gt;สมมุติคุณต้องการค้นหาผลลัพธ์เป็นภาษาฝรั่งเศส แต่เป็นผลลัพธ์ที่มาจากเว็บไซต์ในประเทศแคนาดาเท่านั้น รวมทั้งสนใจเฉพาะหัวข้อที่เกี่ยวกับลีนุกซ์อย่างเดียว การค้นหาของคุณจะมีคำสั่งค้นหา ดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;my $results = $google_search -&gt; &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;  &lt;/span&gt;doGoogleSearch(&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;$google_key, $query, 100, 10, &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;"true", "linux.countryCA", "true", "lang_fr", &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;span lang="TH"&gt;"utf8", "utf8"&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;span lang="TH"&gt;&lt;span style=""&gt; &lt;/span&gt;&lt;span style=""&gt; &lt;/span&gt;);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;สำหรับการค้นหาผลลัพธ์จากประเทศแคนาดา หรือจากประเทศฝรั่งเศส จะใช้ดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;“.linux.(countryCA|countryFR)”&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;หรือถ้าหากต้องการผลลัพธ์เป็นภาษาฝรั่งเศสเหมือนเดิม แต่ต้องการให้มาจากเว็บไซต์จากประเทศต่างๆทั่วโลก ยกเว้นแต่เฉพาะประเทศฝรั่งเศสเท่านั้น จะต้องใช้ดังนี้&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;“.linux.(-countryFR)”&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;การใส่อาร์กิวเมนต์อื่นๆ&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;คุณสามารถใช้อาร์กิวเมนต์ตัวอื่นๆได้ดังนี้&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;การใช้ SafeSearch&lt;/p&gt;  &lt;p class="BT" style="margin-left: 36pt; text-align: left;" align="left"&gt;ถ้าหากคุณกำลังพัฒนาโปรแกรมสำหรับให้ทุกเพศทุกวัยสามารถใช้ได้ คุณอาจจำเป็นต้องใช้ Safesearch ซึ่งคุณสามารถเข้าไปดูรายละเอียดได้ใน Hack #81 โดยทั่วไปแล้ว คุณสามารถพัฒนาโปรแกรมที่สามารถอ่านข้อความต่างๆในเว็บฟอร์ม เพื่อนำข้อความหรือคำที่อยู่ในนั้นมาตรวจสอบ ว่ามีความเหมาะสมหรือล่อแหลมเพียงใด เพื่อพิจารณาว่าสมควรกรองข้อความหรือคำนั้นออกไปหรือไม่&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;การตั้งค่าจำนวนผลลัพธ์&lt;/p&gt;  &lt;p class="BT" style="margin-left: 36pt; text-align: left;" align="left"&gt;ไม่ว่าคุณจะตั้งค่าจำนวนผลลัพธ์เอาไว้ 1 หรือ 10 รายการก็ตาม โปรดทราบว่าคุณได้ใช้สิทธิ์ในการส่งค่าไปยัง Google ที่กำหนดเอาไว้ไม่เกิน 1,000 ครั้ง ตามที่คีย์ของคุณทำได้ในแต่ละวันเท่านั้น คุณอาจจะเกิดคำถามขึ้นมาในใจว่า ถ้าเป็นเช่นนั้นคุณก็ตั้งค่าจำนวนผลลัพธ์ในแต่ละครั้งเอาไว้ที่ 10 รายการเลยไม่ดีกว่าหรือ ซึ่งจริงๆแล้วอาจจะไม่จำเป็นก็ได้ ถ้าหากคุณสนใจเฉพาะผลลัพธ์ที่อยู่ด้านบนสุดของรายการผลลัพธ์ของการค้นหาเท่านั้น ทั้งนี้เนื่องจากการไม่ request ผลลัพธ์ที่คุณไม่สนใจ จะเป็นการเพิ่มความเร็วให้กับโปรแกรมของคุณได้อีกเล็กน้อยด้วย&lt;/p&gt;  &lt;p class="HD18Italic" style="text-align: left;" align="left"&gt;การค้นหาแบบจำกัดหัวข้อ&lt;/p&gt;  &lt;p class="BT" style="margin-left: 36pt; text-align: left;" align="left"&gt;ความสามารถของ Google Web API ที่ยอมให้คุณค้นหาผลลัพธ์แบ่งเป็นหัวข้อได้ถึง 4 หัวข้อ ด้วยผลลัพธ์ที่เป็นภาษาหรือประเทศที่แตกต่างกันไปนับสิบประเทศ ดังนั้นจึงอาจเกิดผลลัพธ์ที่ต่างกันได้มากมายนับพัน ที่เราจะเลือกจำกัดให้ได้เฉพาะผลลัพธ์ของหัวข้อ ภาษา และประเทศที่เราสนใจ&lt;/p&gt;  &lt;p class="BT" style="margin-left: 36pt; text-align: left;" align="left"&gt;ลองพิจารณาดูถึงโปรแกรมที่จำกัดผลลัพธ์เฉพาะเรื่องที่เกี่ยวกับ Open Source เท่านั้น (เช่น linux หรือ perl) ซึ่งคุณอาจจะมีรายการคำศัพท์ที่เกี่ยวข้องกับเรื่อง Open Source เอาไว้ชุดหนึ่ง แล้วพัฒนาโปรแกรมเพื่อให้ค้นหาผลลัพธ์ โดยยึดรายการคำศัพท์ชุดนี้เป็นหลักเพื่อให้ได้ผลลัพธ์ออกมาเกี่ยวกับหัวข้อ&lt;span style=""&gt;  &lt;/span&gt;Open Source เท่านั้นก็ได้ โดยสามารถจำกัดเฉพาะแหล่งที่มาของผลลัพธ์ว่าต้องการให้มาจากประเทศอะไรได้เหมือนเดิม ซึ่งคุณอาจจะได้ผลลัพธ์ว่า มีการพูดถึงภาษา Perl ในหัวข้อ Linux อยู่จำนวน 15 ครั้งในประเทศฝรั่งเศส และ 20 ครั้งในประเทศเยอรมัน เป็นต้น&lt;/p&gt;  &lt;p class="BT" style="margin-left: 36pt; text-align: left;" align="left"&gt;คุณอาจจะพัฒนาโปรแกรมที่มีพูลดาวน์เมนู (pull-down menu) เพื่อให้ผู้ใช้สามารถเลือกจำกัดผลลัพธ์ของการค้นหา ว่าจะให้มาจากทวีปใดด้วยก็ได้ คล้ายกับจำกัดผลลัพธ์ที่มาจากประเทศใดประเทศหนึ่งๆนั่นเอง&lt;span style=""&gt;  &lt;/span&gt;ซึ่งทำได้โดยการใส่ชื่อทวีปลงไปเป็นตัวแปรในการค้นหา หรือแม้กระทั่งการสร้างอินเทอร์เฟสเพื่อให้ผู้ใช้ระบุหัวข้อ (Topic) ใดหัวข้อหนึ่ง แล้วกำหนดให้แสดงผลลัพธ์ออกมา โดยเป็นผลลัพธ์ที่มาจากประเทศต่างๆที่เตรียมไว้ ประเทศหนึ่งต่อผลลัพธ์หนึ่ง หรือจะเป็นภาษาหนึ่งต่อผลลัพธ์รายการหนึ่งก็ได้&lt;/p&gt;&lt;p class="BT" style="margin-left: 36pt; text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="HD22" style="text-align: left; font-weight: bold;" align="left"&gt;ทำความเข้าใจกับ Google Web API Response&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ในขณะที่ Google Web API ยอมให้คุณเข้าถึงส่วนที่เป็นหัวใจสำคัญของ &lt;span style=""&gt;G&lt;/span&gt;oogle Index แต่พึงทราบว่ามีบางอย่างที่ทำได้ และบางอย่างก็ทำไม่ได้เหมือนกัน นั่นคือ&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;สิ่งที่ทำได้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;สิ่งที่ Google Web API ทำได้หรือให้การสนับสนุนก็คือ ซินแท็กซ์ดังต่อไปนี้ &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;site:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;dasterange:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;intitle:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;inurl:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;allintext:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;allinlinks:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;filetype:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;info:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;link:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;related:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;cache:&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;สิ่งที่ &lt;span style=""&gt;Google API &lt;/span&gt;ทำไม่ได้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ซินแท็กซ์ที่ Google Web API ไม่สนับสนุนก็คือ &lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;phonebook:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;rphonebook:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;bphonebook:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-align: left;" align="left"&gt;stocks:&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ในขณะที่ซินแท็กซ์เหล่านี้ไม่สามารถให้ผลลัพธ์ได้ภายใต้การทำงานของ Google Web API แต่คุณอาจจะใช้ประโยชน์จากซินแท็กซ์เหล่านี้ได้บ้าง อย่างเช่นที่ไฟล์ kincount.cgi ใน Hack #70 ได้ทำให้ดูเป็นตัวอย่าง&lt;/p&gt;  &lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;แสดงผลลัพธ์ได้ไม่เกิน 10 รายการ&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;ในขณะที่การค้นหาผ่านโฮมเพจ Google.com สามารถเลือกแสดงผลลัพธ์ได้ว่าต้องการให้แสดงผลลัพธ์หน้าละ 10,20,30,50 หรือ 100 รายการต่อหนึ่งหน้า แต่ Google Web API จำกัดผลลัพธ์เอาไว้ที่ 10 รายการต่อการค้นหาหนึ่งครั้ง อย่างไรก็ตาม มิได้หมายความว่าคุณไม่สามารถได้ผลลัพธ์มากกว่านี้ได้เลยถ้าต้องการจริงๆ เพราะการเพิ่มผลลัพธ์ให้มากกว่านี้ทำได้ง่ายๆเพียงแค่การใช้การวนลูปดึงผลลัพธ์เพิ่มครั้งละ 10 รายการเท่านั้นเอง &lt;span class="StyleBT18ptThaiDistributedBoldChar"&gt;[&lt;a href="http://ch5.hack-google.com/2007/08/hack51.html"&gt;Hack #51&lt;/a&gt;]&lt;/span&gt;&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;p class="HD20" style="text-align: left; font-weight: bold;" align="left"&gt;ผลลัพธ์จะแสดงอะไรบ้าง&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;Google Web API จะแสดงข้อมูลสรุปเกี่ยวกับรายการผลลัพธ์ทั้งหมด รวมทั้งข้อมูลในส่วนของผลลัพธ์แต่ละรายการด้วย ดังนี้&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;&lt;b style=""&gt;ข้อมูลสรุป &lt;/b&gt;ข้อมูลสรุปเกี่ยวกับรายการผลลัพธ์ทั้งหมดประกอบด้วยดังนี้&lt;/p&gt;&lt;p class="BT" style="text-align: left;" align="left"&gt;  &lt;/p&gt;&lt;code&gt;&amp;lt;documentFiltering&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;ค่า true/false ที่จะเป็นการระบุว่า ผลลัพธ์ที่ได้จากการค้นหานี้ มีการกรองเพื่อคัดแยกผลลัพธ์ที่มีเนื้อหาคล้ายคลึงกันมากๆออกไปหรือไม่ หรืออาจจะเป็นการแยกรายการผลลัพธ์จากโฮสต์ตัวเดียวกันออกไปบางรายการก็ได้&lt;/p&gt;  &lt;code&gt;&amp;lt;directoryCategories&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;ลิสต์รายการหมวดของไดเรกทอรี (ถ้ามี) รวมทั้งคำถามที่ใช้&lt;span style=""&gt;ค้นหา&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;&lt;span style="font-weight: bold;" class="StyleBT18ptThaiDistributedBoldChar"&gt;ข้อมูลในผลลัพธ์แต่ละรายการ &lt;/span&gt;ผลลัพธ์แต่ละรายการจะบอกถึง URL ที่มาของข้อมูล ชื่อเรื่อง (title) รวมถึงข้อความที่ตัดตอนบางส่วนมาจากเนื้อหา (snippet) ด้วย ซึ่งแบ่งออกเป็นส่วนๆดังนี้&lt;/p&gt;&lt;code&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;สรุปรายการไดเรกทอรีของ Google (ถ้ามี)&lt;/p&gt;  &lt;code&gt;&amp;lt;URL&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;URL ที่เป็นแหล่งที่มาของผลลัพธ์ ซึ่งจะมี http:// นำหน้า&lt;/p&gt;  &lt;code&gt;&amp;lt;snippet&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ข้อความที่ตัดตอนมาจากเนื้อหาทั้งหมด ซึ่งจะมีคำที่เราถามหรือใช้ค้นหา แสดงเป็นตัวหนา (แท็ก &lt;code&gt;&amp;lt;b&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;/b&amp;gt;&lt;/code&gt; ในภาษา HTML)  &lt;code&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;title&amp;gt;&lt;br /&gt;&lt;/code&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;ชื่อเรื่อง (title) ในภาษา HTML&lt;/p&gt;  &lt;code&gt;&amp;lt;cachedSize&amp;gt;&lt;br /&gt;&lt;/code&gt;  &lt;p class="BTLeft127cm" style="text-align: left;" align="left"&gt;ขนาดเป็นกิโลไบต์ (kb) ของหน้าที่ทำการแคชไว้ (ถ้ามี)&lt;/p&gt;  &lt;p class="BT" style="text-align: left;" align="left"&gt;คุณอาจจะสังเกตเห็นว่า ไม่มี PageRank แสดงในรายการผลลัพธ์แต่ละรายการ ซึ่งจริงๆแล้ว Google จะแสดง PageRank ก็เฉพาะแต่ใน Google Toolbar [&lt;a href="http://ch1.hack-google.com/search/label/Hack24"&gt;Hack #24&lt;/a&gt;] เท่านั้น นอกจากใน Google Toolbar แล้ว ก็มีที่ Google Directory ที่จะแสดง &lt;span style=""&gt;PageRank &lt;/span&gt;เอาไว้ด้วย&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1320886625518473727-6555076247609283835?l=ch5.hack-google.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ch5.hack-google.com/feeds/6555076247609283835/comments/default' title='ส่งความคิดเห็น'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1320886625518473727&amp;postID=6555076247609283835' title='1 ความคิดเห็น'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/6555076247609283835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1320886625518473727/posts/default/6555076247609283835'/><link rel='alternate' type='text/html' href='http://ch5.hack-google.com/2007/05/5-google-web-api.html' title='บทที่ 5 ทำความรู้จักกับ Google Web API'/><author><name>Saran Yuwanna</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh5.googleusercontent.com/-5wdYrNMTzng/AAAAAAAAAAI/AAAAAAAAc7U/Vh88P3TtkWA/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry></feed>
