rep2のtGrepが使えなくなってた

この記事は2年以上前に書いたものです。
そのため情報が古い可能性があります。ご了承ください。m(_ _)m

無いとかなり不便なので、find..netの結果を変換するスクリプトを書いてみました。
(かなり適当。。。)
#自宅のサーバ上で動作することは確認しましたが、
#他で動くかは未確認。(, , OS Xでも動くとコメント有り。)


【2011/11/07 20:58 追記】
Simple HTML DOM ParserのVersionによっては動作しないとコメント頂きました。
v1.5では白紙状態になるそうです。。v1.11だとOK。
自分で確認した時もv1.11で確認。
【2011/12/29 17:12 追記】 v1.5でも問題ないとか。他要因かな。


【2011/05/07 00:17 追記】
rep2 part51 でバグってると言われる。ゴメンナサイ・・m(_ _)m

799 :名無しさん@お腹いっぱい。:2011/05/05(木) 12:06:27.86 ID:jp3/MRoa0
>>746の方法でtgrepは使えるようになったんだけど、実際の結果が違う場合がある
例えば「muteki」で検索すると、find.2ch.netでは14件だがtgrepは1件のみ。
bbspinkを含む場合は上手く動かないのかな?それとも俺だけですか?

・・・

809 :名無しさん@お腹いっぱい。:2011/05/05(木) 15:50:46.97 ID:0VScl8/m0
まぁBUGつぅか考慮漏れってなら
find.2ch.netは100件表示指定しても最大50件に制限されるので...
diff tgrepc.php.old tgrepc.php
44c44
< $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '100';
---
> $query_params['n'] = $limit = ($_conf['ktai'] || $_conf['iphone']) ? '25' : '50';

ここ50に変えないと検索漏れる位だな  

・・・

812 :799:2011/05/06(金) 03:06:01.51 ID:YDWYCun00
>>810
もっとエレガントな書き方はあるかもしれませんが、これでおkでした

diff findproxy.php.old findproxy.php
49c49
< if(ereg('^http://[A-Za-z]+\.2ch\.net/test/.*read\.cgi/.*', $element->href)){
---
> if(ereg('^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){

有難いことに修正イメージも書いてある。
ほぼそのままだけど、復活したらすぐ戻せるように、tgrepc.phpには極力手を入れたくないから、
↓で修正してみました。ついでにコメントで指摘受けたハイライトの件も。

% diff findproxy.php.old findproxy.php
14a15,17
>     $max_count = 50;
>     global $limit;
>     $limit = $query_array['n'] > $max_count ? $max_count : $query_array['n'];
18c21
<                            ,'COUNT' => $query_array['n']
---
>                            ,'COUNT' => $limit
21c24
<         $f2query_array['OFFSET'] = (intval($query_array['p']) - 1) * intval($query_array['n']);
---
>         $f2query_array['OFFSET'] = (intval($query_array['p']) - 1) * intval($limit);
49c52
<             if(ereg('^http://[A-Za-z]+\.2ch\.net/test/.*read\.cgi/.*', $element->href)){
---
>             if(ereg('^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){
62c65,66
<                 $result['profile']['regex'] = '/(.*)/i';
---
> //                $result['profile']['regex'] = '/(.*)/i';
>               $keyword = explode(" ", $query_array['q']);
>               $result['profile']['regex'] = '/(' . $keyword[0] .')/i';

findproxy.php.zip (以前の:findproxy.php.old.zip)


【必要なもの】
expack
PHP Simple HTML DOM Parser

【↓こんな構成にしとく必要あり】
rep2/
  tgrepc.php
  findproxy.php (後述)
  simplehtmldom/simple_html_dom.php

・findproxy.php(findproxy.php.zip)

<?php
// {{{ findproxy()
function findproxy($query)
{
    require_once './simplehtmldom/simple_html_dom.php';
    global $_conf;
    // q -> STR
    // n -> COUNT
    // s -> ???
    // b -> ???
    // c -> ???
    // p -> OFFSET

    parse_str($query, $query_array);
    $max_count = 50;
    global $limit;
    $limit = $query_array['n'] > $max_count ? $max_count : $query_array['n'];
    $f2query_array = array(
                           'STR' => mb_convert_encoding($query_array['q'], "EUC-JP","UTF-8")
                           ,'TYPE' => 'TITLE'
                           ,'COUNT' => $limit
                           );
    if(isset($query_array['p'])){
        $f2query_array['OFFSET'] = (intval($query_array['p']) - 1) * intval($limit);
    }

//    print_r($f2query_array);
    ini_set('arg_separator.output', '&');
    $f2query = http_build_query($f2query_array);
    ini_set('arg_separator.output', '&amp;');

//    print($query . ' -- > ' . $f2query);

    $find2ch = 'http://find.2ch.net/index.php';

    $client = new HTTP_Client;
    $client->setDefaultHeader('User-Agent', 'p2-tgrep-client');
    //    print($find2ch . '?' . $f2query);
    $code = $client->get($find2ch . '?' . $f2query);
    if (PEAR::isError($code)) {
        p2die($code->getMessage());
    } elseif ($code != 200) {
        p2die("HTTP Error - {$code}");
    }

    $response = $client->currentResponse();
    $dom = str_get_html(urldecode($response['body']));

    $n1 = 0;
    foreach($dom->find('dt') as $dom2) {
        foreach($dom2->find('a') as $element) {
            if(ereg('^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*', $element->href)){
                $name = mb_convert_encoding($element->find('text', 0)->plaintext,"UTF-8","EUC-JP");

                $urls = parse_url($element->href);
                $bbs = $tkey = '';
                if(ereg('^/test/read\.cgi/([0-9A-Za-z]+)/([0-9]+)/.*', $urls['path'], $hits)){
                    $bbs = $hits[1];
                    $tkey = $hits[2];
                }
                $result['threads'][$n1]->title = $name;
                $result['threads'][$n1]->host = $urls['host'];
                $result['threads'][$n1]->bbs = $bbs;
                $result['threads'][$n1]->tkey = $tkey;
//                $result['profile']['regex'] = '/(.*)/i';
//              $keyword = explode(" ", $f2query_array['STR']);
                $keyword = explode(" ", $query_array['q']);
                $result['profile']['regex'] = '/(' . $keyword[0] .')/i';

                if(ereg('\(([0-9]+)\)', $dom2->find('text', 1)->plaintext, $hits)){
                    $result['threads'][$n1]->resnum = $hits[1];
                }

                $name = mb_convert_encoding($dom2->find('text', 2)->plaintext,"UTF-8","EUC-JP");
                $result['threads'][$n1]->ita = $name;

                $n1++;
            }
        }
    }
    $result['modified'] = $response['body']['date'];

    foreach($dom->find('font') as $element) {
        $name = mb_convert_encoding($element->find('text', 0)->plaintext,"CP932","EUC-JP");
        if(ereg('([0-9]+)スレ.*', $name, $hits)){
            $result['profile']['hits'] = $hits[1];
            break;
        }
    }

    return $result;
}
// }}}
?>

↑のfindproxy.phpを呼ぶため、tgrepc.phpのtgrep_searchに少し手を入れる

function tgrep_search($query)
{
require_once './findproxy.php'; // 追加
return findproxy($query); // 追加
    global $_conf;
・・・
カテゴリー: ソフトウェア タグ: , , , , , , , , , , パーマリンク

rep2のtGrepが使えなくなってた への15件のフィードバック

  1. Felycity のコメント:

    Windows+Apacheの環境で動作確認できました。tGrepが使えなくなって非常に不便を感じていたので、とても助かりました。ありがとうございます!

  2. webmaster のコメント:

    Windowsでも動く・・・と。(. .)φメモメモ

  3. ひまお のコメント:

    ありがとうございます。

    Linuxでもうごいています。助かりました。

  4. ももたん のコメント:

    Mac OS X 10.6.7でも動きました。
    すばらしいものをありがとうございます!

  5. zein のコメント:

    こちらもLinux、unpush氏のrep2-masterで動作しました
    感謝感謝です

  6. りにとか のコメント:

    Windows7x64で動きました。
    ありがとうございます。
    検索結果がすべてハイライトになってるのは仕様ですよね?

  7. webmaster のコメント:

    動けば良いや~。って感じで書いてたので、ハイライトは全く気にしてませんでした。

    ↓の部分を変更すれば良さそうだけど、、、

                    $result['profile']['regex'] = '/(.*)/i';

    元々のtGrepの動作を覚えてない。。。
    複数キーワード渡された場合、一つ目のキーワードだけハイライトで良いんだっけ・・・?
    であれば、↑の箇所を↓に変更で良いかな・・・?

                    $keyword = explode(" ", $query_array['q']);
                    $result['profile']['regex'] = '/(' . $keyword[0] .')/i';

    2つ目以降のキーワードもハイライトする方法は良く分からず。(tgrepc.phpに手入れれば出来るだろうけど。。)

  8. ピンバック: rep2: find.2ch.net | ひねもすのたり

  9. おじさん のコメント:

    有り難く使わせて頂いております(´∀`)
    ハイライト表示もバッチリで最高ですっ!

  10. 匿名 のコメント:

    ありがとうございます
    おかげで動きました!

    PHP Simple HTML DOM Parserのv1.5では白紙状態だったのですが、
    http://sourceforge.net/projects/simplehtmldom/files/simplehtmldom/1.11/
    こちらを入れたら動きました

  11. hamu のコメント:

    自分も不便に思いこの通りやってみましたが
    Parse error: syntax error, unexpected ‘/’ in /****/tgrepc.php on line 342
    のエラーが表示され動きませんね。
    HTMLDOMは1.1 1.5共にダメでした。
    どこがまずかったでしょうか?
    tgrepc.phpへの追加。simplehtmldomの配置。findproxy.phpの配置は出来ています。

  12. webmaster のコメント:

    う~ん・・・なんですかね。。。
    342行目のシングルクォートが全角になってたりしないですかね?
    自分の環境で、半角から全角に変更した場合、同じエラー「unexpected ‘/’」になりました。
    他にはちょっと思い付きません。。

  13. hamu のコメント:

    >webmaster
    ありがとうございます。
    今までOSXにて編集アップロードしてましたが
    改めてwinでやり直したところ。無事動きました!
    ありがとうございます!

  14. bb のコメント:

    有りがたく使わせて頂きます。
    自分の環境では、HTML DOM v1.5で問題なく動いています。

  15. 匿名 のコメント:

    一部の検索結果が抜けるのは
    if(ereg(‘^http://[A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*’, $element->href)){
    の正規表現の不足みたいです。 (http://hayabusa3.2ch.net/… とか)
    if(ereg(‘^http://[0-9A-Za-z]+\.(2ch\.net|bbspink\.com)/test/.*read\.cgi/.*’, $element->href)){
    とりあえず、これで。

コメントを残す

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