ChangeMenuSignDaiShu.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. /*
  3. * 替换微信菜单内的签到链接为签到交互 将第一个菜单继续阅读改为签到
  4. */
  5. namespace app\admin\command;
  6. use app\common\library\Redis;
  7. use app\common\library\WeChatObject;
  8. use EasyWeChat\Factory;
  9. use Symfony\Component\Cache\Simple\RedisCache;
  10. use think\Config;
  11. use think\console\Command;
  12. use think\console\Input;
  13. use think\console\input\Option;
  14. use think\console\Output;
  15. use app\common\model\AdminConfig;
  16. use app\common\model\Config as dbconfig;
  17. use think\Log;
  18. use think\Exception;
  19. use think\Request;
  20. class ChangeMenuSignDaiShu extends Command
  21. {
  22. protected $message = '';
  23. protected function configure()
  24. {
  25. $this->setName('ChangeMenuSignDaiShu')
  26. ->addOption("adminid","a",Option::VALUE_REQUIRED,'要单独处理的adminid 支持英文逗号分隔的多个')
  27. ->addOption("delay","d",Option::VALUE_REQUIRED,'休眠时间,单位秒')
  28. ->setDescription('替换微信菜单内的签到链接为签到交互');
  29. }
  30. protected function execute(Input $input, Output $output){
  31. $channel_map = [];
  32. //cli模式下无法获取到当前的项目模块,手动指定一下
  33. Request::instance()->module('admin');
  34. $admin_id = $input->getOption('adminid');
  35. //获取休眠时间
  36. $sleep = $input->getOption('delay');
  37. $output->info('ChangeMenuSignDaiShu -----------------------------------> Start');
  38. if (!empty($admin_id)) {
  39. $channel_map['admin_id'] = ['in', $admin_id];
  40. }
  41. if(!$adminConfig = model('AdminConfig')->where($channel_map)->field('admin_id,appid,refresh_token,wx_menu')->select()){
  42. $output->error('ChangeMenuSignDaiShu->Error:渠道OR配号代理商为空');
  43. return;
  44. }
  45. $output->info('ChangeMenuSignDaiShu->SQL:'.model('AdminConfig')->getLastSql());
  46. Log::info('ChangeMenuSignDaiShu->SQL:'.model('AdminConfig')->getLastSql());
  47. foreach($adminConfig as $channel){
  48. //微信菜单为空时跳过
  49. if(empty($channel['wx_menu'])){
  50. $output->info('ChangeMenuSignDaiShu->Source->Menu:'.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Menu Is NULL");
  51. continue;
  52. }
  53. Log::info('ChangeMenuSignDaiShu->Source->Menu:'.var_export($channel['wx_menu'],true));
  54. $menu = $channel['wx_menu'];
  55. $hasJmp = false;
  56. foreach($menu as $key => $val){
  57. if($key == 0) {
  58. if (!isset($val['url']) || stripos($val['url'], '/index/user/recent') === false) {
  59. $output->info('ChangeMenuSignDaiShu->Source->Menu:' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} 第一个菜单不是继续阅读,自动跳过");
  60. $hasJmp = true;
  61. }
  62. }
  63. if (!$hasJmp) {
  64. if ((isset($val['url']) && stripos($val['url'], '/index/user/sign') !== false)
  65. || (isset($val['key']) && $val['key'] == '签到')
  66. ) { // 第一级菜单是签到链接 或者 是签到交互 ,自动跳过
  67. $output->info('ChangeMenuSignDaiShu->Source->Menu:' . date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} 一级菜单有签到,自动跳过");
  68. $hasJmp = true;
  69. }
  70. }
  71. }
  72. if($hasJmp){
  73. continue;
  74. }
  75. foreach($menu as $key => &$val){
  76. if($key == 0){
  77. $url = $val['url']; //保存继续阅读的url
  78. $val = [ //修改第一个大菜单的格式
  79. 'name' => '继续阅读',
  80. 'sub_button' => [
  81. [
  82. 'key' => '签到',
  83. 'name' => '签到送币',
  84. 'type' => 'click'
  85. ],
  86. [
  87. 'url' => $url,
  88. 'name' => '继续阅读',
  89. 'type' => 'view'
  90. ]
  91. ]
  92. ];
  93. }else{
  94. if(isset($val['sub_button']) && !empty($val['sub_button'])){
  95. foreach ($val['sub_button'] as $sub_k => &$sub_v) {
  96. if ((isset($sub_v['key']) && $sub_v['key'] == '签到')
  97. || (isset($sub_v['url']) && stripos($sub_v['url'], '/index/user/sign') !== false)
  98. ) { //子菜单中有签到交互或者签到链接,直接删除
  99. unset($val['sub_button'][$sub_k]);
  100. }
  101. }
  102. $val['sub_button'] = array_values($val['sub_button']);
  103. }
  104. }
  105. }
  106. $channel['wx_menu'] = $menu;
  107. Log::info('ChangeMenuSignDaiShu->Replace->Menu:'.var_export($channel['wx_menu'],true));
  108. try {
  109. //更新菜单
  110. $admin = model('AdminConfig')->getAdminInfoAll($channel['admin_id']);
  111. if(empty($admin['refresh_token'])){
  112. Log::info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} refresh_token Empty!!");
  113. continue;
  114. }
  115. $adminInfo = model('AdminConfig')->getAdminInfoAll($channel['admin_id']);
  116. $wechat = new WeChatObject($adminInfo);
  117. $officialAccount = $wechat->getOfficialAccount();
  118. // $officialAccount->menu->delete(); //删除全部菜单 主要是掌中云个性化菜单
  119. $ret = $officialAccount->menu->create($channel['wx_menu']);
  120. if ($ret['errcode'] == 0) {
  121. $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
  122. Log::info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Success");
  123. //更新数据
  124. $update = model('AdminConfig')->update(['wx_menu' => $channel['wx_menu']], ["admin_id" => $channel['admin_id']]);
  125. if ($update) {
  126. $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
  127. Log::info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Success");
  128. } else {
  129. $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
  130. Log::error('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} Mysql Update Fail");
  131. }
  132. } else {
  133. $output->info('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
  134. Log::error('ChangeMenuSignDaiShu->WeChat->Menu: '.date('Y-m-d H:i:s') . " admin_id:{$channel['admin_id']} WeChat Update Fail Error:" . $ret['errmsg']);
  135. }
  136. //休眠
  137. if (!empty($sleep) && is_numeric($sleep)) {
  138. sleep($sleep);
  139. }
  140. }catch (\Exception $exception){
  141. 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());
  142. }
  143. }
  144. $output->info('ChangeMenuSignDaiShu -----------------------------------> End');
  145. }
  146. }