HACK#42 การสร้างฟอร์มเฉพาะสำหรับการสืบค้นแบบกำหนดวันเวลา (date-range search)
สืบค้นเฉพาะหน้าเว็บเพจที่ถูกอินเด็กซ์โดย Google ภายในวันนี้ เมื่อวาน เจ็ดวันที่แล้ว หรือภายใน 30 วันที่ผ่านมา
Google มีคุณสมบัติในการสืบค้นโดยอิงวันที่ (Hack #11) ซึ่งใช้วันที่แบบ Julian Date แต่ว่าคนทั่วๆ ไปไม่อาจจะเปลี่ยนวันที่แบบ Gregorian ที่เราใช้ๆและคุ้นเคยกันอยู่ ไปเป็นแบบ Julian Date ได้โดยการคิดในใจเป็นแน่ อย่างไรก็ตาม ด้วยสูตรการแปลงและการเขียนสคริปต์ภาษา Perl อีกนิด หน่อย คุณก็สามารถสืบค้นหน้า Google ที่เพิ่งถูก Google ทำการอินเด็กซ์ในวันนี้ เมื่อวาน เจ็ดวันที่แล้ว หรือกระทั่งภายใน 30 วันที่ผ่านมาได้อย่างง่ายดาย
ฟอร์ม
ส่วนแรกของสคริปต์นั้นอยู่ในรูปของ HTML ธรรมดาๆ เท่านั้น
ฟอร์ม ข้างต้นนั้นจะขอรับอินพุตจากผู้ใช้สองรายการ โดยรายการแรกนั้นเป็นคิวรีของ Google ซึ่งพร้อมมูลด้วยการสนับสนุนซินแท็กซ์พิเศษทั้งหลาย รวมถึงการใช้งานซินแท็กซ์พิเศษต่างๆร่วมกันด้วย (Hack #8) โดยท้ายที่สุดแล้ว ก็คือการส่งผ่านคิวรีไปยัง Google ส่วนอินพุตที่สองเป็น pull-down list ซึ่งใช้แสดงตัวเลือกให้ระบุว่าช่วงเวลาใดที่ต้องการจะสืบค้น
Tip: การแฮกในหัวข้อนี้ต้องการโมดูล Time::JulianDay เพิ่มเติม (http://search.cpan.org/search? query=time%3A%3AjulianDay) สคริปต์จะไม่ทำงานเลยทีเดียว หากขาดโมดูลดังกล่าวโค้ดตัวอย่าง
สคริปต์นี้ทำงานอยู่สองสามขั้นตอนคือ แปลงวันที่ใน Perl แล้วทำการ redirect มา ยัง Google รวมทั้งแปลงคิวรีในระหว่างนั้น ซึ่งในมุมมองของ Google แล้วก็เป็นการคิวรีธรรมดาๆ และไม่ต้องการ Google API Developer’s Key แต่อย่างใด
#!/usr/local/bin/perl
# goofresh.cgi
# searches for recently-Indexed files on google
# usage: goofresh.cgi is called as a CGI with form input,
# redirecting the browser to Google, altered query in tow
use CGI qw/:standard/;
use Time::JulianDay;
# build a URL-escaped query
(my $query = param('query')) =~ s#(\W)#sprintf("%%%02x", ord($1))#ge;
# how many days back?
my $days_back = int param('days_back') || 0;
# what's the current julian date?
my $julian_date = int local_julian_day(time);
# redirect the browser to Google with query in tow
print redirect(
'http://www.google.com/search?num=100' .
"&q=$query" .
"+daterange%3A" . ($julian_date - $days_back) . "-$julian_date"
);
Hacking the Hack
ถ้าหากว่าคุณไม่ชอบการระบุช่วงเวลาที่เป็นโค้ดดิบ (hardcoded) ลงไปในฟอร์มละก็ คุณสามารถทำเองได้ และปรับฟอร์มให้สัมพันธ์กัน
หรืออาจจะให้ผู้ใช้ระบุง่ายๆ เป็นจำนวนวันที่จะย้อนกลับไปสืบค้นก็ได้