วันพฤหัสบดีที่ ๒๖ กรกฎาคม พ.ศ. ๒๕๕๐

HACK#42 การสร้างฟอร์มเฉพาะสำหรับการสืบค้นแบบกำหนดวันเวลา (date-range search)

สืบค้นเฉพาะหน้าเว็บเพจที่ถูกอินเด็กซ์โดย Google ภายในวันนี้ เมื่อวาน เจ็ดวันที่แล้ว หรือภายใน 30 วันที่ผ่านมา

Google มีคุณสมบัติในการสืบค้นโดยอิงวันที่ (Hack #11) ซึ่งใช้วันที่แบบ Julian Date แต่ว่าคนทั่วๆ ไปไม่อาจจะเปลี่ยนวันที่แบบ Gregorian ที่เราใช้ๆและคุ้นเคยกันอยู่ ไปเป็นแบบ Julian Date ได้โดยการคิดในใจเป็นแน่ อย่างไรก็ตาม ด้วยสูตรการแปลงและการเขียนสคริปต์ภาษา Perl อีกนิดหน่อย คุณก็สามารถสืบค้นหน้า Google ที่เพิ่งถูก Google ทำการอินเด็กซ์ในวันนี้ เมื่อวาน เจ็ดวันที่แล้ว หรือกระทั่งภายใน 30 วันที่ผ่านมาได้อย่างง่ายดาย

ฟอร์ม

ส่วนแรกของสคริปต์นั้นอยู่ในรูปของ HTML ธรรมดาๆ เท่านั้น


<form action="http://path/to/cgi-bin/goofresh.cgi"
method="get">

Search for:<br />
<input type="text" name="query" size="30" />
<p />
Search for pages indexed how many days back?<br />
<select name="days_back">
<option value="0">Today</option>
<option value="1">Yesterday</option>
<option value="7">Last 7 Days</option>
<option value="30">Last 30 Days</option>
</select>
<p />
<input type="submit" value="Search">
</form>

ฟอร์มข้างต้นนั้นจะขอรับอินพุตจากผู้ใช้สองรายการ โดยรายการแรกนั้นเป็นคิวรีของ 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) ลงไปในฟอร์มละก็ คุณสามารถทำเองได้ และปรับฟอร์มให้สัมพันธ์กัน



<form action="http://path/to/cgi-bin/goofresh.cgi"
method="get">

Search for:<br />
<input type="text" name="query" size="30" />
<p />
Search for pages indexed how many days back?<br />
<select name="days_back">
<option value="0">Today</option>
<option value="30">Around 1 Month</option>
<option value="60">Around 2 Months</option>
<option value="90">Around 3 Months</option>
<option value="365">1 Year</option>
</select>
<p />
<input type="submit" value="Search">
</form>


หรืออาจจะให้ผู้ใช้ระบุง่ายๆ เป็นจำนวนวันที่จะย้อนกลับไปสืบค้นก็ได้



<form action="http://path/to/cgi-bin/goofresh.cgi"
method="get">

Search for:<br />
<input type="text" name="query" size="30" />
<p />
Search for pages indexed how many days back?<br />
<input type="text" name="days_back" size="4"
maxlength="4" />

<p />
<input type="submit" value="Search">
</form>

0 ความคิดเห็น: