client = new Client(['timeout' => 8.0,'allow_redirects'=>true]); } /** * Execute the console command. * * @return mixed */ public function handle() { $bid = $this->option('bid'); if(empty($bid)) return 0; $content = $this->option('content'); if($content){ $start = $this->option('start'); $end = $this->option('end'); $withname = $this->option('withname'); return $this->updateExistContent($bid,$start,$end,$withname); } return $this->updateOne($bid); } /** * 更新章节内容 一本书的 * @param $bid * @return int|string */ public function updateOne($bid){ set_time_limit(0); $book_info = Book::find($bid); if(empty($book_info) || empty($book_info->ly_bid)) return -1; $this->bookStatus($bid,$book_info->ly_bid); //$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; $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; $chapter_list_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapterlist&bid=%s&token=sefaf23h7face"; $res = $this->client->get(sprintf($chapter_list_fromat,$book_info->ly_bid)); $res = $res->getBody()->getContents(); if(!$res) return ''; $book_config_info = DB::table('book_configs')->where('bid',$bid)->first(); $res = json_decode($res,true); $j = 0; $size = 0; $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; } if($remote_count == $local_count) return ''; $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; } foreach ($res['data'] as $v1) { foreach ($v1['chapters'] as $v) { /*if ($v['chapter_order_number'] <= $max_sequence-1) { continue; }*/ if(!$start){ if($v['chapter_id'] != $ly_last_chapter_id){ continue; }else{ \Log::info($v1); $start = true; continue; } } /*if (Chapter::where('bid', $bid)->where('ly_chapter_id', $v['chapter_id'])->count()) { continue; }*/ $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, $book_info->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']]); $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 updateExistContent($bid,$start=0,$end=0,$name=false){ $book_info = Book::find($bid); if(empty($book_info) || empty($book_info->ly_bid)) return -1; $chapter_list_fromat = "http://www.leyuee.com/services/zwfx.aspx?method=chapterlist&bid=%s&token=sefaf23h7face"; $res = $this->client->get(sprintf($chapter_list_fromat,$book_info->ly_bid)); $res = $res->getBody()->getContents(); if(!$res) return ''; $res = json_decode($res,true); if(!isset($res['data'])) return ''; foreach ($res['data'] as $v1){ foreach ($v1['chapters'] as $v){ if($start && ($v['chapter_order_number']+1<$start) ){ continue; } if($end && ($v['chapter_order_number']+1>$end)){ break; } $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, $book_info->ly_bid, $v['chapter_id'])); $cahpter_content = $cahpter_content_res->getBody()->getContents(); $cahpter_content = json_decode($cahpter_content, true); if($cahpter_content && isset( $cahpter_content['data']['chapter_content']) && !empty( $cahpter_content['data']['chapter_content'])){ //$temp['size'] = ceil(strlen($cahpter_content['data']['chapter_content']) / 3); //$temp['content'] = $cahpter_content['data']['chapter_content']; $chapter = Chapter::where('bid', $bid)->where('sequence', $v['chapter_order_number']+1)->first(); if($chapter){ $chapter->content = $cahpter_content['data']['chapter_content']; if($name){ $chapter->name =$v['chapter_name']; } $chapter->size = ceil(strlen($cahpter_content['data']['chapter_content']) / 3); ChapterService::editChapter($chapter); } } } } } 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') ]); } }