123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- <?php
- namespace app\command;
- use app\model\WeworksingleChatFile;
- use app\model\WeworksingleChatRecord;
- use app\model\WeworksingleCompanySetting;
- use app\model\WeworksinglePullRecord;
- use think\console\Command;
- use think\console\Input;
- use think\console\Output;
- use think\facade\Config;
- use think\facade\Env;
- use think\facade\Log;
- use think\facade\Queue;
- use weworkapi\api\apiSingle;
- class WeworksinglePullChatRecord extends Command
- {
- protected function configure()
- {
- $this->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);
- }
- }
|