数日前に見たあるwebページの内容をもう一度見ようと思ったらどうしても見つからないので、見たページ全部記録することにしました。URLだけだったらproxyのログに全部残ってるのですが、どうにも見つからない(見つけられない)ので、内容も保存しておいて全文検索が出来るように。
用意したもの
- 閲覧したページの情報を送信するGreasemonkeyスクリプト
- ↑の送り先になるCGI
- ↑の情報を保存するデータベース
- 全文検索エンジン(Hyper Estraierを使いました)
- データベースに保存された情報をHyper Estraierに流し込むスクリプト(自作)
今考えると、CGIで受け取ったデータをそのまま全文検索エンジンに放り込むだけでも十分な気がしてきましたが。
まず1.。内容を送信するために、ちょっと変更。methodをPOSTにして、Content-Type: application/x-www-form-urlencodedを送るようにして、パラメータに'document=' + encodeURIComponent(document.getElementsByTagName('html')[0].innerHTML)を追加。あと、コピペすると全角空白が混じってるので削除。(はまりました)
2.はパラメータ受け取ってデータベースに登録するだけなので、これだけ。(データベースドライバの内部実装がバインドパラメータ使ってなかったら怖いことに…)
#!/usr/local/bin/ruby
require 'dbi'
require 'cgi'
cgi = CGI.new
if cgi.has_key?('url') and cgi.has_key?('title') and cgi.has_key?('document')
DBI.connect("dbi:Pg:dbname=browselog", "username", "password") do |dbh|
dbh.do("SET client_encoding TO 'utf-8'")
dbh.do("INSERT INTO logs (url,title,document,timestamp) VALUES (?,?,?,?)",
cgi['url'], cgi['title'], cgi['document'], 'now')
end
end
cgi.out("text/plain") {"OK"}
5.も簡単
#!/usr/local/bin/ruby
require 'dbi'
def addindex(url,title,mdate,document)
open('| estcmd put /home/shin/casket', 'w') do |f|
document.gsub!(/<wbr>/,'') #MR Tech's Link Wrapper対策
document.gsub!(/^\t+/m,'')
url.gsub!(/[\r\n]/,'')
title.gsub!(/[\r\n]/,'')
f.puts "@uri=#{url}"
f.puts "@title=#{title}"
f.puts "@cdate=#{mdate}"
f.puts "@mdate=#{mdate}"
f.puts "@type=text/html"
f.puts ""
f.puts document
end
end
begin
dbh = DBI.connect("dbi:Pg:dbname=browselog", "username","password")
sth = dbh.prepare("SELECT url,title,timestamp,document from logs where timestamp < 'today' AND timestamp > 'yesterday' ")
sth.execute
sth.fetch do |row|
addindex(row[0],row[1],row[2],row[3])
end
sth.finish
rescue DBI::DatabaseError => e
puts "An error occurred"
puts "Error code: #{e.err}"
puts "Error message: #{e.errstr}"
ensure
dbh.disconnect if dbh
end
最近のコメント