用Ruby脚本抓取百度MP3新歌Top 100发布到闲聊

昨天和ouspec闲聊谈到可以用[url=http://www.iteye.com/wiki/JavaEye/1499-javaeye-api-help]JavaEye的闲聊api[/url]做些什么:
[url]http://quake.iteye.com/blog/chat/1766[/url]
[quote]用JavaEye的闲聊API可以做什么?举例子:你可以注册一个账号,写个小程序从某个"专讲冷笑话"的网站定时抓取,然后用闲聊方式发布,大家只要订阅这个账号就可以享受到每天N个冷笑话的洗礼。 [/quote]

今天试了一下,不过改成了抓取百度MP3新歌Top 100,将最新上榜的歌曲名称,百度搜索链接,另外加3个可以直接下载的url,看看效果:
[url]http://baidump3.iteye.com/blog/chat[/url]

完整代码在文章最下面,主要用hpricot和open-uri来抓取,其中破解百度MP3的加密用到了这篇文章中提到的:[url]http://suninny.iteye.com/blog/234635[/url],另外用到了tinyurl提供的api来减少url的长度。

你可以将baidump3这个用户加入到[url=http://app.iteye.com/feed]你的订阅[/url],就可以获得最新上榜的mp3信息,大家可以讨论看还可以用JavaEye的闲聊API做写什么?



require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'iconv'

def _mktab(x)
t0 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
p = t0.partition(x)
p[1] + p[2] + p[0]
end

def decode(s)
s.tr(_mktab(s[0].chr), s=~ /....:\// ? _mktab('h') : _mktab('f')) #http|ftp
end

def tiny_url(url, encode = false)
result = open(encode ? URI.encode("http://tinyurl.com/api-create.php?url=#{url}") : "http://tinyurl.com/api-create.php?url=#{url}").read
result =~ /^Error/ ? url : result
end

def actual_download_url(search_url, limit = 2)
doc = Hpricot(open(search_url))
doc.search("table#Tbs td.d a").map{|a| a.attributes["href"]}[0..limit].map {|url|
decode(open(URI.encode(url)).read[/var I="([^"]*)"/, 1])
}
end

def get_maidu_mp3_top100
url = "http://list.mp3.baidu.com/list/newhits.html"
doc = Hpricot(Iconv.conv("UTF8", "GBK", open(url).read))
result = {}
doc.search("table.list td:not(.th)").each{|t|
name = t.inner_text.gsub(/\s+/, " ")
search_url = t.search("a")[0].attributes["href"]
result[name] = search_url
}
return result
end

def get_new_data
local_data = File.open('data.yaml') { |file| YAML::load(file) } rescue {}
remote_data = get_maidu_mp3_top100
new_data = {}
remote_data.each_pair { |key, value|
unless local_data.has_key?(key)
local_data[key] = value
new_data[key] = value
end
}
File.open('data.yaml', 'w') { |file| YAML.dump(local_data, file) }
return new_data
end

def update_javaeye_chat(username, password)
get_new_data.each_pair { |key, value|
message = "#{key} 搜索 #{tiny_url value}"
actual_download_url(value).each_with_index{|url, index|
message << " 下载#{index+1} #{tiny_url(url, true)}"
}
open(URI.encode("http://www.iteye.com/api/twitters/create?body=#{message}"), :http_basic_authentication=>[username, password]).read
}
end

update_javaeye_chat("javaeye用户名", "javaeye密码")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值