[P2-php-svn] [756] expack:

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 1月 1日 (金) 17:33:36 JST


Revision: 756
          http://sourceforge.jp/projects/p2-php/svn/view?view=rev&revision=756
Author:   rsk
Date:     2010-01-01 17:33:35 +0900 (Fri, 01 Jan 2010)

Log Message:
-----------
expack:
- 公式p2を使った書き込み/dat取得における潜在的なバグを修正。
- P2ClientクラスとThreadReadクラスをリファクタリング。

Modified Paths:
--------------
    p2ex/trunk/lib/P2Client.php
    p2ex/trunk/lib/ThreadRead.php


-------------- next part --------------
Modified: p2ex/trunk/lib/P2Client.php
===================================================================
--- p2ex/trunk/lib/P2Client.php	2009-12-31 18:52:34 UTC (rev 755)
+++ p2ex/trunk/lib/P2Client.php	2010-01-01 08:33:35 UTC (rev 756)
@@ -40,7 +40,7 @@
     const REQUEST_PARAMETER_BBS     = 'bbs';
     const REQUEST_PARAMETER_KEY     = 'key';
     const REQUEST_PARAMETER_LS      = 'ls';
-    const REQUEST_PARAMETER_FROM    = 'FROM';
+    const REQUEST_PARAMETER_NAME    = 'FROM';
     const REQUEST_PARAMETER_MAIL    = 'mail';
     const REQUEST_PARAMETER_MESSAGE = 'MESSAGE';
     const REQUEST_PARAMETER_POPUP   = 'popup';
@@ -208,13 +208,13 @@
     public function readThread($host, $bbs, $key, $ls = '1', &$response = null)
     {
         $getData = array(
-            self::REQUEST_PARAMETER_HOST => (string)$host,
-            self::REQUEST_PARAMETER_BBS  => (string)$bbs,
-            self::REQUEST_PARAMETER_KEY  => (string)$key,
-            self::REQUEST_PARAMETER_LS   => (string)$ls,
+            self::REQUEST_PARAMETER_HOST => rawurlencode($host),
+            self::REQUEST_PARAMETER_BBS  => rawurlencode($bbs),
+            self::REQUEST_PARAMETER_KEY  => rawurlencode($key),
+            self::REQUEST_PARAMETER_LS   => rawurlencode($ls),
         );
         $uri = self::P2_ROOT_URI . self::SCRIPT_NAME_READ;
-        $response = $this->httpGet($uri, $getData);
+        $response = $this->httpGet($uri, $getData, true);
         $dom = new P2DOM($response['body']);
 
         if ($form = $this->getLoginForm($dom)) {
@@ -262,24 +262,24 @@
         // –³‚¢ê‡‚ÍdatŽæ“¾Œ ŒÀ‚ª‚ ‚é‚à‚Ì‚Æ‚·‚éB
         // datŽæ“¾Œ ŒÀ‚ª‚È‚¢ê‡‚⃂ƒŠƒ^ƒ|’Ê’ ‚ÌŽc‚‚ª‘«‚è‚È‚¢ê‡‚̏ˆ—‚Í’[Ü‚éB
         $dom = new P2DOM($html);
-        $expression = './/a[contains(@href, "' . self::SCRIPT_NAME_READ . '")'
+        $expression = './/a[contains(@href, "' . self::SCRIPT_NAME_READ . '?")'
                     . ' and contains(@href, "&moritapodat=")]';
         $result = $dom->query($expression);
         if ($result instanceof DOMNodeList && $result->length > 0) {
             $anchor = $result->item(0);
             $uri = self::P2_ROOT_URI
-                 . substr($anchor->getAttribute('href'), self::SCRIPT_NAME_READ);
+                 . strstr($anchor->getAttribute('href'), self::SCRIPT_NAME_READ);
             $response = $this->httpGet($uri);
         }
 
         // dat‚ðŽæ“¾‚·‚éB
         $getData = array(
-            self::REQUEST_PARAMETER_HOST => (string)$host,
-            self::REQUEST_PARAMETER_BBS  => (string)$bbs,
-            self::REQUEST_PARAMETER_KEY  => (string)$key,
+            self::REQUEST_PARAMETER_HOST => rawurlencode($host),
+            self::REQUEST_PARAMETER_BBS  => rawurlencode($bbs),
+            self::REQUEST_PARAMETER_KEY  => rawurlencode($key),
         );
         $uri = self::P2_ROOT_URI . self::SCRIPT_NAME_DAT;
-        $response = $this->httpGet($uri, $getData);
+        $response = $this->httpGet($uri, $getData, true);
 
         if (strpos($response['body'], self::NEEDLE_DAT_NO_DAT) !== false) {
             return null;
@@ -297,7 +297,7 @@
      * @param string $host
      * @param string $bbs
      * @param string $key
-     * @param string $from
+     * @param string $name
      * @param string $mail
      * @param string $message
      * @param bool $beRes
@@ -305,7 +305,7 @@
      * @return bool
      * @throws P2Exception
      */
-    public function post($host, $bbs, $key, $from, $mail, $message,
+    public function post($host, $bbs, $key, $name, $mail, $message,
                          $beRes = false, &$response = null)
     {
         // csrfId‚ðŽæ“¾‚µA‚©‚ÂŒöŽ®p2‚ÌŠù“Ç‚ðÅV‚̏ó‘Ô‚É‚·‚邽‚߁A‚Ü‚¸ read.php ‚ð’@‚­B
@@ -317,36 +317,49 @@
         }
 
         $dom = new P2DOM($html);
-        if ($form = $this->getPostForm($dom)) {
-            $uri = self::P2_ROOT_URI . self::SCRIPT_NAME_POST;
+        $form = $this->getPostForm($dom);
+        if ($form === null) {
+            throw new P2Exception('Post form not found.');
+        }
 
-            $postData = $this->getFormValues($dom, $form);
-            $postData[self::REQUEST_PARAMETER_POPUP]   = '1';
-            $postData[self::REQUEST_PARAMETER_FROM]    = rawurlencode($from);
-            $postData[self::REQUEST_PARAMETER_MAIL]    = rawurlencode($mail);
-            $postData[self::REQUEST_PARAMETER_MESSAGE] = rawurlencode($message);
-            if ($beRes) {
-                $postData[self::REQUEST_PARAMETER_BERES] = '1';
-            } elseif (array_key_exists(self::REQUEST_PARAMETER_BERES, $postData)) {
-                unset($postData[self::REQUEST_PARAMETER_BERES]);
-            }
+        $uri = self::P2_ROOT_URI . self::SCRIPT_NAME_POST;
 
-            $response = $this->httpPost($uri, $postData, true);
+        // CookieŠm”FŒã‚ÌPOST‚Å‚Ì•¶Žš‰»‚¯—\–h‚Ì‚½‚ß
+        // URLƒGƒ“ƒR[ƒhÏ‚Ý‚Ì’l‚ð—pˆÓ‚µ‚Ä‚¨‚¢‚čđã“ü‚·‚éB
+        $nameEncoded = rawurlencode($name);
+        $mailEncoded = rawurlencode($mail);
+        $messageEncoded = rawurlencode($message);
 
-            if (preg_match(self::REGEX_POST_COOKIE, $response['body'])) {
-                $dom = new P2DOM($response['body']);
-                $expression = './/form[contains(@action, "' . self::SCRIPT_NAME_POST . '")]';
-                $result = $dom->query($expression);
-                if ($result instanceof DOMNodeList && $result->length > 0) {
-                    $postData = $this->getFormValues($dom, $result->item(0));
-                    $response = $this->httpPost($uri, $postData, true);
-                }
+        // POST‚·‚éƒf[ƒ^‚ð—pˆÓB
+        $postData = $this->getFormValues($dom, $form);
+        $postData[self::REQUEST_PARAMETER_POPUP] = '1';
+        $postData[self::REQUEST_PARAMETER_NAME] = $nameEncoded;
+        $postData[self::REQUEST_PARAMETER_MAIL] = $mailEncoded;
+        $postData[self::REQUEST_PARAMETER_MESSAGE] = $messageEncoded;
+        if ($beRes) {
+            $postData[self::REQUEST_PARAMETER_BERES] = '1';
+        } elseif (array_key_exists(self::REQUEST_PARAMETER_BERES, $postData)) {
+            unset($postData[self::REQUEST_PARAMETER_BERES]);
+        }
+
+        // POSTŽÀsB
+        $response = $this->httpPost($uri, $postData, true);
+
+        // CookieŠm”F‚̏ꍇ‚͍ÄPOSTB
+        if (preg_match(self::REGEX_POST_COOKIE, $response['body'])) {
+            $dom = new P2DOM($response['body']);
+            $expression = './/form[contains(@action, "' . self::SCRIPT_NAME_POST . '")]';
+            $result = $dom->query($expression);
+            if ($result instanceof DOMNodeList && $result->length > 0) {
+                $postData = $this->getFormValues($dom, $result->item(0));
+                $postData[self::REQUEST_PARAMETER_NAME] = $nameEncoded;
+                $postData[self::REQUEST_PARAMETER_MAIL] = $mailEncoded;
+                $postData[self::REQUEST_PARAMETER_MESSAGE] = $messageEncoded;
+                $response = $this->httpPost($uri, $postData, true);
             }
+        }
 
-            return (bool)preg_match(self::REGEX_POST_SUCCESS, $response['body']);
-        } else {
-            throw new P2Exception('Post form not found.');
-        }
+        return (bool)preg_match(self::REGEX_POST_SUCCESS, $response['body']);
     }
 
     // }}}
@@ -448,16 +461,19 @@
      * @param P2DOM $dom
      * @param DOMElement $form
      * @param array $data
+     * @param bool $raw
      * @return array
      */
     protected function getFormValues(P2DOM $dom, DOMElement $form,
-                                     array $data = array())
+                                     array $data = array(), $raw = false)
     {
         $fields = $dom->query('.//input[@name and @value]', $form);
         foreach ($fields as $field) {
             $name = $field->getAttribute('name');
             $value = $field->getAttribute('value');
-            $value = rawurlencode(mb_convert_encoding($value, 'SJIS-win', 'UTF-8'));
+            if (!$raw) {
+                $value = rawurlencode(mb_convert_encoding($value, 'SJIS-win', 'UTF-8'));
+            }
             $data[$name] = $value;
         }
 

Modified: p2ex/trunk/lib/ThreadRead.php
===================================================================
--- p2ex/trunk/lib/ThreadRead.php	2009-12-31 18:52:34 UTC (rev 755)
+++ p2ex/trunk/lib/ThreadRead.php	2010-01-01 08:33:35 UTC (rev 756)
@@ -1290,9 +1290,13 @@
      */
     public function scanOriginalHosts()
     {
-        if (file_exists($this->keydat) && $dat = file_get_contents($this->keydat)) {
+        if (P2Util::isHost2chs($this->host) &&
+            file_exists($this->keydat) &&
+            ($dat = file_get_contents($this->keydat)))
+        {
             $bbs_re = preg_quote($this->bbs, '@');
-            if (preg_match_all("@/(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/test/read\\.cgi)?/{$bbs_re}\\b@", $dat, $matches, PREG_PATTERN_ORDER)) {
+            $pattern = "@/(\\w+\\.(?:2ch\\.net|bbspink\\.com))(?:/test/read\\.cgi)?/{$bbs_re}\\b@";
+            if (preg_match_all($pattern, $dat, $matches, PREG_PATTERN_ORDER)) {
                 $hosts = array_unique($matches[1]);
                 $arKey = array_search($this->host, $hosts);
                 if ($arKey !== false && array_key_exists($arKey, $hosts)) {



P2-php-svn メーリングリストの案内
Back to archive index