IT/웹툴즈

오픈캐스트를 RSS로 구독할 수 있는 PHP소스 공개

k2man 2009. 4. 21. 17:40
반응형

허접하게 만들었지만 소스를 공개하겠습니다.

각 캐스트 게시판에 있는 발행 정보([No1.어쩌고저쩌고…]발행했습니다.)만 읽어와서 RSS로 만들어 줍니다. 캐스트노트의 일부도 함께 가져옵니다.

RSS본문에 추가적으로 내용을 덧붙이시려면,

<description><?=$newnote[$i][1]?></description>

<description>태그 사이에 필요한 내용을 채워 넣으면 됩니다. 태그 입력시 < 는 &lt; , > 는 &gt; 로 넣으시면 됩니다.

만약 아래 파일을 opencast.php 라고 저장했다면 opencast.php?id=KK244 형태로 호출해야 합니다.

50여개 캐스트 정도를 테스트했는데, 특별한 경우를 제외하고는 대부분 잘 작동합니다.

(소스가 많이 허접하죠? ㅋㅋ 몇 년만에 PHP해보니 힘드네요… ^^)

 

<?php
    // -------- 정보 추출기 -----------

    // 게시판 파일을 불러옴
    $opencast_id = $_GET['id'];
    $opencast_url = "http://opencast.naver.com/" . $opencast_id;

    $fp = fopen($opencast_url,"r");
    $content = "";
    while( !feof($fp) ){
            $buffer = fgets($fp,4096);
            $content .= $buffer;
    }
    fclose($fp);

    // 캐스트 제목, 캐스터, 메시지 추출
    preg_match("/<a href=\"\/.....\">(.*)<\/a><\/h1>/", $content, $title);
    preg_match("/<div class=\"cast_message\">(.*)/", $content, $message);
    preg_match("/<a href=\"\/(.*)\" class=\"caster_id\"/", $content, $caster);
    $message[1] = str_replace("</div>", "", $message[1]);

    // 게시판 파일을 불러옴
    $bbs_url = "http://bbs.opencast.naver.com/nboard2/list.nhn?n2_boardId=1000003444&n2_templateObjectId=" . $opencast_id . "&n2_volume=0";

    $fp = fopen($bbs_url,"r");
    $content = "";
    while( !feof($fp) ){
            $buffer = fgets($fp,4096);
            $content .= $buffer;
    }
    fclose($fp);

    // 글 목록과 날짜 추출
    preg_match_all("/\".*\"[,\n]/", $content, $list);
    preg_match_all("/<em class=\"date\">(.*)<\/em>/", $content, $date);

    // 가장 하단의 제목 추출
    preg_match_all("/\"\[No.*\"/", $content, $first);
    preg_match("/\[No(.*)\]/",  $first[0][sizeof($first[0])-1], $first_subject);

    // 날짜 배열크기 구함
    $size = sizeof($date[0]);

    // 날짜 순서에 맞게 재배치
    for ($i=0; $i<$size; $i++) {
        $newdate[$i] = $date[1][$i];
        preg_match("/\[No(.*)\]/", $list[0][$i+$size+1], $newsubject[$i]);
        preg_match("/\"(.*)\"/", $list[0][$i+1], $newnote[$i]);
    }

    // 가장 하단 제목 적용
    $newsubject[$i-1] = $first_subject;

    // -------- RSS 생성기 -----------

    // 캐스트 제목 $title[1]
    // 캐스트 설명 $message[1]
    // 발행일 $newdate[..]
    // 글 제목 $newsubject[..][1]
    // 글 내용 $newnote[..][1]

    echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
?>

<rss version="2.0">
    <channel>
        <title><?=$title[1]?></title>
        <link><?=$opencast_url?></link>
        <description><?=$message[1]?></description>
        <language>ko</language>
        <pubDate><?php echo date("D, d M Y H:i:s O", time()); ?></pubDate>
        <generator>Webtools Beta1(http://webtools.kr/)</generator>
<?php
    $cast_index = 30000;
    for ($i = 0; $i <= sizeof($newsubject); $i++) {
        // 제목이 유효한 발행일 경우만
        if($newsubject[$i][1]) {
            // 발행일 계산
            $date_temp = explode(".", $newdate[$i]);
            $date_stamp = mktime(0, 0, 0, $date_temp[1], $date_temp[2], $date_temp[0]+2000);

            //발행번호 추출
            $no_temp = explode(" ", $newsubject[$i][1]);
            $cast_no = explode(".", $no_temp[0]);

            if($cast_index > $cast_no[1]) { // 캐스트 번호가 순차적으로 감소하는지 검사
                $cast_index = $cast_no[1]; // 캐스트 번호가 순차적으로 감소하는지 검사하기 위한 변수

                //본문내용 태그 문자 변환, 아래와 순서 조심
                $newnote[$i][1] = str_replace(array('&', '<', '>', '"', "'"), array('&amp;', '&lt;', '&gt;', '&quot;', '&apos;'), $newnote[$i][1]);

                //본문내용 \n문자를 <br />로 변환
                $newnote[$i][1] = str_replace('\\n', '&lt;br /&gt;', $newnote[$i][1]);

                //제목의 따옴표 변환
                $newsubject[$i][1] = str_replace(array("\\'", '\\"'), array("'", '"'), $newsubject[$i][1]);
?>
        <item>
            <title>No<?=$newsubject[$i][1]?></title>
            <link><?php echo $opencast_url . "/" . $cast_no[1]; ?></link>
            <description><?=$newnote[$i][1]?></description>
            <author><?=$caster[1]?></author>
            <guid><?php echo $opencast_url . "/" . $cast_no[1]; ?></guid>
            <pubDate><?php echo date("D, d M Y H:i:s O", $date_stamp); ?></pubDate>
        </item>
<?php
            }
        }
    }
?>
    </channel>
</rss>

반응형