eRubyで動く2chルーレットです。ランダムでどっかのスレを選んでくれます。
らんだむ2chのぺーじのver0.4を移植して、ちちっといじっただけです。
本家との違いは、板一覧を一日一回ぐらいしか更新しないことぐらい。
そんじゃ逝け!
ソースです。ライセンスは本家と同じ(つまりご自由にって事)
<%# rand2ch.rhtml $Id: rand2ch.rhtml, v 0.1.1 2002/12/12 14:30:29 raccy Exp $ Random2ch.cgi(Perl) $OrigId: Random2ch.cgi,v 1.5 2002/10/13 13:02:50 okada Exp $ %><% require 'net/http' require 'pstore' $KCODE = 's' HTTP_PORT = 80 NAME_SUBBACK = "subback.html" PATH_READCGI = "test/read.cgi" NEED_URLr = %r{^http://(?:[^.]+\.)+(?:2ch\.net|bbspink\.com|machibbs\.com)/\S+/$}i URL_BBSMENU = "http://www.ff.iij4u.or.jp/~ch2/bbsmenu.html" STORE_FILE = "rand2ch.pstore" RENEWAL_TIME = 60 * 60 * 24 # sec 24時間 def get_html(url, port=80) ref_content = nil host, path = url.scan(%r|^http://([^/]+)(/.*)|)[0] Net::HTTP.start(host,port) do |http| ref_content = http.get(path)[0].body end return ref_content end def get_links(html) links = {} html.scan(%r|<[Aa]([^>]+)>(.*?)</[Aa]>|) do |link, name| match = %r{[Hh][Rr][Ee][Ff]=([-./0-9:A-Za-z_]+|"[^"]+"|'[^']+')}.match(link) or next #" links[name] = match[1].sub(/^(["'])(.*)\1$/, '\2') #" end return links end %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>Randam2ch:Link</title> </head> <body><% begin %><% store = PStore.new(STORE_FILE) link = {} # 全部これに入れるみたいれす # 板を決定 boards = nil store.transaction do if store.root?('time') && Time.now - store['time'] < RENEWAL_TIME boards = store['boards'] else boards = get_links(get_html(URL_BBSMENU, HTTP_PORT)) boards.each do |key, val| NEED_URLr.match(val) or boards.delete(key) end store['boards'] = boards store['time'] = Time.now end end keys = boards.keys link[:BoardName] = keys[rand(keys.size)] link[:BoardUrl] = boards[link[:BoardName]] # スレを決定 subback = link[:BoardUrl] + NAME_SUBBACK subback.untaint if $SAFE == 1 # 汚染解除 threads = get_links(get_html(subback, HTTP_PORT)) keys = threads.keys link[:ThreadName] = keys[rand(keys.size)] server, bbs = link[:BoardUrl].scan(%r|http://([^/]+)/([^/]+)/$|i)[0] case link[:BoardUrl] when /2ch|bbspink/ link[:ThreadUrl] = [ 'http:/', server, PATH_READCGI, bbs, threads[link[:ThreadName]] ].join('/') when /machibbs/ link[:ThreadUrl] = [ 'http:/', server, threads[link[:ThreadName]].sub(%r|^\.\./|, "") ].join('/') end # linkが決まりますた %><h1>てきとーにスレを選びますた</h1> <hr> <p> <a href="<%=link[:BoardUrl]%>"><%=link[:BoardName]%></a>板の <a href="<%=link[:ThreadUrl]%>"><%=link[:ThreadName]%></a>スレへいってらっしゃい </p><% rescue Exception => e %><h1>えらーがおきますた</h1> <hr> <p>えらーくらす:<%= e.class %></p> <p>えらーめっせ〜じ:<%= e.message %></p> <p>ばっくとれ〜す:<br><%= e.backtrace.join("<br>") %></p><% end %></body> </html>