remindSign.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: z-yang
  5. * Date: 2019/10/23
  6. * Time: 16:44
  7. */
  8. namespace App\Console\Commands\SmartPush;
  9. use App\Modules\User\Services\UserSignService;
  10. use Illuminate\Console\Command;
  11. use DB;
  12. use Redis;
  13. use GuzzleHttp\Client;
  14. use App\Http\Controllers\WechatController;
  15. use GuzzleHttp\Psr7\Request as GuzzleRequest;
  16. use GuzzleHttp\Pool;
  17. class remindSign extends Command
  18. {
  19. /**
  20. * The name and signature of the console command.
  21. *
  22. * @var string
  23. */
  24. protected $signature = 'SmartPush:remindSign {--start=} {--end=}';
  25. /**
  26. * The console command description.
  27. *
  28. * @var string
  29. */
  30. protected $description = '签到提醒';
  31. /**
  32. * Create a new command instance.
  33. *
  34. * @return void
  35. */
  36. public function __construct()
  37. {
  38. parent::__construct();
  39. }
  40. /**
  41. * Execute the console command.
  42. *
  43. * @return mixed
  44. */
  45. public function handle()
  46. {
  47. $this->send();
  48. }
  49. private function generateRequest()
  50. {
  51. $switch_array = [];
  52. $start = $this->option('start',0);
  53. $end = $this->option('end');
  54. $temp = $start;
  55. $continueReadUrlFormat = 'https://site%s.%s.com/sign';
  56. $info = DB::connection('api_mysql')->table('custom_msg_switchs')->where('custom_category','remind_sign')->first();
  57. if(!$info) return ;
  58. $default_status = $info->default_switch_status;
  59. while (true){
  60. if($end == -1){
  61. $user = DB::connection('api_mysql')->table('temp_force_subscribe_users')
  62. ->select('id','uid','distribution_channel_id','openid','appid')
  63. ->where('id','>',$temp)
  64. ->where('last_interactive_time','>',date('Y-m-d H:i:s',time()-86400*2))
  65. ->orderBy('id')
  66. ->limit(5000)
  67. ->get();
  68. }else{
  69. $user = DB::connection('api_mysql')->table('temp_force_subscribe_users')
  70. ->select('id','uid','distribution_channel_id','openid','appid')
  71. ->where('id','>',$temp)
  72. ->where('id','<=',$end)
  73. ->where('last_interactive_time','>',date('Y-m-d H:i:s',time()-86400*2))
  74. ->orderBy('id')
  75. ->limit(5000)
  76. ->get();
  77. }
  78. if(!$user) break;
  79. foreach ($user as $item){
  80. //if(!in_array($item->distribution_channel_id,[70])) continue;
  81. //\Log::info( '---------------------------start--start-------------------------------------------' );
  82. //\Log::info('$item->distribution_channel_id is :'.$item->distribution_channel_id );
  83. //\Log::info( 'remindSign $item->id is :'.$item->id );
  84. if(!isset($switch_array[$item->distribution_channel_id])){
  85. $switch = DB::connection('api_mysql')->table('custom_msg_switchs_msgs')
  86. ->where('distribution_channel_id',$item->distribution_channel_id)
  87. ->where('custom_category','remind_sign')
  88. ->select('status')
  89. ->first();
  90. if($switch){
  91. $switch_array[$item->distribution_channel_id] = $switch->status;
  92. }else{
  93. $switch_array[$item->distribution_channel_id] = $default_status;
  94. }
  95. }
  96. $switch_status = $switch_array[$item->distribution_channel_id];
  97. if($switch_status != 1) continue;
  98. //\Log::info( 'remindSign $item->distribution_channel_id in is :'.$item->distribution_channel_id );
  99. $is_sign = $this->isSign($item->uid);
  100. if(!$item->uid)$item->uid = 0;
  101. //\Log::info( $read_info );
  102. //\Log::info( 'uid is :'.$item->uid );
  103. if($is_sign) continue;
  104. $user_info = DB::connection('api_mysql')->table('users')->where('id',$item->uid)->select('nickname','openid','created_at')->first();
  105. $nickname = '读者';
  106. if($user_info && $user_info->nickname)$nickname = $user_info->nickname;
  107. $openid = $item->openid;
  108. $appid = $item->appid;
  109. //$url = sprintf($continueReadUrlFormat,encodeDistributionChannelId($item->distribution_channel_id),env('CUSTOM_HOST'));
  110. $url = 'weixin://bizmsgmenu?msgmenucontent=签到&msgmenuid=hudonglian';
  111. $guide_status = false;
  112. if($user_info){
  113. $guide_status = UserSignService::guideFans($item->uid,$item->distribution_channel_id,$user_info->openid,$user_info->created_at);
  114. }
  115. if($guide_status){
  116. $guide_link = 'https://site'.encodeDistributionChannelId($item->distribution_channel_id).'.leyuee.com/guidestrem?uid='.$item->uid.'&fee=500';
  117. $content_format = "亲爱的%s,您今日还未签到,本次签到最高可领取150书币哦\r\n\r\n❤<a href='%s'>点击此处签到领书币</a>\r\n\r\n<a href='%s'>免费领取500书币奖励>></a> \r\n\r\n为了方便下次阅读,请<a href='%s'>置顶公众号</a>";
  118. $content = sprintf($content_format,$nickname,$url,$guide_link,
  119. 'https://help.zhuishuyun.com/top.html'
  120. );
  121. }else{
  122. $content_format = "亲爱的%s,您今日还未签到,本次签到最高可领取150书币哦\r\n\r\n❤<a href='%s'>点击此处签到领书币</a>\r\n\r\n\r\n为了方便下次阅读,请<a href='%s'>置顶公众号</a>";
  123. $content = sprintf($content_format,
  124. $nickname,$url,
  125. 'https://help.zhuishuyun.com/top.html'
  126. );
  127. }
  128. $accecc_token = $this->getAccessToken($appid);
  129. if(!$accecc_token)continue;
  130. $url = 'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='.$accecc_token;
  131. $request = new GuzzleRequest('post',$url,[],\GuzzleHttp\json_encode([
  132. 'touser'=>$openid,
  133. 'msgtype'=>'text',
  134. 'text'=>['content'=>$content]
  135. ],JSON_UNESCAPED_UNICODE));
  136. //\Log::info( '----------------------------end-end-end-------------------------------------------' );
  137. yield $request;
  138. }
  139. $temp = $item->id;
  140. }
  141. }
  142. private function getAccessToken($appid){
  143. try{
  144. $WechatController = new WechatController($appid);
  145. $accessToken = $WechatController->app->access_token; // EasyWeChat\Core\AccessToken 实例
  146. $token = $accessToken->getToken(); // token 字符串
  147. return $token;
  148. }catch(\Exception $e){
  149. \Log::error($e->getMessage());
  150. }
  151. return '';
  152. }
  153. private function send(){
  154. $client = new Client();
  155. $requests = $this->generateRequest();
  156. $pool = new Pool($client, $requests, [
  157. 'concurrency' => 5,
  158. 'fulfilled' => function ($response, $index) {
  159. },
  160. 'rejected' => function ($reason, $index) {
  161. },
  162. ]);
  163. $promise = $pool->promise();
  164. $promise->wait();
  165. }
  166. private function isSign($uid){
  167. $sign_day = Redis::hget('book_read:' . $uid,'sign_day');
  168. if ($sign_day && $sign_day == date('Y-m-d')) {
  169. return true;
  170. }
  171. return false;
  172. }
  173. }