123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- <?php
- /*
- * 替换微信菜单内的签到链接为签到交互 将第一个菜单继续阅读改为签到
- */
- namespace app\admin\command;
- use app\common\library\Redis;
- use app\common\library\WeChatObject;
- use EasyWeChat\Factory;
- use Symfony\Component\Cache\Simple\RedisCache;
- use think\Config;
- use think\console\Command;
- use think\console\Input;
- use think\console\input\Option;
- use think\console\Output;
- use app\common\model\AdminConfig;
- use app\common\model\Config as dbconfig;
- use think\Log;
- use think\Exception;
- use think\Request;
- class ChangeMenuSignDaiShu extends Command
- {
- protected $message = '';
- protected function configure()
- {
- $this->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');
- }
- }
|