はてなダイアリーにコトノハを表示

http://kotonoha.cc/

はてなダイアリーにコトノハを表示できる CGI 作った。コトノハが吐いてくれる javascript を適当 RSS に変換してるだけ。で、RSS モジュールで読み込むと。

  • CGI外部呼出しOKなサーバーが他に無いと駄目
  • しかもsocket使わせてくれる所
  • キャッシュとかしてないので転送量とか気にする所はアレ
  • DOM とかじゃなくて置換で強引に RSS 化してる
  • 恐いからユーザー名は静的(なので1cgi 1ユーザー)
  • 作った人が外向け CGI 慣れてない

微妙。

つかコレきっと存在そのもの恰好悪いから有識者は誰もやらなかったんだろうな。でもそんなの気にしない!!

  • コトノハがコトノハ Roll を RSS で吐いてくれないからいけないんです。
  • はてなjavascript 使わせない癖にこのテのモジュール全然作ってくれないからいけないんです。

http://kotonoha.cc/no/8084
意外と困ってる人は少ないようだ…

以下ソース。危ない所あったら教えてください。>みたひと

#!/usr/bin/perl
use utf8;
use strict;
use Socket;
################################################################################
# 設定ってやつです
# 一行目の perl の path も必要に応じて変更を

# ユーザー名を指定して下さい
my $username = 'staki';

# これを引数で受けるようにすれば複数人で共有できるけど恐いのでやらない

################################################################################
# socket の儀式
my $host = 'kotonoha.cc';
my $path = '/?mode=js&act=koto_roll&uname=' . $username . '&max=16&type=1';
my $port = getservbyname('http', 'tcp');
my $iaddr = inet_aton($host) or die "$host は存在しないホストです。\n";
my $sock_addr = pack_sockaddr_in($port, $iaddr);

socket(SOCKET, PF_INET, SOCK_STREAM, 0) or die "ソケットを生成失敗。\n";
connect(SOCKET, $sock_addr) or die "$host:$port は接続できません。\n";
select(SOCKET); $|=1; select(STDOUT);

# リクエスト
print SOCKET "GET /" . $path . " HTTP/1.0\r\n";
print SOCKET "\r\n";

# ヘッダ取得
while (<SOCKET>){
    m/^\r\n$/ and last;
}

my $body = "";

# body取得
while (<SOCKET>){
	$body = $body . $_;
}

## ホントはアレでしょ?DOMとか使うんでしょ?しらないからそんなの。
# javascript 頭除去
$body =~ s/^<!--\ndocument\.write\(\'//g;
# javascriptケツ 除去
$body =~ s/\'\);\n\/\/\-\->//g;
# <ul> いりません
$body =~ s/<\/?ul>//g;
# <li> 頭いりません
$body =~ s/\<li>//g;
# </li> で分けてみる
my @list = split('</li>', $body);

# rss のオキマリ
my $rss_head =<<"EOF";
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

  <channel rdf:about="$host/$username">
    <title>$username のコトノハ</title>
    <link>$host/$username</link>
    <description>$username のコトノハです</description>
    <language>ja</language>
</channel>
EOF
my $rss_foot =<<"EOF";
</rdf:RDF>
EOF


print "Content-type: text/plain\n\n";
print $rss_head;
foreach my $value ( @list ){
  # エイヤっと変換。これの出来次第で危険度が変るんだろうけど、
  # コトノハもはてなも上手にやってくれるだろうからキニシナイ!!シナイ!!
  $value =~ s/([^<]+)<a href="(.*)" target="_blank">(.*)<\/a>/<item><title>\1\3<\/title><link>\2<\/link><\/item>/;
  print $value, "\n";
}
print $rss_foot;

#おわりだよ