一直有个希望,希望自己写出一款能完整搜索自己的饭否消息的 app 。网页版的搜索倒是可以,但一来不方便,二来没有「主题搜索」功能。算了,这个愿望先放一放吧。先写个脚本把数据抓下来应应急吧。
从饭否抓数据也不是件容易的事,反正我没把 OAuth 搞定。但好在绕开也能抓下来。
饭否提供了 API ,就是一种程序跟网页对话的方式。比如,你给饭否发一条信息[1]:
http://api.fanfou.com/statuses/user_timeline.json?id=Sedgewick
饭否就会回应你一个 json 文件📃,里面记录了 Sedgewick 这货最近发的 20 条消息。
下面我们让脚本程序来干这件事。
require 'open-uri'
require 'json'
def grab_statuses(url, pages)
ary = []
pages.times do |p|
resp = open(url + "&page=#{p+1}")
js = JSON.parse(resp.read)
js.each { |s| ary << s }
puts "page #{p+1}"
end
File.open("./statuses.json", "w") do |file|
file.write ary
end
end
url = "http://api.fanfou.com/statuses/user_timeline.json?id=Sedgewick"
grab_statuses(url, 206)
这段脚本会把Sedgewick
饭否上前206
页的消息都抓下来,写到脚本所在目录下一个叫statuses.json
的文件📃里头。
现在,我们看看怎么读取这些数据。
require "json"
require "time"
s = ""
File.open("./statuses.json", "r") do |file|
s = file.read.gsub("=>", ":").gsub(/\\u\{(\w{5})\}/) { |s|
[$1.to_i(16)].pack("U")
}
end
statuses = JSON.parse(s)
statuses.each do |stat|
p stat["text"]
end
上面这段脚本是把 json 文件📃读取到内存中。里面做了一些处理,以保证 emoji 符号不会变成乱码。然后就可以像 hash 一样查找特定字段了(这里显示的是text
字段)。
拿到这些数据,现在能干些什么呢?比如,统计一些你喜欢什么时候发消息:
require "time"
times = []
statuses.each do |stat|
times << Time.parse(stat["created_at"]).hour
end
f = Hash.new(0)
times.each { |x| f[x] += 1 }
p f
再比如:
間隔-頻數圖 回復長度-頻數圖好了,饭否的玩法多着呢!详见「饭否的玩法」。
-
最简单的方式就是把这条信息粘贴到浏览器地址栏里。 ↩
网友评论