/** * 公式p2でレスを書き込む * * @return boolean 書き込み成功なら true、失敗なら false */ function postIt2($host, $bbs, $key, $FROM, $mail, $MESSAGE) { if (P2Util::isHostBe2chNet($host) || !empty($_REQUEST['beres'])) { $beRes = true; } else { $beRes = false; } try { $posted = P2Util::getP2Client()->post($host, $bbs, $key, $FROM, $mail, $MESSAGE, $beRes, $response); } catch (P2Exception $e) { p2die('公式p2ポスト失敗', $e->getMessage()); } if ($posted) { $reload = empty($_POST['from_read_new']); showPostMsg(true, '書きこみが終わりました。', $reload); } else { $result_msg = '公式p2ポスト失敗</p>' . '<pre>' . htmlspecialchars($response['body'], ENT_QUOTES, 'Shift_JIS') . '</pre>' . '<p>-'; showPostMsg(false, $result_msg, false); } return $posted; }
/** * レスを書き込む or 新規スレッドを立てる * スレ立ての場合は、$key は空 '' でよい * * @return boolean 書き込み成功なら true、失敗なら false */ function postIt($host, $bbs, $key, $post) { global $_conf, $post_result, $post_error2ch, $popup, $rescount, $ttitle_en, $STYLE; global $bbs_cgi, $post_cache; $method = "POST"; $bbs_cgi_url = "http://" . $host . $bbs_cgi; $purl = parse_url($bbs_cgi_url); if (isset($purl['query'])) { $purl['query'] = "?" . $purl['query']; } else { $purl['query'] = ""; } // プロキシ if ($_conf['proxy_use']) { $send_host = $_conf['proxy_host']; $send_port = $_conf['proxy_port']; $send_path = $bbs_cgi_url; } else { $send_host = $purl['host']; $send_port = $purl['port']; $send_port = isset($purl['port']) ? $purl['port'] : null; $send_path = $purl['path'] . $purl['query']; } !$send_port and $send_port = 80; $request = $method . " " . $send_path . " HTTP/1.0" . "\r\n"; $request .= "Host: " . $purl['host'] . "\r\n"; $remote_host = P2Util::getRemoteHost($_SERVER['REMOTE_ADDR']); $add_user_info = ''; //$add_user_info = "; p2-client-ip: {$_SERVER['REMOTE_ADDR']}"; //$add_user_info .= "; p2-client-host: {$remote_host}"; $request .= "User-Agent: Monazilla/1.00 (" . $_conf['p2name'] . "/" . $_conf['p2version'] . "{$add_user_info})" . "\r\n"; $request .= 'Referer: http://' . $purl['host'] . '/' . "\r\n"; // クライアントのIPを送信するp2独自のヘッダ $request .= "X-P2-Client-IP: " . $_SERVER['REMOTE_ADDR'] . "\r\n"; $request .= "X-P2-Client-Host: " . $remote_host . "\r\n"; // クッキー $cookies_to_send = ""; // クッキーの読み込み $cookie_file = cachePathForCookie($host); $p2cookies = readCookieFile($cookie_file); if ($p2cookies) { foreach ($p2cookies as $cname => $cvalue) { if ($cname != 'expires') { $cookies_to_send .= " {$cname}={$cvalue};"; } } } // be.2ch 認証クッキー // be板では自動Be書き込みを試みる if (P2Util::isBbsBe2chNet($host, $bbs) || !empty($_REQUEST['submit_beres'])) { $cookies_to_send .= ' MDMD=' . $_conf['be_2ch_code'] . ';'; // be.2ch.netの認証コード(パスワードではない) $cookies_to_send .= ' DMDM=' . $_conf['be_2ch_mail'] . ';'; // be.2ch.netの登録メールアドレス } !$cookies_to_send and $cookies_to_send = ' ;'; $request .= 'Cookie:' . $cookies_to_send . "\r\n"; //$request .= 'Cookie: PON='.$SPID.'; NAME='.$FROM.'; MAIL='.$mail."\r\n"; $request .= "Connection: Close\r\n"; // {{{ POSTの時はヘッダを追加して末尾にURLエンコードしたデータを添付 if (strtoupper($method) == "POST") { $post_enc = array(); while (list($name, $value) = each($post)) { if (!isset($value)) { continue; } // したらば or be.2ch.netなら、EUCに変換 if (P2Util::isHostJbbsShitaraba($host) || P2Util::isHostBe2chNet($host)) { $value = mb_convert_encoding($value, 'eucJP-win', 'SJIS-win'); } $post_enc[] = $name . "=" . urlencode($value); } $postdata = implode("&", $post_enc); $request .= "Content-Type: application/x-www-form-urlencoded\r\n"; $request .= "Content-Length: " . strlen($postdata) . "\r\n"; $request .= "\r\n"; $request .= $postdata; } else { $request .= "\r\n"; } // }}} $maru_kakiko = empty($_POST['maru_kakiko']) ? 0 : 1; setConfUser('maru_kakiko', $maru_kakiko); // 書き込みを一時的に保存 $failed_post_file = P2Util::getFailedPostFilePath($host, $bbs, $key); $cont = serialize($post_cache); DataPhp::writeDataPhp($failed_post_file, $cont, $_conf['res_write_perm']); // WEBサーバへ接続 $fp = fsockopen($send_host, $send_port, $errno, $errstr, $_conf['fsockopen_time_limit']); if (!$fp) { showPostMsg(false, "サーバ接続エラー: {$errstr} ({$errno})<br>p2 Error: 板サーバへの接続に失敗しました", false); return false; } // HTTPリクエスト送信 fputs($fp, $request); $post_seikou = false; // header while (!feof($fp)) { $l = fgets($fp, 8192); // クッキーキタ if (preg_match("/Set-Cookie: (.+?)\r\n/", $l, $matches)) { //echo "<p>".$matches[0]."</p>"; // $cgroups = explode(";", $matches[1]); if ($cgroups) { foreach ($cgroups as $v) { if (preg_match("/(.+)=(.*)/", $v, $m)) { $k = ltrim($m[1]); if ($k != "path") { $p2cookies[$k] = $m[2]; } } } } if ($p2cookies) { $cookies_to_send = ''; foreach ($p2cookies as $cname => $cvalue) { if ($cname != "expires") { $cookies_to_send .= " {$cname}={$cvalue};"; } } $newcokkies = "Cookie:{$cookies_to_send}\r\n"; $request = preg_replace("/Cookie: .*?\r\n/", $newcokkies, $request); } // 転送は書き込み成功と判断 } elseif (preg_match("/^Location: /", $l, $matches)) { $post_seikou = true; } if ($l == "\r\n") { break; } } // クッキーをファイルに保存する saveCookieFile($p2cookies, $cookie_file); // body $response = ''; while (!feof($fp)) { $response .= fread($fp, 164000); } fclose($fp); // be.2ch.net or JBBSしたらば 文字コード変換 EUC→SJIS if (P2Util::isHostBe2chNet($host) || P2Util::isHostJbbsShitaraba($host)) { $response = mb_convert_encoding($response, 'SJIS-win', 'eucJP-win'); //<META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> $response = preg_replace("{(<head>.*<META http-equiv=\"Content-Type\" content=\"text/html; charset=)EUC-JP(\">.*</head>)}is", "\$1Shift_JIS\$2", $response); } $kakikonda_match = "/<title>.*(書きこみました|■ 書き込みました ■|書き込み終了 - SubAll BBS).*<\\/title>/is"; $cookie_kakunin_match = "/<!-- 2ch_X:cookie -->|<title>■ 書き込み確認 ■<\\/title>|>書き込み確認。</"; if (eregi("(<.+>)", $response, $matches)) { $response = $matches[1]; } // カキコミ成功 if (preg_match($kakikonda_match, $response, $matches) or $post_seikou) { // クッキーの書き込み自動保存を消去する isset($_COOKIE['post_msg']) and setcookie('post_msg', '', time() - 3600); $reload = empty($_POST['from_read_new']); showPostMsg(true, '書きこみが終わりました。', $reload); // 投稿失敗記録があれば削除する if (file_exists($failed_post_file)) { unlink($failed_post_file); } return true; //$response_ht = htmlspecialchars($response, ENT_QUOTES); //echo "<pre>{$response_ht}</pre>"; // ■cookie確認(post再チャレンジ) } elseif (preg_match($cookie_kakunin_match, $response, $matches)) { $htm['more_hidden_post'] = ''; $more_hidden_keys = array('newthread', 'submit_beres', 'from_read_new', 'maru_kakiko', 'csrfid', 'k', 'b'); foreach ($more_hidden_keys as $hk) { if (isset($_POST[$hk])) { $value_hd = htmlspecialchars($_POST[$hk], ENT_QUOTES); $htm['more_hidden_post'] .= "<input type=\"hidden\" name=\"{$hk}\" value=\"{$value_hd}\">\n"; } } $form_pattern = '/<form method=\\"?POST\\"? action=\\"?\\.\\.\\/test\\/(sub)?bbs\\.cgi(?:\\?guid=ON)?\\"?>/i'; $myname = basename($_SERVER['SCRIPT_NAME']); $form_replace = <<<EOFORM <form method="POST" action="{$myname}" accept-charset="{$_conf['accept_charset']}"> <input type="hidden" name="detect_hint" value="◎◇"> <input type="hidden" name="host" value="{$host}"> <input type="hidden" name="popup" value="{$popup}"> <input type="hidden" name="rescount" value="{$rescount}"> <input type="hidden" name="ttitle_en" value="{$ttitle_en}"> <input type="hidden" name="sub" value="\$1"> {$htm['more_hidden_post']} EOFORM; $response = preg_replace($form_pattern, $form_replace, $response); $h_b = explode("</head>", $response); // HTMLプリント echo $h_b[0]; if (!$_conf['ktai']) { include_once './style/style_css.inc'; include_once './style/post_css.inc'; } if ($popup) { $mado_okisa = explode(',', $STYLE['post_pop_size']); $mado_okisa_x = $mado_okisa[0]; $mado_okisa_y = $mado_okisa[1] + 200; echo <<<EOSCRIPT <script language="JavaScript"> <!-- resizeTo({$mado_okisa_x},{$mado_okisa_y}); // --> </script> EOSCRIPT; } echo "</head>"; echo $h_b[1]; return false; // その他はレスポンスをそのまま表示(結果はエラーとしてfalseを返す) } else { $response = ereg_replace('こちらでリロードしてください。<a href="\\.\\./[a-z]+/index\\.html"> GO! </a><br>', "", $response); echo $response; return false; } }