RssPlurker

一直以來都是GoogleReader來分享文章,自從越來越多朋友玩噗浪之後,分享文章慢慢變成一種很DRY(Don’t Repeat Yourself)的事,在GoogleReader看到不錯的文章,一下忙著按下分享,一下忙著貼上噗浪,最後還要想看看是否要msn還是轉寄給家人。

不知道是不是有現成的軟體下,就直接開使用ruby開始寫工具了!不是我愛重造輪子,是我很慘每次學東就忘西,寫些程式好讓我喚回我對ruby的記憶。邊程相關應該沒啥人有興趣,我最直接寫在最後了。

使用對象

  • 想把rss直接噗上噗浪的人。
  • 電腦有裝ruby。
  • 知道ruby不是紅寶石的人。

使用方法

  1. http://gist.github.com/157918 下載,或是直接剪貼下方程式碼。
  2. 編輯程式碼貼上噗浪帳號、密碼和rss連結。
  3. 點兩下執行。

PS: 此程式需要用到simple-rss和mechanize,使用者必須要gem回來。

使用效果

  1. 程式一開始會去找rss的所有文章,但並不會把這些文章噗上噗浪。
  2. 程式開啟之後,rss若有新增文章程式才會把這些文章貼上噗浪。
%w(rubygems simple-rss open-uri set mechanize).each { |f| require f }
class RssPlurker
Plurk = 'http://www.plurk.com'
def initialize(user_name, password, source)
@user_name = user_name
@password = password
@source = source
@item_link_set = Set.new
rss = get_rss(@source)
rss.items.each do |i|
@item_link_set << i.link
end
end
def plurk_if_has_new_item
puts 'Plurk if rss has new item.'
plurk_items = []
rss = get_rss(@source)
rss.items.each do |i|
unless @item_link_set.include?(i.link)
@item_link_set << i.link
plurk_items << i
end
end
if (plurk_items.size > 0)
login(@user_name, @password)
plurk_items.each do |i|
new_title = i.title.gsub(/(\(|\))/, '')
puts "Plurk this: #{i.link} (#{new_title})"
add_plurk("#{i.link} (#{new_title})", 'shares')
end
end
end
private
def get_rss source
SimpleRSS.parse open(source)
end
def login(user_name, password)
agent = WWW::Mechanize.new
begin
agent.get(Plurk) do |login_page|
timeline = login_page.form_with(:action => 'https://www.plurk.com/Users/login') do |form|
form.nick_name = user_name
form.password = password
end.submit
/var GLOBAL = \{.*"uid": ([\d]+),.*\}/imu =~ timeline.body
@uid = Regexp.last_match[1]
end
@cookies = agent.cookie_jar
@logged_in = true
rescue
false
end
end
def add_plurk(content="", qualifier="says", limited_to=[], no_comments=false, lang="en")
return false unless @logged_in
no_comments = no_comments ? 1 : 0
params = {
:posted => Time.now.getgm.strftime("%Y-%m-%dT%H:%M:%S"),
:qualifier => qualifier,
:content => content[0...140],
:lang => lang,
:uid => @uid,
:no_comments => no_comments
}
params[:limited_to] = "[#{limited_to.join(",")}]" unless limited_to.empty?
request("/TimeLine/addPlurk", :method => :post , :params => params)
end
def request(path, options = {})
begin
agent = WWW::Mechanize.new
agent.cookie_jar = @cookies
case options[:method].to_s
when "get"
agent.get(Plurk + path, options[:params])
when "post"
agent.post(Plurk + path, options[:params])
end
return agent.current_page.body
rescue WWW::Mechanize::ResponseCodeError => ex
raise Unavailable, ex.response_code
end
end
end
def every_n_minutes(n)
seconds = n * 60
loop do
before = Time.now
yield
interval = seconds - (Time.now - before)
if (interval > 0)
sleep(interval)
end
end
end
source = "改成你要餵入的rss連結"
user_name = "改成你的噗浪帳號"
password = "改成你的噗浪密碼"
plurk_bot = RssPlurker.new(user_name, password, source)
every_n_minutes(5) {plurk_bot.plurk_if_has_new_item}
view raw gistfile1.rb hosted with ❤ by GitHub

關於噗浪這部份都是參考XDite大的Unofficial Plurk API in Ruby,最後發現自己用不到那麼多方法,所以只把有需要的部份加入到自己的程式碼中,順便從XDite的程式碼中得知mechanize這個跟網站互動的API。rss的部份因為GoogleReader輸出的是atom格式,所以沒有用內建的API改用simple-rss來讀取。

心得就是雙修的下場是兩邊技能都不太強,我英文跟日文的學習進度也有一樣的情況。然後不要玩太兇,要不然下場就跟我一樣(如下圖),暗!

8 則回應:

Lilit / 驢子 提到...

這篇應該算是屌文章一篇
怪不得一早看你散彈槍攻擊@@

[ 小黑宅 ] 提到...

早上市意外!

匿名 提到...

http://www.javaeye.com/topic/299699

Yuho 提到...

早上真的被嚇了一跳~
像垃圾郵件發送機一樣 XD

[ 小黑宅 ] 提到...

http://www.youtube.com/watch?v=AAWqnA8PdcY

匿名 提到...

我只能說,這是真神人,完全不會用,但是文章也看得很過癮。

[ 小黑宅 ] 提到...

我只是喳阿 XD

匿名 提到...

[url=http://louboutinmart.co.uk]christian louboutin shoe sale[/url] Oh well, if you cannot brag about doing something well, then brag about doing it badly. http://dkgoose.com Ogjotwesj [url=http://www.louboutinoutletuks.co.uk]christian louboutin[/url]
glsesh 005796 [url=http://www.chilliwackbombersoutlet.com]canada goose expedition black[/url] 399385 [url=http://www.officialcanadagooseparkas.ca]canada goose jackets[/url]