[PHP] 2chのトリップを計算する

2chのトリップをPHPで計算する方法です。#に続いて文字列を入れると、暗号化された10桁もしくは12桁の文字列が算出されます。これをトリップといいます。このプログラムはそれを計算します。日本語文字列を含めて、テストでは期待した結果が得られていますが、完全に互換かどうかはわかりません。以下はCakePHPから利用した例です。

スポンサードリンク

	function index(){
		Configure::write('debug', 2);

		// set key
		$key = '#istrip';

		// UTF-8 to SJIS
		$key = mb_convert_encoding($key, "SJIS", "UTF-8");	// to, from

		// exec
		$ret = $this->_makeTrip($key);

		// debug
		debug($ret);
	}

	/*-----------------------------------------------------
	 * make 2ch TRIP ( = DES ) by CASEY.JP 2010 GPL
	 *-----------------------------------------------------
	 * VERSION:
	 *   2010.08.17 0.01 alpha
	 * NOTE:
	 *   digit  8: -2002.10.03
	 *   digit 10: 2002.10.03-
	 *   digit 12: 2009.06.19-
	 * test data for digit 10:
	 *   $key = "#テスト";				// ◆SQ2Wyjdi7M
	 *   $key = '#Wikipedia';			// ◆Ig9vRBfuyA
	 *   $key = '#istrip';				// ◆/WG5qp963c
	 * test data for digit 12:
	 *   $key = '#TESTTESTTESTTEST';	// ◆TDxLX5/h3FIK
	 *   $key = '#テストテストテスト';	// ◆Iwo2kAiiMPp6
	 * SJIS CODE in SCRIPT
	 */
	function _makeTrip($key){
		// check
		preg_match('|^#(.*)$|', $key, $keys);
		if(empty($keys[1])) return false;
		$key = $keys[1];

		// start
		if(strlen($key) >= 12){
			 // digit 12
			$mark = substr($key, 0, 1);
			if($mark == '#' || $mark == '$'){
				if(preg_match('|^#([[:xdigit:]]{16})([./0-9A-Za-z]{0,2})$|', $key, $str)){
					$trip = substr(crypt(pack('H*', $str[1]), "$str[2].."), -10);
				}else{
					// ext
					$trip = '???';
				}
			}else{
				$trip = substr(base64_encode(sha1($key, TRUE)), 0, 12);
				$trip = str_replace('+', '.', $trip);
			}
		}else{
			// digit 10
			$tripkey = htmlspecialchars($key, ENT_QUOTES);
			$salt = htmlspecialchars($key, ENT_QUOTES);
			$salt = substr($tripkey . 'H.', 1, 2);

			$pattern = '/[\x00-\x20\x7B-\xFF]/';
			$salt = preg_replace($pattern, ".", $salt);

			$patterns = ":;<=>?@[\\]^_`";
			$mach = "ABCDEFGabcdef";

			for($i=0; $i<=13-1; $i++){
				$salt = str_replace($patterns[$i], $mach[$i], $salt);
			}

			$trip = crypt($tripkey, $salt);
			$trip = substr($trip, -10);
		}
		$trip = '◆'.$trip;
		return $trip;
	}

参考文献

  • トリップ (電子掲示板) – Wikipedia :
    http://ja.wikipedia.org/wiki/%E3%83%88%E3%83%AA%E3%83%83%E3%83%97_(%E9%9B%BB%E5%AD%90%E6%8E%B2%E7%A4%BA%E6%9D%BF)
  • 2ちゃんねる準拠トリップにての全角文字 – PHPプロ!Q&A掲示板 :
    http://www.phppro.jp/qa/1166#5082
  • PHP 2chBBS 『改造情報』 :
    http://script.s16.xrea.com/2ch/test/read.php/php/1048578946/
  • 希望の12桁トリップはこちら :
    http://toki.2ch.net/test/read.cgi/qa/1245386094/

関連記事

スポンサードリンク

Comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です