header

PHPでトラックバックを送信する

(1/2)

ブログでは、記事の引用通知などのコミュニケーションを行うためにトラックバックという仕組みが用意されている。 しかし、ぱふぅ家のホームページはブログツールを使っていないため、このような仕組みが用意されていない。 そこで、トラックバックを送信する仕組みをPHPで実装することにした。

0001: <?php
0002: // ここからPHPプログラム =======================================================
0003: /** SendTrackBack.php
0004:  * トラックバックを送る
0005:  * @copyright   (c)studio pahoo
0006:  * @author      パパぱふぅ
0007:  * @version     1.0  2005/08/13
0008:  *
0009: */
0010: 
0011: /**
0012:  * トラックバックを送る
0013:  * @param   String $server  送信先サーバのURL
0014:  * @param   String $name    ブログ名/サイト名
0015:  * @param   String $title   記事タイトル
0016:  * @param   String $excerpt 記事概要
0017:  * @param   String $url     記事URL
0018:  * @return  int エラーコード
0019:  *                  0  = 正常終了
0020:  *                (-1) = サーバURLが不正が見つからない
0021:  *              その他 = サーバからのエラーコード
0022: */
0023: function SendTrackBack($server, $name, $title, $excerpt, $url) {
0024:     //送信先サーバURLをホスト名とパス名に分解する
0025:     $arr = parse_url($server);
0026:     $host = $arr["host"];       //ホスト名
0027:     $path = $arr["path"];       //パス名
0028:     if ($host == "")    return (-1);
0029: 
0030:     //送信先サーバをオープンする
0031:     $sock = fsockopen($host, 80, $errno, $errstr, 60);
0032:     if ($sock == FALSE)     return (-1);
0033: 
0034:     //トラックバック文字列をつくる
0035:     $str =  "title=" . urlencode($title);
0036:     $str .= "&url="  . urlencode($url);
0037:     $str .= "&blog_name=" . urlencode($name);
0038:     $str .= "&excerpt=" . urlencode($excerpt);
0039: 
0040:     //送信する
0041:     fputs($sock, "POST " . $path . " HTTP/1.1\r\n");
0042:     fputs($sock, "Host: $host\r\n");
0043:     fputs($sock, "Content-type: application/x-www-form-urlencoded\r\n");
0044:     fputs($sock, "Content-length: " . strlen($str) . "\r\n");
0045:     fputs($sock, "\r\n");
0046:     fputs($sock, "$str\r\n");
0047: 
0048:     //リターンを受け取る
0049:     $res = "";
0050:     while (!feof($sock))    $res .= fgetc($sock);
0051: 
0052:     fclose($sock);
0053: 
0054:     //リターンからエラーコードを解釈する
0055:     preg_match("/(\<\?xml)(.*)(\<\/response\>)/s", $res, $arr);
0056:     $res = preg_replace("/UTF-8/i", "utf-8", $arr[0]);  //コーディング文字の置換
0057: 
0058:     $dom = domxml_open_mem($res);
0059:     $element = $dom->get_elements_by_tagname("response");
0060:     $error = $element[0]->get_elements_by_tagname("error");
0061: 
0062:     return $error[0]->get_content();
0063: }
0064: 
0065: 
0066: //初回起動時
0067: if (isset($_POST["SERVER"]) == FALSE) {
0068: $myself = basename($_SERVER["PHP_SELF"]);
0069: 
0070: // ここまでPHPプログラム =======================================================
0071: ?>
0072: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0073:  "http://www.w3.org/TR/html4/loose.dtd">
0074: <html lang="ja">
0075: <head>
0076: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0077: <title>トラックバック送信</title>
0078: </head>
0079: <body>
0080: 
0081: <h1>■トラックバック送信</h1>
0082: <form method="post" action="<?= $myself ?>">
0083: <table border="0">
0084: <tr>
0085: <td>サーバURL入力</td>
0086: <td><input name="SERVER" type="text" size="100" /></td>
0087: </tr>
0088: <tr>
0089: <td>ブログ/サイト名</td>
0090: <td><input name="NAME" type="text" size="40" /></td>
0091: </tr>
0092: <tr>
0093: <td>記事タイトル</td>
0094: <td><input name="TITLE" type="text" size="40" /></td>
0095: </tr>
0096: <tr>
0097: <td>記事内容</td>
0098: <td><textarea name="EXCERPT" rows="10" cols="80"></textarea></td>
0099: </tr>
0100: <tr>
0101: <td>記事URL</td>
0102: <td><input name="URL" type="text" size="100" /></td>
0103: </tr>
0104: <tr>
0105: <td></td>
0106: <td align="center"><input type="submit" name="Submit" value="送信" /></td>
0107: </tr>
0108: </table>
0109: </form>
0110: </body>
0111: </html>
0112: 
0113: <?php
0114: // ここからPHPプログラム =======================================================
0115: } else {
0116: $name    = stripslashes($_POST["NAME"]);
0117: $title   = stripslashes($_POST["TITLE"]);
0118: $excerpt = stripslashes($_POST["EXCERPT"]);
0119: $url     = stripslashes($_POST["URL"]);
0120: $server  = stripslashes($_POST["SERVER"]);
0121: 
0122: $res = SendTrackBack($server, $name, $title, $excerpt, $url);
0123: 
0124: switch ($res) {
0125:     case 0:
0126:         echo "トラックバックを送信しました";
0127:         break;
0128:     case (-1):
0129:         echo "サーバURLが間違っていませんか?";
0130:         break;
0131:     default:
0132:         echo "エラーコード:$res";
0133: }
0134: }
0135: ?>
0136: 

プログラムを実行する