Advertisement
Guest User

[rep2] findproxy for ttsearch

a guest
Jan 16th, 2015
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.44 KB | None | 0 0
  1. <?php
  2. /* このfindproxyを使用するためにはview.inc.phpの差し替えも必要です */
  3. // {{{ findproxy() for ttsearch v1.0
  4.  
  5.  
  6. function findproxy($query)
  7. {
  8.     require_once './simplehtmldom/simple_html_dom.php';
  9.     global $_conf;
  10.     mb_internal_encoding('CP932');
  11.  
  12.     $kurl = 'http://ttsearch.net/s.cgi';
  13.     $url = 'http://ttsearch.net/s2.cgi';
  14.     parse_str($query, $query_array);                // UTF-8
  15.  
  16. /*  
  17.     $quary parameters from tgrepc.php
  18.         q = $_GET['Q'];                     // query
  19.         n                           // limit
  20.         s = $_GET['S'];                     // host     ex) pc.2ch.net
  21.         b = $_GET['B'];                     // bbs      ex) mac
  22.         c = $_GET['C'];                     // category
  23.         p = $_GET['P'];                     // page
  24.         ib                          // board id. (integer bbs)
  25.         i = $_GET['i'];                     // bool for cache
  26.  
  27.     $query parameters at ttsearch
  28.         k = query
  29.         S = start num                       // !conflict
  30.         N = last num
  31.         L = time length
  32.         M = res. num
  33.         s = server
  34.         bn= board
  35.         o = order                       // ex) r = "更新順", F = "勢い降順", f = "勢い昇順"
  36.         v = setting num                     // ttsearch指定数値
  37.         i                           // i=t 軽量版表示 !conflict
  38. */
  39. // {{{ 準備
  40.     $n = $i = $j = $k = 0;
  41.     $maximum = 1000;
  42.  
  43.     $q_array = array();
  44.     $kq_array['k'] = $q_array['k'] = mb_convert_encoding($query_array['q'], 'CP932', 'UTF-8');                              // CP932化 (内部授受は全てUTF-8)
  45.     $kq_array['S'] = 0;
  46.     $kq_array['N'] = 0;
  47.     $kq_array['o'] = 'r';
  48.  
  49.     ini_set('arg_separator.output', '&');
  50.     $kq = http_build_query($kq_array);
  51.     ini_set('arg_separator.output', '&amp;');
  52.  
  53. /* 件数検索 */
  54.     $client = new HTTP_Client();
  55.     $client->setDefaultHeader('User-Agent', 'p2-tgrep-client');
  56.     $code = $client->get($kurl . '?' . $kq);
  57.  
  58.     if (PEAR::isError($code)) {
  59.         p2die($code->getMessage());
  60.     } elseif ($code != 200) {
  61.         p2die("HTTP Error - {$code}");
  62.     }
  63.     $response = $client->currentResponse();
  64.     $result['modified'] = $response['headers']['date'];
  65.     $dom = str_get_html(urldecode($response['body']));
  66.     foreach ($dom->find('div', 0) as $element) {
  67.         $hits = mb_convert_encoding($element->plaintext, 'CP932', 'UTF-8');
  68.         if (ereg('([0-9]+)件', $hits, $num)){
  69.             $result['profile']['hits'] = $num[1];
  70.             if ($num[1] > $maximum){
  71.  
  72. /* いずれは一部分だけ抽出して表示できるようにする ( 現時点ではエラー終了 ) */
  73.                 $result['profile']['hits'] = 0;
  74.                 $result['profile']['alert'] = new stdClass;
  75.                 $result['profile']['alert']->over = true;
  76.                 $result['profile']['alert']->message = mb_convert_encoding('検索結果が' . $maximum . '件を超えたため検索を中止します (総計' . $num[1] . 'hit!)', 'UTF-8', 'CP932');
  77.                 $result['threads'] = array();
  78.  
  79.                 return $result;
  80. //              break;
  81.             }
  82.         }
  83.     }
  84.     unset($client, $code, $response, $dom, $element, $hits, $num);
  85.  
  86. /* S/Nは取得用s2cgiでは機能しない */
  87.     $q_array['S'] = $query_array['p'] > 0 ? $query_array['n'] * ($query_array['p'] - 1) : 0;
  88.     $q_array['N'] = $query_array['p'] > 0 ? $query_array['n'] * $query_array['p'] : $query_array['n'];
  89.  
  90.     $q_array['o'] = 'F';        // 既定値
  91.     $q_array['v'] = 2975;       // 全部表示 かつ 2ch以外も表示
  92.  
  93.     ini_set('arg_separator.output', '&');
  94.     $q = http_build_query($q_array);
  95.     ini_set('arg_separator.output', '&amp;');
  96. // }}}
  97. // {{{ 検索実行
  98.     $client = new HTTP_Client();
  99.     $client->setDefaultHeader('User-Agent', 'p2-tgrep-client');
  100.     $code = $client->get($url . '?' . $q);
  101.  
  102.     if (PEAR::isError($code)) {
  103.         p2die($code->getMessage());
  104.     } elseif ($code != 200) {
  105.         p2die("HTTP Error - {$code}");
  106.     }
  107.     $response = $client->currentResponse();
  108. //  if($result['profile']['alert']->over){
  109. //      return $result;
  110. //  }eles{
  111.         $dom = str_get_html(urldecode($response['body']));
  112. //  }
  113. // }}}
  114. // {{{ カテゴリ・板読み込み
  115.     $brd_menus_dir = BrdCtl::read_brd_dir();
  116.     $brd_menus_online = BrdCtl::read_brd_online();
  117.     $brd_menus = array_merge($brd_menus_dir, $brd_menus_online);
  118.  
  119.     $result['profile']['categories'] = array();
  120.     $result['profile']['boards'] = array();
  121.  
  122.     $m = $n = 1;
  123.     foreach ($brd_menus as $aBrdMenu){
  124.         foreach ($aBrdMenu->categories as $aBrdMenuCate){
  125.             $aBrdMenuCate->id = $m;
  126.             $result['profile']['categories'][$m] = clone $aBrdMenuCate;
  127.             $result['profile']['categories'][$m]->name = mb_convert_encoding(p2h($aBrdMenuCate->name), 'UTF-8', 'CP932');
  128.             $result['profile']['categories'][$m]->hits = 0;
  129.             foreach ($aBrdMenuCate->menuitas as $aBrdMenuIta){
  130.                 $result['profile']['boards'][$n] = clone $aBrdMenuIta;
  131.                 $result['profile']['boards'][$n]->name = $pb_array[$n] = mb_convert_encoding(p2h($aBrdMenuIta->itaj), 'UTF-8', 'CP932');
  132.                 $result['profile']['boards'][$n]->hits = 0;
  133.                 $n++;
  134.             }
  135.             $m++;
  136.         }
  137.     }
  138.     unset($aBrdMenu, $aBrdMenuCate, $aBrdMenuIta);
  139.     $pbf_array = array_flip($pb_array);
  140. // }}}
  141. // {{{ 結果処理
  142.     $i = 0;
  143.     foreach ($dom->find('div') as $sub_dom) {
  144.         $element = $sub_dom->find('a.title', 0);
  145.  
  146.         if ($result['profile']['alert']->over && $i > $maximum){
  147. //          $result['profile']['totalhits'] = $result['profile']['hits'];
  148. //          $result['profile']['hits'] = $i;
  149.             break;
  150.         }elseif (ereg('^http://[A-Za-z0-9]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){
  151.             $urls = parse_url($element->href);
  152.             $bbs = $tkey = '';
  153.             if (ereg('^/test/read\.cgi/([0-9A-Za-z]+)/([0-9]+)/.*', $urls['path'], $hits)){
  154.                 $bbs = $hits[1];
  155.                 $tkey = $hits[2];
  156.             }
  157.             $result['threads'][$i] = new stdClass;
  158.             $result['threads'][$i]->bbs   = $bbs;
  159.             $result['threads'][$i]->host  = $urls['host'];
  160.             $result['threads'][$i]->ita   = $itaj = mb_convert_encoding(BbsMap::getBbsName($urls['host'], $bbs), 'UTF-8', 'CP932');
  161.  
  162.             $result['profile']['boards'][$pbf_array[$itaj]]->hits++;
  163.  
  164. // カウントが終わって範囲外なら次へ
  165.             if ($i >= $q_array['N'] || $i < $q_array['S']){
  166.                 unset($result['threads'][$i]);
  167.                 $i++;
  168.                 continue;
  169.             }else{
  170.                 $result['threads'][$i]->tkey  = $tkey;
  171.                 $title = preg_replace('/<span.*>(.*)<\/span>/', '$1' , $element->innertext);
  172.                 $result['threads'][$i]->title = mb_convert_encoding($title, 'UTF-8', 'CP932');
  173.                 $speed = $sub_dom->find('span.speed', 0)->plaintext;
  174.                 $pattern = preg_split('/\|/', mb_convert_encoding('日|週|年', 'UTF-8', 'CP932'));
  175.                 $replacement = array('d', 'w', 'y');
  176.                 for ($j=0; $j<sizeof($pattern); $j++) {
  177.                     $speed = mb_ereg_replace($pattern[$j], $replacement[$j], $speed);
  178.                 }
  179.                 if (ereg('\(([0-9.]+)\/([dwy])\)', $speed, $hits)){
  180.                     switch ($hits[2]){
  181.                         case 'd': $result['threads'][$i]->dayres = $hits[1]; break;
  182.                         case 'w': $result['threads'][$i]->dayres = $hits[1] / 7; break;
  183.                         case 'y': $result['threads'][$i]->dayres = $hits[1] / 365; break;
  184.                     }
  185.                 }
  186.  
  187.                 $length = $sub_dom->find('span.length', 0);
  188.                 if (ereg('\(([0-9]+)\)', $length->plaintext, $hits)){
  189.                     $result['threads'][$i]->resnum = $hits[1];
  190.                 }
  191.                 $i++;
  192.             }
  193.         }
  194.     }
  195.     unset($dom, $sub_dom);
  196.     if(!$i){ $result['threads'] = 1; unset($i); }
  197.  
  198.     $keyword = explode(" ", $query_array['q']);
  199.     $result['profile']['regex'] = '/(' . mb_convert_kana($keyword[0], 'AK', 'UTF-8') . '|'. mb_convert_kana($keyword[0], 'ak', 'UTF-8') . ')/i';
  200.  
  201. /* 複数クエリのカラーリングのための配列化だがtgrepc.phpの編集が必要
  202.     for ($k=0; $k<sizeof($keyword); $k++){
  203.         $result['profile']['regex'][$k] = '/(' . mb_convert_kana($keyword[$k], 'AK') . '|'. mb_convert_kana($keyword[$k], 'ak') . ')/i';
  204.     }
  205. */
  206. // 後始末
  207.  
  208.     $m = $n = 1;
  209.     foreach ($brd_menus as $aBrdMenu){
  210.         foreach ($aBrdMenu->categories as $aBrdMenuCate){
  211.             foreach ($aBrdMenuCate->menuitas as $aBrdMenuIta){
  212.                 $result['profile']['categories'][$m]->hits += $result['profile']['boards'][$n]->hits;
  213.                 $result['profile']['categories'][$m]->member[] = $n;
  214.                 if ($result['profile']['boards'][$n]->hits == 0){
  215.                    unset($result['profile']['boards'][$n]);
  216.                 }
  217.             $n++;
  218.             }
  219.             if ($result['profile']['categories'][$m]->hits == 0) {
  220.                 unset($result['profile']['categories'][$m]);
  221.             }
  222.         $m++;
  223.         }
  224.     }
  225.     unset($brd_menus, $m, $n);
  226.  
  227. // }}}
  228.     return $result;
  229.  
  230. // デバッグ用関数
  231. }
  232.  
  233. function dp($obj, $to_coding, $fr_coding){
  234.     if ( gettype($obj) == 'boolean' || gettype($obj) == 'integer' || gettype($obj) == 'double' || gettype($obj) == 'string' ){
  235.         if (isset($to_coding) && isset($fr_coding)){
  236.             mb_convert_variables($to_coding, $fr_coding, $obj);
  237.         }
  238.         print_r($obj . '<br />');
  239.     }else{
  240.         foreach ($obj as $n => $b){
  241.             if (isset($to_coding) && isset($fr_coding)){
  242.                 mb_convert_variables($to_coding, $fr_coding, $b);
  243.             }
  244.             print_r($n . '<b> => </b>' . $b . '<br />');
  245.         }
  246.     }
  247.     return void;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement