Skip to content

Instantly share code, notes, and snippets.

@emsk
Created July 10, 2012 13:14
Show Gist options
  • Save emsk/3083165 to your computer and use it in GitHub Desktop.
Save emsk/3083165 to your computer and use it in GitHub Desktop.
Hacker News RSS から指定した文字列を検索して Growl で通知
# coding: utf-8
#
# Hacker News RSS 通知
#
# Hacker News RSS から指定した文字列を検索して Growl で通知する。
#
require 'rubygems'
require 'nokogiri'
require 'open-uri'
require 'ruby-growl'
# 検索対象の単語リスト(改行区切り)
WORDS = 'words.txt'
# === RSS 解析クラス
# RSS として提供されている XML を解析し、Growl で通知する。
class HackHackerNews
# Hacker News RSS
URL = 'http://news.ycombinator.com/rss'
# Growl 設定
GROWL = {
:name => 'Notification',
:title => 'Hacker News Notification'
}
@@growl = Growl.new('localhost', 'ruby-growl')
@@growl.add_notification(GROWL[:name])
@@doc = Nokogiri::XML(open(URL))
# === コンストラクタ
# 検索対象単語および Growl 通知メッセージを初期化する。
def initialize
@words = []
@messages = []
end
# === 検索対象単語読み込み
# 検索対象の単語をテキストファイルから読み込む。
# ==== 引数
# * file: 検索対象の単語が記載されたテキストファイルへのパス
def load_words(file)
File.open(file).each do |word|
@words.push(word.chomp)
end
end
# === 検索
# XML から単語を検索する。
def search
@@doc.xpath('//item').each do |item|
title = item.xpath('title')[0].content
@words.each do |w|
if /#{w}/i =~ title
link = item.xpath('link')[0].content
@messages.push([title, link].join("\n\n"))
end
end
end
end
# === 通知
# 検索結果を Growl で通知する。
def notify
@messages.each do |message|
@@growl.notify(GROWL[:name], GROWL[:title], message)
end
end
end
hhn = HackHackerNews.new
hhn.load_words(WORDS)
hhn.search
hhn.notify
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment