自宅サーバの整理箱

自宅サーバを構築しwordpress,fedora,CentOSの作業メモ

*

2chをスクレイピングでwordpressに投稿する

   

とりあえずメモ
2chまとめビルダーがなくても自力でつくるよ

<?php
include_once('../simple_html_dom.php');
require_once('/var/www/wordpress2/wp-load.php');
require_once 'MDB2.php';


//2chのアニメ板のURL
$TopURL='http://ikura.2ch.net/anime2/';

$Hit_KeyWord='まどか';          //2ch検索キーワード
$Ita_num=1;                     //2ch検索板数 0:無制限
$Sort='l';                      //2ch取得条件 l:最新 -:先頭
$Num =20;                       //ech取得件数
$cat='カテゴリ';                //wp投稿カテゴリ
$tag='tag';                     //wp投稿タグ


$LinkCgi=str_replace('2ch.net','2ch.net/test/read.cgi',$TopURL);
$Num = $Num+1;

//////////////////////////////////////////////////////////////
//関数  :get_italist
//概要  :板リストを取得
//param :
//I/O   :[O]$tag
//履歴  :2014.01.12 新規作成 by name
//////////////////////////////////////////////////////////////
function get_italist($TopURL)
{
        $KEYWORD='body a';
        $SUBBACK_HTML='subback.html';

        $targetURL = $TopURL .$SUBBACK_HTML;
        $html = file_get_contents( $targetURL );
        $html = mb_convert_encoding($html, "UTF-8", "SJIS");
        $gethtml = str_get_html($html);

        //板一覧URLを$tag変数へ取得
        $tag = $gethtml->find($KEYWORD);

        //KEYWORDが個数が1個以上
        if( count($gethtml->find($KEYWORD)) > 0)
        {
                return $tag;
        }else{
                //対象キーワードなし
                echo "no itas found.";
                return ;
        }
}

//////////////////////////////////////////////////////////////
//関数  :fix_ita
//概要  :キーワードに一致する板を決定
//param :-
//I/O   :
//履歴  :2014.01.12 新規作成 by name
//////////////////////////////////////////////////////////////
function fix_ita($TopURL,$Sort,$Num,$val)
{
        $URL=str_replace('2ch.net','2ch.net/test/read.cgi',$TopURL);
        $linkData = $URL.$val->href;                    //リンク先URLを取得

        //URL末尾のl50(最新50件表示)を削除
        $linkData   = mb_substr($linkData, 0, strlen($linkData) - 3);
        $linkData   = $linkData.$Sort.$Num;     //xx件取得

        //html変数に上書き
        $html = file_get_contents( $linkData );
        $html = mb_convert_encoding($html, "UTF-8", "SJIS");
        $htmlstr= str_get_html($html);

        //画像URLをimgタグへ置換
        $htmlstr= get_image( $htmlstr );

        //該当記事のみ切出し
        //$sta_pos = mb_strpos($htmlstr,'1 :');
        //$end_pos = mb_strpos($htmlstr,$Num.' :');
        $sta_pos = mb_strpos($htmlstr,'<dl id=');
        $end_pos = mb_strpos($htmlstr,'</dl>');
        $htmlstr = mb_substr($htmlstr,$sta_pos,$end_pos - $sta_pos);

        return $htmlstr;
}

//////////////////////////////////////////////////////////////
//関数  :get_image
//概要  :板から画像を抽出
//param :-
//I/O   :
//履歴  :2014.01.12 新規作成 by name
//////////////////////////////////////////////////////////////
function get_image($htmlstr)
{
        $KEYWORD='body a';
        $editstr=$htmlstr;

        $tag = $htmlstr->find($KEYWORD);
        foreach ($tag as $val)
        {
                if(preg_match("/ttp/", $val->plaintext))
                {
                        //jpgとpngとgifのURLを格納する
                        $workWord = mb_substr($val->plaintext, -3);   //拡張子拡張子取得
                        if($workWord == "jpg" || $workWord == "png" || $workWord == "gif")
                        {
                                $reptext = "<img src='" .$val->plaintext. "' width=70%' />";
                                $editstr=str_replace($val->plaintext,$reptext,$editstr);
                        }
                }
        }
        return $editstr;
}

//////////////////////////////////////////////////////////////
//関数  :put_wprdpress
//概要  :WordPressへ投稿
//param :-
//I/O   :I/$title I/$content
//履歴  :2014.01.12 新規作成 by name
//////////////////////////////////////////////////////////////
function post_wordpress($title,$content,$tag,$cat)
{
        //初期設定
        $db = "mysql://wordpress:wordpress@localhost/wordpress3?charset=utf8";
        $mdb2 =& MDB2::factory($db);
        $site_id = 2;

        $post_value = array(
            'post_author' => 1,                         // 投稿者のID。
            'post_title' =>"$title",                    // 投稿のタイトル
            'post_content' =>"$content",                // 投稿の本文。
            'post_category' =>array($cat),              // カテゴリーID(配列)。
            'tags_input' => array($tag),                // タグの名前(配列)。
            'post_status' => 'publish'                  // 公開ステータス。
        );

        /* 同じタイトルの記事はスキップ */
        $tablename = 'wp_'.$site_id.'_posts';
        $sql = "SELECT COUNT(*) FROM `$tablename` WHERE `post_title` = '$title'";
        $sqlcd = $mdb2->queryOne($sql);

        if($sqlcd != 0 ){
            $msg = 'allrady post same shread(' .$sqlcd .') <br>';
            echo $msg;
            return -1;
        }else{
            //
        }

        //$insert_idには投稿のID,失敗した場合は0
        switch_to_blog( $site_id );
        $insert_id = wp_insert_post($post_value,true);
        restore_current_blog();

        if(is_wp_error($insert_id)) {
            /* 投稿に失敗した時の処理等を記述 */
            $msg = 'throw is_wp_error('.$insert_id.') <br>';
            echo $msg;
            return -1;
        }else{
            /* 投稿に失敗した時の処理等を記述 */
            $msg = 'publish OK!(' .$insert_id .')<br>';
            echo $msg;
        }
        return 0;
}

////////////////////
//MAIN
////////////////////
$hit_cnt=0;
$tag = get_italist($TopURL);

//debug
echo '<html lang="ja"><head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">';
echo '</head><body>';
//debug

foreach ( $tag as $val )
{
        //対象キーワード
        if(preg_match('/'.$Hit_KeyWord.'/', $val->plaintext))
        {
                $hit_cnt = $hit_cnt+1;

                //抽出
                $sta_pos = mb_strpos($val->plaintext,':') + 1;
                $end_pos = mb_strrpos($val->plaintext,'(');
                $title   = mb_substr($val->plaintext,$sta_pos,$end_pos - $sta_pos);
                $htmlstr = fix_ita($TopURL,$Sort,$Num,$val);

                //WordPress処理
                $iRtn = post_wordpress($title,$htmlstr,$tag,$cat);

//debug
echo $title;
echo '<br/><br/>';
echo $htmlstr;
echo '<hr/>';
//debug

        }
        if($Ita_num == 0)
        {
                //continue
        }else{
                if($hit_cnt >= $Ita_num)
                {
                        return 0;
                }
        }
}

//debug
echo '</body></html>';
//debug
return 0;
?>

 - Word Press, スクレイピング

 Total 591 views