トラックバックの実装
■トラックバック技術仕様書:Discreet Blog■Services_Trackback:PEAR
■トラックバックってなに?:レントラ
■あなたのサイトを一斉送信!:PinGoo!
ブログの普及によりその周辺技術を扱う機会が増えてきました。
固定HTMLのFTP等でアップロードして終わりというサイトのニーズも少なく感じます。
ブログの代表機能の一つにトラックバックは欠かせないと思っております。
上にあるトラックバックのレンタルがあるなんて驚きでした。
[サンプル]
●トラックバックPing
●トラックバックPingの一覧
●テスト用トラックバックURL
http://study.rakuto.net/sample/trackback/trackback.php
トラックバックPing
/** * tbpingクラス * * @author 高橋 裕志郎 <yujiro@rakuto.net> * @package tbping * @access public * @version 0.1 */ class tbping { /** * PING先 * @var string */ var $ping = ''; /** * URL * @var string */ var $url= ''; /** * タイトル * @var string */ var $title = ''; /** * 概要 * @var string */ var $excerpt = ''; /** * ブログ名 * @var string */ var $blog_name = ''; /** * コンストラクタ * * @access public * @return void **/ function tbping() { $this->ping = empty($_POST['ping'])? 'http://localhost/trackback.php':$_POST['ping']; $this->url = empty($_POST['url'])? 'http://localhost/':$_POST['url']; $this->title = empty($_POST['title'])? 'タイトル':$_POST['title']; $this->excerpt = empty($_POST['excerpt'])? '要約':$_POST['excerpt']; $this->blog_name = empty($_POST['blog_name'])? 'ブログ名':$_POST['blog_name']; } /** * Pingの送信 * * @access public * @return boolean **/ function send() { $parse = parse_url($this->ping); $buff = ''; $post = 'url=' . rawurlencode($this->url) . '&title=' . rawurlencode($this->title) . '&blog_name=' . rawurlencode($this->blog_name) . '&excerpt=' . rawurlencode($this->excerpt); $request = 'POST '.$this->ping.' HTTP/1.1'."\r\n". 'Host: '.$parse['host']."\r\n". 'User-Agent: PHP fsockopen'."\r\n". 'Accept: text/xml,application/xml,'. 'application/xhtml+xml,text/html;q=0.9,'. 'text/plain;q=0.8,video/x-mng,image/png,'. 'image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1'."\r\n". 'Content-type: application/x-www-form-urlencoded'."\r\n". 'Content-Length: ' . strlen($post) . "\r\n". 'Connection: Close'."\r\n\r\n". $post; $errno = null; $errstr = null; $fp = fsockopen($parse['host'], 80, $errno, $errstr, 30); if (!$fp) { $buff = $errstr.' ('.$errno.')<br />'."n"; } else { fwrite($fp, $request); while (!feof($fp)) { $buff .= fgets($fp, 4096); } fclose($fp); } $result = false; if (preg_match("/<error>0</error>/i", $buff)){ $result = true; } return $result; } } // tbping header('Content-Type: text/html; charset=UTF-8');
<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>トラックバックピング</title> </head> <body> <?php $obj_tbping = new tbping(); if (!empty($_POST['send'])){ $obj_tbping->send(); } ?> <form name="ping" method="post" action="<?php echo $_SERVER['PHP_SELF'];?>"> <label for="ping">送信先</label>: <input id="ping" type="text" name="ping" size="32"> <br /> <label for="url">固定リンク</label>: <input id="url" type="text" name="url" size="32"> <br /> <label for="title">タイトル</label>: <input id="title" type="text" name="title" size="32"> <br /> <label for="blog_name">ブログ名</label>: <input id="blog_name" type="text" name="blog_name" size="32"> <br /> <label for="excerpt">抜粋、要約</label>: <textarea id="excerpt" name="excerpt" cols="40" rows="4"></textarea> <br /> <input type="submit" name="send" value="TB送信" /><br /> </form> </body> </html>
トラックバック受信
/** * trackbackクラス * * @author 高橋 裕志郎 <yujiro@rakuto.net> * @package trackback * @access public * @version 0.1 */ class trackback { /** * SQLiteハンドル * @var object */ var $dbh = null; /** * タイトル * @var string */ var $title = ''; /** * 概要 * @var string */ var $excerpt = ''; /** * URL * @var string */ var $url= ''; /** * ブログ名 * @var string */ var $blog_name = ''; /** * コンストラクタ * * @access public * @return void **/ function trackback() { $this->dbh = sqlite_open('tb.db', 0666); $this->title = empty($_POST['title'])? '':$_POST['title']; $this->excerpt = empty($_POST['excerpt'])? '':$_POST['excerpt']; $this->url = empty($_POST['url'])? '':$_POST['url']; $this->blog_name = empty($_POST['blog_name'])? '':$_POST['blog_name']; } /** * テーブルの作成 * * @access public * @return integer データ操作結果 */ function create() { $sql = 'CREATE TABLE tb ('. 'id INTEGER NOT NULL,'. 'timestamp TIMESTAMP NOT NULL,'. 'title VARCHAR(255),'. 'excerpt TEXT,'. 'url VARCHAR(255),'. 'blog_name VARCHAR(255),'. 'ip_address VARCHAR(64),'. 'PRIMARY KEY (id)'. ')'; return sqlite_query($sql, $this->dbh); } /** * データ操作設定・実行 * * @access public * @return integer データ操作結果 */ function insert() { // 直接入力 $timestamp = date('Y-m-d H:i:s',time()); $ip_address = $_SERVER['REMOTE_ADDR']; $this->title = sqlite_escape_string($this->title); $this->excerpt = sqlite_escape_string($this->excerpt); $this->url = sqlite_escape_string($this->url); $this->blog_name = sqlite_escape_string($this->blog_name); $sql = 'INSERT INTO '. 'tb ('. 'timestamp,'. 'title,'. 'excerpt,'. 'url,'. 'blog_name,'. 'ip_address'. ') VALUES ('. "'".$timestamp."',". "'".$this->title."',". "'".$this->excerpt."',". "'".$this->url."',". "'".$this->blog_name."',". "'".$ip_address."'". ')'; return sqlite_query($sql, $this->dbh); } } // trackback $obj_tb = new trackback(); $obj_tb->create(); header('Content-type: text/xml; charset=UTF-8', true); echo '<?xml version="1.0" encoding="utf-8"?>'."\r\n"; echo '<response>'."\r\n"; if ($obj_tb->insert()){ echo '<error>1</error>'."\r\n"; } else { echo '<error>0</error>'."\r\n"; echo '<message>Something Bad happened.</message>'."\r\n"; } echo '</response>'."\r\n";
GETを受信した際のPing の一覧表示機能は実装しておりません。
?__mode=rss の機能については技術仕様書等をお読みください。
