setName('ChangeMenuSignDaiShu') ->addOption("adminid","a",Option::VALUE_REQUIRED,'要单独处理的adminid 支持英文逗号分隔的多个') ->addOption("delay","d",Option::VALUE_REQUIRED,'休眠时间,单位秒') ->setDescription('替换微信菜单内的签到链接为签到交互'); } protected function execute(Input $input, Output $output){ $channel_map = []; //cli模式下无法获取到当前的项目模块,手动指定一下 Request::instance()->module('admin'); $admin_id = $input->getOption('adminid'); //获取休眠时间 $sleep = $input->getOption('delay'); $output->info('ChangeMenuSignDaiShu -----------------------------------> Start'); if (!empty($admin_id)) { $channel_map['admin_id'] = ['in', $admin_id]; } if(!$adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,refresh_token,wx_menu')->select()){ $output->error('ChangeMenuSignDaiShu->Error:渠道OR配号代理商为空'); return; } $output->info('ChangeMenuSignDaiShu->SQL:'.model('AdminConfig')->getLastSql()); Log::info('ChangeMenuSignDaiShu->SQL:'.model('AdminConfig')->getLastSql()); foreach($adminConfig as $channel){ //微信菜单为空时跳过 if(empty($channel['wx_menu'])){ $output->info('ChangeMenuSignDaiShu->Source->Menu:'.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Menu Is NULL"); continue; } Log::info('ChangeMenuSignDaiShu->Source->Menu:'.var_export($channel['wx_menu'],true)); $menu = $channel['wx_menu']; $hasJmp = false; foreach($menu as $key => $val){ if($key == 0) { if (!isset($val['url']) || stripos($val['url'], '/index/user/recent') === false) { $output->info('ChangeMenuSignDaiShu->Source->Menu:' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} 第一个菜单不是继续阅读,自动跳过"); $hasJmp = true; } } if (!$hasJmp) { if ((isset($val['url']) && stripos($val['url'], '/index/user/sign') !== false) || (isset($val['key']) && $val['key'] == '签到') ) { // 第一级菜单是签到链接 或者 是签到交互 ,自动跳过 $output->info('ChangeMenuSignDaiShu->Source->Menu:' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} 一级菜单有签到,自动跳过"); $hasJmp = true; } } } if($hasJmp){ continue; } foreach($menu as $key => &$val){ if($key == 0){ $url = $val['url']; //保存继续阅读的url $val = [ //修改第一个大菜单的格式 'name' => '继续阅读', 'sub_button' => [ [ 'key' => '签到', 'name' => '签到送币', 'type' => 'click' ], [ 'url' => $url, 'name' => '继续阅读', 'type' => 'view' ] ] ]; }else{ if(isset($val['sub_button']) && !empty($val['sub_button'])){ foreach ($val['sub_button'] as $sub_k => &$sub_v) { if ((isset($sub_v['key']) && $sub_v['key'] == '签到') || (isset($sub_v['url']) && stripos($sub_v['url'], '/index/user/sign') !== false) ) { //子菜单中有签到交互或者签到链接,直接删除 unset($val['sub_button'][$sub_k]); } } $val['sub_button'] = array_values($val['sub_button']); } } } $channel['wx_menu'] = $menu; Log::info('ChangeMenuSignDaiShu->Replace->Menu:'.var_export($channel['wx_menu'],true)); try { //更新菜单 $admin = model('AdminConfig')->getAdminInfoAll($channel['admin_id']); if(empty($admin['refresh_token'])){ Log::info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} refresh_token Empty!!"); continue; } $adminInfo = model('AdminConfig')->getAdminInfoAll($channel['admin_id']); $wechat = new WeChatObject($adminInfo); $officialAccount = $wechat->getOfficialAccount(); // $officialAccount->menu->delete(); //删除全部菜单 主要是掌中云个性化菜单 $ret = $officialAccount->menu->create($channel['wx_menu']); if ($ret['errcode'] == 0) { $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success"); Log::info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success"); //更新数据 $update = model('AdminConfig')->update(['wx_menu' => $channel['wx_menu']], ["admin_id" => $channel['admin_id']]); if ($update) { $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success"); Log::info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success"); } else { $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail"); Log::error('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail"); } } else { $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']); Log::error('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']); } //休眠 if (!empty($sleep) && is_numeric($sleep)) { sleep($sleep); } }catch (\Exception $exception){ Log::error('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:".$exception->getLine().' ' . $exception->getMessage()); } } $output->info('ChangeMenuSignDaiShu -----------------------------------> End'); } }