setName('weworksingle_pull_chat_record') ->setDescription('weworksingle pull chat record'); } protected function execute(Input $input, Output $output) { /* $db_config = [ // 默认使用的数据库连接配置 'default' => env('database.driver', 'mysql'), // 自定义时间查询规则 'time_query_rule' => [], // 自动写入时间戳字段 // true为自动识别类型 false关闭 // 字符串则明确指定时间字段类型 支持 int timestamp datetime date 'auto_timestamp' => true, // 时间字段取出后的默认时间格式 'datetime_format' => 'Y-m-d H:i:s', // 时间字段配置 配置格式:create_time,update_time 'datetime_field' => '', // 数据库连接配置信息 'connections' => [ 'mysql' => [ // 数据库类型 'type' => Env::get('database.type', 'mysql'), // 服务器地址 'hostname' => Env::get('database.hostname', '127.0.0.1'), // 数据库名 'database' => Env::get('database.database', ''), // 用户名 'username' => Env::get('database.username', 'root'), // 密码 'password' => Env::get('database.password', ''), // 端口 'hostport' => Env::get('database.hostport', '3306'), // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => Env::get('database.charset', 'utf8mb4'), // 数据库表前缀 'prefix' => Env::get('database.prefix', ''), // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 是否需要断线重连 'break_reconnect' => false, // 监听SQL 'trigger_sql' => false, // env('app_debug', true), // 开启字段缓存 'fields_cache' => false, ], // 更多的数据库配置信息 ] ]; Config::set($db_config, 'database'); */ Log::record(NULL)->save(); $list = WeworksingleCompanySetting::where('chat_private_key', '<>', '')->select(); foreach ($list as $k => $v) { $chat_config['corp_id'] = $v['corp_id']; $chat_config['secret'] = $v['chat_secret']; $chat_config['token'] = $v['chat_token']; $chat_config['aes_key'] = $v['chat_aes_key']; $chat_config['private_key'] = root_path() . $v['chat_private_key']; $chat_config['company_id'] = $v['company_id']; if (!empty($v['chat_secret']) && !empty($v['chat_token']) && !empty($v['chat_aes_key']) && !empty($v['chat_private_key'])) { $latest_one = (new WeworksinglePullRecord())->where('company_id', '=', $v['company_id'])->order('id desc')->find(); if (empty($latest_one['end_seq'])) { $end_seq = 0; } else { $end_seq = $latest_one['end_seq']; } $this->getTalkRecordCommand(intval($end_seq), $chat_config); } } // 指令输出 $output->writeln(date('Y-m-d H:i:s', time()) . '---ok'); } /** * 定时拉取命令行方法 */ public function getTalkRecordCommand($start_seq = 0, $config = []) { $result = $this->getTalkRecord($start_seq, $config); if ($result !== false) { $this->getTalkRecordCommand($result, $config); } } /** * 从企业微信服务器拉取会话记录 */ public function getTalkRecord($start_seq = 0, $config = []) { $api = new apiSingle(); $result = $api->getTalkRecord($start_seq, $config); if ($result == false) { return false; } else { $file_data = $result['file']; // 文件数组 $msg_data = $result['record']; //消息数组 $recall_data = $result['recall']; // 撤回消息数组 $seq = $result['seq']; // 最后一条消息的seq if (empty($msg_data)) { return false; } else { if (!empty($msg_data)){ (new WeworksingleChatRecord())->replace()->saveAll($msg_data); } if (!empty($file_data)) { (new WeworksingleChatFile())->replace()->saveAll($file_data); $jobHandlerClassName = 'app\jobs\WeworkFileUpload'; $jobQueueName = 'upload_wework_file'; $orderData = []; //这个是需要传到消费者的数据 Queue::later(0, $jobHandlerClassName, $orderData, $jobQueueName); } if (!empty($recall_data)) { (new WeworksingleChatRecord())->where('msgid', 'in', $recall_data)->save(['is_recall'=> 1]); } $pull_data['company_id'] = $config['company_id']; $pull_data['start_seq'] = $start_seq; $pull_data['end_seq'] = $seq; $pull_data['number'] = count($msg_data); (new WeworksinglePullRecord())->insert($pull_data); // $this->checkSensitive($msg_data); return $seq; } } } /** * 检查敏感行为并做记录 * @param array $msg * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException * @throws \EasyWeChat\Kernel\Exceptions\RuntimeException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function checkSensitive($msg = []) { // 敏感行为记录 $save_data = []; foreach ($msg as $k => $v) { // 发红包行为 $v['msgtype'] == 'redpacket' 内部联系人之间发红包行为不监控 if ($v['msgtype'] == 'external_redpacket' || ($v['msgtype'] == 'card' && str_contains($v['msgid'], '_external')) || $v['msgtype'] == 'text') { // 接收人 $toList = json_decode($v['tolist'], true); $toPeople = $toList[0]; if ($v['msgtype'] == 'text') { // 敏感词汇 $sensitive_words = (new SensitiveWordsModel())->where('status', '=', 1)->select(); foreach ($sensitive_words as $words) { if (str_contains($v['content'], $words['name'])) { // 触发敏感词 // 查出关联用户 $u_where['userid'] = $v['msgfrom']; // 去用户表查询用户 $user_find = (new UserModel())->where($u_where)->find(); if (!empty($user_find)) { // 用户发出 $user = $user_find; } else { // 从企业微信服务器拉取用户信息 $new_user = (new WeWorkApi('wework_addressbook'))->getUserById($toPeople); if ($new_user['errcode'] == 0) { //新用户 $new_user['department'] = !empty($new_user['department']) ? implode(',', $new_user['department']) : ''; $new_user['order_department'] = !empty($new_user['order']) ? implode(',', $new_user['order']) : ''; $new_user['is_leader_in_dept'] = !empty($new_user['is_leader_in_dept']) ? implode(',', $new_user['is_leader_in_dept']) : ''; $new_user['direct_leader'] = !empty($new_user['direct_leader']) ? implode(',', $new_user['direct_leader']) : ''; $new_user['extattr'] = !empty($new_user['extattr']) ? json_encode($new_user['extattr']) : ''; $new_user['external_profile'] = !empty($new_user['external_profile']) ? json_encode($new_user['external_profile']) : ''; // 添加新用户 (new UserModel())->insert($new_user); $user = $user_find; } } if (!empty($user)) { // 推送提醒 $content = '您在与客户沟通时出现敏感词汇《' . $words['name'] . '》,请您规范用词。如有疑问请联系管理员'; $api = new WeWorkApi('wework_app'); $api->sendMessage($user['userid'], $content); // 记录敏感行为 $data['userid'] = $user['userid']; $data['msgid'] = $v['msgid']; $data['type'] = 5; $data['words_id'] = $words['id']; $data['customer_id'] = ''; $data['room_id'] = ''; $data['status'] = 1; $data['createtime'] = time(); $save_data[] = $data; } } } } else { // 发红包,发名片的行为 $receive_or_send = ''; // 1、收 2、发 $user = []; // 关联用户 if (empty($v['roomid'])) { // 单聊 // 查出关联用户 $u_where['userid'] = $v['msgfrom']; // 去用户表查询用户 $user_find = (new UserModel())->where($u_where)->find(); if (!empty($user_find)) { // 用户发出 $user = $user_find; $receive_or_send = 2; } else { // 企业微信内没有这个用户,可能是数据库没记录,也可能是外部联系人发过来的红包 $c_where['external_userid'] = $v['msgfrom']; $c_find = (new CustomerModel())->where($c_where)->find(); if (!empty($c_find)) { //客户发出 // 拿接收人ID去查用户 $user_find = (new UserModel())->where('userid', '=', $toPeople)->find(); if (!empty($user_find)) { $user = $user_find; $receive_or_send = 1; } else { // 从企业微信服务器拉取用户信息 $new_user = (new WeWorkApi('wework_addressbook'))->getUserById($toPeople); if ($new_user['errcode'] == 0) { //新用户 $new_user['department'] = !empty($new_user['department']) ? implode(',', $new_user['department']) : ''; $new_user['order_department'] = !empty($new_user['order']) ? implode(',', $new_user['order']) : ''; $new_user['is_leader_in_dept'] = !empty($new_user['is_leader_in_dept']) ? implode(',', $new_user['is_leader_in_dept']) : ''; $new_user['direct_leader'] = !empty($new_user['direct_leader']) ? implode(',', $new_user['direct_leader']) : ''; $new_user['extattr'] = !empty($new_user['extattr']) ? json_encode($new_user['extattr']) : ''; $new_user['external_profile'] = !empty($new_user['external_profile']) ? json_encode($new_user['external_profile']) : ''; // 添加新用户 (new UserModel())->insert($new_user); $user = $new_user; $receive_or_send = 1; } } } else { // 数据库内没这个用户也没这个客户 // 可能是新用户,也可能是新客户 $new_user = (new WeWorkApi('wework_addressbook'))->getUserById($v['msgfrom']); if ($new_user['errcode'] == 0) { //新用户 $new_user['department'] = !empty($new_user['department']) ? implode(',', $new_user['department']) : ''; $new_user['order_department'] = !empty($new_user['order']) ? implode(',', $new_user['order']) : ''; $new_user['is_leader_in_dept'] = !empty($new_user['is_leader_in_dept']) ? implode(',', $new_user['is_leader_in_dept']) : ''; $new_user['direct_leader'] = !empty($new_user['direct_leader']) ? implode(',', $new_user['direct_leader']) : ''; $new_user['extattr'] = !empty($new_user['extattr']) ? json_encode($new_user['extattr']) : ''; $new_user['external_profile'] = !empty($new_user['external_profile']) ? json_encode($new_user['external_profile']) : ''; // 添加新用户 (new UserModel())->insert($new_user); $user = $new_user; $receive_or_send = 2; } else { // 新客户 $new_customer = (new WeWorkApi('wework_customer'))->getCustomerDetailById($v['msgfrom']); if ($new_customer['errcode'] == 0) { // 存储外部联系人 $new_customer_data['userid'] = $toPeople; $new_customer_data['external_userid'] = $v['msgfrom']; $new_customer_data['status'] = 0; $new_customer_data['name'] = !empty($new_customer['external_contact']['name']) ? $new_customer['external_contact']['name'] : ''; $new_customer_data['avatar'] = !empty($new_customer['external_contact']['avatar']) ? $new_customer['external_contact']['avatar'] : ''; $new_customer_data['type'] = !empty($new_customer['external_contact']['type']) ? $new_customer['external_contact']['type'] : ''; $new_customer_data['gender'] = !empty($new_customer['external_contact']['gender']) ? $new_customer['external_contact']['gender'] : ''; $new_customer_data['unionid'] = !empty($new_customer['external_contact']['unionid']) ? $new_customer['external_contact']['unionid'] : ''; $new_customer_data['position'] = !empty($new_customer['external_contact']['position']) ? $new_customer['external_contact']['position'] : ''; $new_customer_data['corp_name'] = !empty($new_customer['external_contact']['corp_name']) ? $new_customer['external_contact']['corp_name'] : ''; $new_customer_data['corp_full_name'] = !empty($new_customer['external_contact']['corp_full_name']) ? $new_customer['external_contact']['corp_full_name'] : ''; $new_customer_data['external_profile'] = !empty($new_customer['external_contact']['external_profile']) ? json_encode($new_customer['external_contact']['external_profile']) : ''; if (!empty($new_customer['follow_user'])) { foreach ($new_customer['follow_user'] as $f_user) { if ($f_user['userid'] == $toPeople) { $new_customer_data['remark'] = !empty($f_user['remark']) ? $f_user['remark'] : ''; $new_customer_data['description'] = !empty($f_user['description']) ? $f_user['description'] : ''; $new_customer_data['createtime'] = !empty($f_user['createtime']) ? $f_user['createtime'] : ''; $new_customer_data['tags'] = !empty($f_user['tags']) ? json_encode($f_user['tags']) : ''; $new_customer_data['remark_corp_name'] = !empty($f_user['remark_corp_name']) ? $f_user['remark_corp_name'] : ''; $new_customer_data['remark_mobiles'] = !empty($f_user['remark_mobiles']) ? implode(',', $f_user['remark_mobiles']) : ''; $new_customer_data['add_way'] = !empty($f_user['add_way']) ? $f_user['add_way'] : ''; $new_customer_data['oper_userid'] = !empty($f_user['oper_userid']) ? $f_user['oper_userid'] : ''; $new_customer_data['state'] = !empty($f_user['state']) ? $f_user['state'] : ''; } } } // 添加到外部联系人 (new CustomerModel())->insert($new_customer_data); // 拿接收人ID去查用户 $user_find = (new UserModel())->where('userid', '=', $toPeople)->find(); if (!empty($user_find)) { $user = $user_find; $receive_or_send = 1; } else { // 从企业微信服务器拉取用户信息 $new_user = (new WeWorkApi('wework_addressbook'))->getUserById($toPeople); if ($new_user['errcode'] == 0) { //新用户 $new_user['department'] = !empty($new_user['department']) ? implode(',', $new_user['department']) : ''; $new_user['order_department'] = !empty($new_user['order']) ? implode(',', $new_user['order']) : ''; $new_user['is_leader_in_dept'] = !empty($new_user['is_leader_in_dept']) ? implode(',', $new_user['is_leader_in_dept']) : ''; $new_user['direct_leader'] = !empty($new_user['direct_leader']) ? implode(',', $new_user['direct_leader']) : ''; $new_user['extattr'] = !empty($new_user['extattr']) ? json_encode($new_user['extattr']) : ''; $new_user['external_profile'] = !empty($new_user['external_profile']) ? json_encode($new_user['external_profile']) : ''; // 添加新用户 (new UserModel())->insert($new_user); $user = $new_user; $receive_or_send = 1; } } } } } } } else { // 群聊 名片,红包暂不监控 } if (!empty($user)) { $content = ''; //推送消息内容 $sensitive_type = ''; //敏感行为类型 switch ($v['msgtype']) { case 'external_redpacket': if ($receive_or_send == 1) { // 收红包 $content = '客户刚刚给您发送红包已被记录为敏感行为,如有疑问请联系管理员。'; $sensitive_type = 2; } else { $content = '您刚刚给客户发送红包已被记录为敏感行为,如有疑问请联系管理员。'; $sensitive_type = 1; } break; case 'card': if (str_contains($v['msgid'], '_external')) { if ($receive_or_send == 1) { // 收名片 $content = '客户刚刚给您发送名片已被记录为敏感行为,如有疑问请联系管理员。'; $sensitive_type = 4; } else { $content = '您刚刚给客户发送名片已被记录为敏感行为,如有疑问请联系管理员。'; $sensitive_type = 3; } } break; default: break; } if ($content) { // 推送提醒 $api = new WeWorkApi('wework_app'); $api->sendMessage($user['userid'], $content); // 记录敏感行为 $data['userid'] = $user['userid']; $data['msgid'] = $v['msgid']; $data['type'] = $sensitive_type; $data['words_id'] = ''; $data['customer_id'] = ''; $data['room_id'] = ''; $data['status'] = 1; $data['createtime'] = time(); $save_data[] = $data; } } } } } // 存储敏感行为记录 (new SensitiveRecordModel())->saveAll($save_data); } }