らんだむ2ch


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>

トップページ
らっしー