| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 | <?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use GuzzleHttp\Client;use App\Modules\Book\Models\Book;use App\Modules\Book\Models\Chapter;use Log;use App\Modules\Book\Services\BookConfigService;use DB;class BookUpdate extends Command{    /**     * The name and signature of the console command.     *     * @var string     */    protected $signature = 'book:update';    /**     * The console command description.     *     * @var string     */    protected $description = '更新所有图书章节内容';    private $client;    /**     * Create a new command instance.     *     * @return void     */    public function __construct()    {        parent::__construct();        $this->client = new Client(['timeout' => 10.0, 'allow_redirects' => true]);    }    /**     * Execute the console command.     *     * @return mixed     */    public function handle()    {        $this->updateAll();    }    /**     * 更新所有书的章节     */    public function updateAll()    {        set_time_limit(0);        $exist_book = Book::where('ly_bid', '!=', '0')->where('status', 0)->select('id', 'ly_bid')->get();        foreach ($exist_book as $v) {            //Log::info('updateAll bid is: '.$v->id.'$ly_bid is :'.$v->ly_bid.'----------------------------');            $this->updateOne($v->id, $v->ly_bid);        }    }    /**     * 更新章节内容 一本书的     * @param $bid     * @return int|string     */    public function updateOne($bid, $ly_bid)    {        set_time_limit(0);        //$max_sequence = Chapter::where('bid', $bid)->max('sequence');        //$max_sequence = $max_sequence ? $max_sequence : -1;        //$max_sequence_chapter = Chapter::where('bid', $bid)->where('sequence', $max_sequence)->select('id')->first();        //$max_sequence_chapter_id = isset($max_sequence_chapter->id) ? $max_sequence_chapter->id : 0;        $this->bookStatus($bid, $ly_bid);        $last_chapter = Chapter::where('bid', $bid)            ->select('id', 'name', 'sequence', 'prev_cid', 'next_cid')            ->orderBy('sequence', 'desc')            ->first();        $last_chapter_from_third = Chapter::where('bid', $bid)            ->where('ly_chapter_id', '>', 0)            ->select('id', 'name', 'sequence', 'prev_cid', 'next_cid', 'ly_chapter_id')            ->orderBy('sequence', 'desc')            ->first();        $max_sequence_chapter_id = isset($last_chapter->id) ? $last_chapter->id : 0;        $max_sequence = isset($last_chapter->sequence) ? $last_chapter->sequence : 0;        $book_config_info = DB::table('book_configs')->where('bid',$bid)->first();        try {            $chapter_list_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapterlist&bid=%s&token=sefaf23h7face";            $res = $this->client->get(sprintf($chapter_list_fromat, $ly_bid));            $res = $res->getBody()->getContents();        } catch (\Exception $e) {            Log::info($e);            return '';        }        if (!$res) return '';        $res = json_decode($res, true);        if ($res && isset($res['code']) && $res['code'] == 200) {        } else {            return '';        }        $j = 0;        if (isset($res['data']) && $res['data'] && is_array($res['data'])) {        } else {            return '';        }        $local_count = Chapter::where('bid', $bid)->where('ly_chapter_id', '>', 0)->count();        $remote_count = 0;        foreach ($res['data'] as $item1) {            $remote_count += count($item1['chapters']);            $item1 = null;        }        Log::info('$remote_count is: ' . $remote_count . '====$local_count :' . $local_count . '----');        if ($remote_count <= $local_count) return '';        Log::info('$bid =: ' . $bid . '---is lack---');        $start = false;        if (!$last_chapter) {            $start = true;        }        $ly_last_chapter_id = 0;        if ($last_chapter_from_third && isset($last_chapter_from_third->ly_chapter_id)) {            $ly_last_chapter_id = $last_chapter_from_third->ly_chapter_id;        }        $size = 0;        foreach ($res['data'] as $v1) {            foreach ($v1['chapters'] as $v) {                /*if ($v['chapter_order_number'] <= $max_sequence-1) {                    continue;                }                if (Chapter::where('bid', $bid)->where('ly_chapter_id', $v['chapter_id'])->count()) {                    continue;                }*/                if (!$start) {                    if ($v['chapter_id'] != $ly_last_chapter_id) {                        continue;                    } else {                        \Log::info($v);                        $start = true;                        continue;                    }                }                Log::info('bid: ' . $bid . '----ly_chapter_id: ' . $v['chapter_id']);                $chapter_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapter&bid=%s&cid=%s&token=sefaf23h7face";                $cahpter_content_res = $this->client->get(sprintf($chapter_fromat, $ly_bid, $v['chapter_id']));                $cahpter_content = $cahpter_content_res->getBody()->getContents();                $temp = [                    'bid' => $bid,                    'name' => $v['chapter_name'],                    'sequence' => ++$max_sequence,                    'is_vip' => $v['chapter_need_pay'],                    'prev_cid' => $max_sequence_chapter_id,                    'next_cid' => '',                    'recent_update_at' => date('Y-m-d H:i:s', $v['chapter_last_update_time']),                    'ly_chapter_id' => $v['chapter_id']                ];                if ($cahpter_content) {                    $cahpter_content = json_decode($cahpter_content, true);                    $temp['size'] = ceil(strlen($cahpter_content['data']['chapter_content']) / 3);                    $temp['content'] = $cahpter_content['data']['chapter_content'];                    $size += $temp['size'];                }                $insert_res = Chapter::create($temp);                Chapter::where('id', $max_sequence_chapter_id)->update(['next_cid' => $insert_res->id]);                $max_sequence_chapter_id = $insert_res->id;                $temp = null;                $j++;            }        }        $chapter_count = Chapter::where('bid', $bid)->count();        $chapter_size = Chapter::where('bid', $bid)->sum('size');        if ($j > 0) {            Book::where('id', $bid)->update(['chapter_count' => $chapter_count, 'last_cid' => $max_sequence_chapter_id, 'size' => $chapter_size, 'last_chapter' => $v['chapter_name']]);            $book_info = Book::find($bid);            $this->recordUpdateInfo($bid,[                'book_name'=>$book_config_info->book_name,                'update_chapter_count'=>$j,                'update_words'=>$size,                'update_type'=>'add_chapter',                'channel_name'=>$book_info->category_id >=13 ? '女频':'男频'            ]);        }        return $j;    }    private function bookStatus($bid, $ly_bid)    {        $status = 0;        try {            $book_info_url_format = "http://www.leyuee.com/services/zwfx.aspx?method=bookinfo&token=sefaf23h7face&bid=%s";            $res = $this->client->get(sprintf($book_info_url_format, $ly_bid));            $res = $res->getBody()->getContents();            if ($res) {                $res = json_decode($res, true);                if (isset($res['data']) && isset($res['data']['book_state'])) {                    $status = $res['data']['book_state'];                }            }        } catch (\Exception $e) {        }        if ($status) {            Book::where('id', $bid)->update(['status' => $status]);        }    }    private function recordUpdateInfo($bid, $data)    {        // 2 book_updates 的更新记录        DB::table('book_updates')->insert([            'bid' => $bid,            'book_name' => $data['book_name'],            'channel_name' => $data['channel_name'],            'update_date' => date('Y-m-d'),            'update_chapter_count' => $data['update_chapter_count'],            'update_words' => $data['update_words'],            'update_type' => $data['update_type'],            'created_at' => date('Y-m-d H:i:s'),            'updated_at' => date('Y-m-d H:i:s')        ]);    }}
 |