123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- <?php
- namespace App\Console\Commands;
- use Illuminate\Console\Command;
- use GuzzleHttp\Client;
- use App\Modules\Book\Models\Book;
- use App\Modules\Book\Models\Chapter;
- use App\Modules\Book\Services\ChapterService;
- use App\Modules\Book\Services\BookConfigService;
- use DB;
- use Log;
- class BookUpdateOne extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'book:updateone
- {--bid= : the id of a book}
- {--content}
- {--start=}
- {--end=}
- {--withname}';
- /**
- * 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' => 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')
- ]);
- }
- }
|