This commit is contained in:
2026-04-13 20:00:32 +08:00
parent 9393185f25
commit 24273db8dd
15 changed files with 992 additions and 237 deletions
+2 -2
View File
@@ -122,8 +122,8 @@ class Auth implements MiddlewareInterface
'config' => $config
]);
$IM = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'n1e5a6s6m7', // OpenIM密钥
'host' => config('openim.server'), // OpenIM API地址
'secret' => config('openim.secret'), // OpenIM密钥
]);
$request->IM = $IM;
$response = $next($request);
+872
View File
@@ -0,0 +1,872 @@
<?php
namespace app\command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
// 引入内置进度条类
use Symfony\Component\Console\Helper\ProgressBar;
use support\think\Db;
class MigrateMessages extends Command
{
protected static $defaultName = 'migrate:messages';
protected static $defaultDescription = '从老数据库迁移数据到新OpenIM数据库';
private $sdk = null;
private $oldManager = null;
private $newManager = null;
private $retry = 3;
private $delay = 2;
private $backupDir = '/vol3/1000/code/im/admin/backup';
private $currentBackup = null;
private $skipUsers = [];
private $skipGroups = [];
private $stats = [
'users' => ['total' => 0, 'success' => 0, 'failed' => 0],
'groups' => ['total' => 0, 'success' => 0, 'failed' => 0],
'members' => ['total' => 0, 'success' => 0, 'failed' => 0],
'messages' => ['total' => 0, 'success' => 0, 'failed' => 0, 'skipped' => 0],
];
protected function configure(): void
{
$this->addOption('step', 's', InputOption::VALUE_OPTIONAL, '执行步骤: users/groups/members/messages/all', 'all');
$this->addOption('skip-users', null, InputOption::VALUE_OPTIONAL, '跳过的用户ID(逗号分隔)');
$this->addOption('skip-groups', null, InputOption::VALUE_OPTIONAL, '跳过的群ID(逗号分隔)');
$this->addOption('clean', null, InputOption::VALUE_NONE, '清空现有数据后再迁移');
$this->addOption('retry', 'r', InputOption::VALUE_OPTIONAL, '失败重试次数', 3);
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$step = $input->getOption('step');
$skipUsers = $input->getOption('skip-users') ? explode(',', $input->getOption('skip-users')) : [];
$skipGroups = $input->getOption('skip-groups') ? explode(',', $input->getOption('skip-groups')) : [];
$clean = $input->getOption('clean');
$retry = (int)$input->getOption('retry');
// 自动忽略特殊用户
$defaultSkipUsers = ['group_bot', 'official_team', 'system','imAdmin'];
$skipUsers = array_merge($skipUsers, $defaultSkipUsers);
$this->skipUsers = array_unique($skipUsers);
$this->skipGroups = array_unique($skipGroups);
$this->retry = $retry;
$this->log($output, "╔════════════════════════════════════════════════════════════╗");
$this->log($output, "║ OpenIM 数据迁移工具 v2.0 ║");
$this->log($output, "╚════════════════════════════════════════════════════════════╝");
$this->log($output, "");
if ($clean) {
$this->log($output, "🗑️ 清理模式:会清空现有数据");
}
$this->log($output, "📍 执行步骤: {$step}");
$this->log($output, "");
if($step == 'restore'){
$this->restoreMongoDB($output, '/vol3/1000/code/im/admin/backup/openim_v3_groups_20260413141105.json');
return 0;
}
$this->cleanExistingData($output,[]);
try {
$this->initConnections($output);
//return 0 ;
if ($clean) {
$this->cleanExistingData($output,[
'conversation', 'conversation_version', // 会话相关集合
'data_version', // 数据版本集合
'friend', 'friend_request', 'friend_version', // 好友关系相关集合
'group', 'group_join_version','group_member','group_member_version','group_request', // 群组相关集合
'msg','seq','seq_user' // 消息和序列号相关集合
]);
return 0;
}
cache('admin_token_imAdmin',null);
$steps = $step === 'all' ? [
'users',
'friends',
'groups',
//'members',
'messages'
] : [$step];
foreach ($steps as $s) {
// 备份数据
$backupFile = $this->backupMongoDB($output, $s);
try {
switch ($s) {
case 'users':
$this->migrateUsers($output);
break;
case 'friends':
$this->migrateFriends($output);
break;
case 'groups':
$this->migrateGroups($output);
break;
case 'members':
$this->migrateGroupMembers($output);
break;
case 'messages':
$this->migrateMessages($output);
break;
}
} catch (\Exception $e) {
// 遇到错误,回滚数据
if (!empty($backupFile)) {
$this->restoreMongoDB($output, $backupFile);
}
throw $e;
}
}
$this->printStats($output);
return self::SUCCESS;
} catch (\Exception $e) {
$this->log($output, "❌ 错误: " . $e->getMessage());
//$this->log($output, $e->getTraceAsString());
return self::FAILURE;
}
}
private function migrateUsers(OutputInterface $output): void
{
//之前残留了一部分数据,是单向好友,这里没做删除,所以数据大小和之前的不一样,用户重新删除一次就好了
$this->log($output, "");
$this->log($output, "═════════════════ 步骤1: 迁移用户 ═════════════════");
$this->log($output, "清理旧的数据");
$this->cleanExistingData($output,[
'user'
]);
$user_list = (new \app\model\Openim\User())->setOption('connection','tettt')
->whereNotIn('user_id',$this->skipUsers)
->field('user_id,nickname,face_url')
->select();
$user_list = $user_list->toArray();
// 1. 创建进度条(内置核心方法)
$progressBar = new ProgressBar($output, count($user_list));
// 可选:设置进度条样式(字符、长度等)
$progressBar->setBarCharacter('█');
$progressBar->setEmptyBarCharacter('░');
$progressBar->setProgressCharacter('▶');
$progressBar->setBarWidth(400);
// 2. 开始显示
$progressBar->start();
echo sprintf("\r");
while(count($user_list) > 0){
$step = 100;
$user = array_slice($user_list,0,$step);
$user_list = array_slice($user_list,$step);
$this->sdk->user->userRegister($user);
$progressBar->advance($step);
}
// 4. 结束进度条
$progressBar->finish();
}
private function migrateFriends(OutputInterface $output): void
{
//之前残留了一部分数据,是单向好友,这里没做删除,所以数据大小和之前的不一样,用户重新删除一次就好了
$this->log($output, "");
$this->log($output, "═════════════════ 步骤3: 迁移好友 ═════════════════");
$this->log($output, "清理旧的数据");
// $this->cleanExistingData($output,[
// 'conversation', 'conversation_version', // 会话相关集合
// 'data_version', // 数据版本集合
// 'friend', 'friend_request', 'friend_version', // 好友关系相关集合
// 'group', 'group_join_version','group_member','group_member_version','group_request', // 群组相关集合
// 'msg','seq','seq_user' // 消息和序列号相关集合
// ]);
$user_list = (new \app\model\Openim\User())->setOption('connection','tettt')
->whereNotNull('user_id')
->column('user_id');
// 1. 创建进度条(内置核心方法)
$progressBar = new ProgressBar($output, count($user_list));
// 可选:设置进度条样式(字符、长度等)
$progressBar->setBarCharacter('█');
$progressBar->setEmptyBarCharacter('░');
$progressBar->setProgressCharacter('▶');
$progressBar->setBarWidth(400);
// 2. 开始显示
$progressBar->start();
foreach($user_list as $userID){
$friend_list = (new \app\model\Openim\Friend())->setOption('connection','tettt')
->where('owner_user_id',$userID)
->column('friend_user_id');
if(count($friend_list)){
while(count($friend_list)){
$_friend_list = array_slice($friend_list, 0, 500);
$friend_list = array_slice($friend_list, 500);
$this->sdk->friend->importFriend($userID,$_friend_list);
}
}
$progressBar->advance();
}
// 4. 结束进度条
$progressBar->finish();
}
private function migrateGroups(OutputInterface $output): void
{
$this->log($output, "");
$this->log($output, "═════════════════ 步骤2: 迁移群组 ═════════════════");
$this->log($output, "");
$options = [];
$groups = $this->queryOldDb('group', [], $options);
$this->stats['groups']['total'] = count($groups);
$this->log($output, "📊 找到 {$this->stats['groups']['total']} 个群组");
$processed = 0;
// 1. 创建进度条(内置核心方法)
$progressBar = new ProgressBar($output, count($groups));
// 可选:设置进度条样式(字符、长度等)
$progressBar->setBarCharacter('█');
$progressBar->setEmptyBarCharacter('░');
$progressBar->setProgressCharacter('▶');
$progressBar->setBarWidth(400);
// 2. 开始显示
$progressBar->start();
foreach ($groups as $group) {
$processed++;
$groupID = (string)($group['group_id'] ?? $group['groupID'] ?? '');
if (empty($groupID) || in_array($groupID, $this->skipGroups)) {
$this->stats['groups']['failed']++;
continue;
}
$ownerUserID = (string)($group['owner_user_id'] ?? $group['ownerUserID'] ?? $group['creator_user_id'] ?? $group['creatorUserID'] ?? '');
if (empty($ownerUserID)) {
$this->stats['groups']['failed']++;
continue;
}
$groupName = (string)($group['group_name'] ?? $group['groupName'] ?? '');
$faceURL = (string)($group['face_url'] ?? $group['faceURL'] ?? '');
$introduction = (string)($group['introduction'] ?? '');
$notification = (string)($group['notification'] ?? '');
$ex = (string)($group['ex'] ?? '');
// 群组设置字段
$groupType = (int)($group['group_type'] ?? $group['groupType'] ?? 2);
$needVerification = (int)($group['need_verification'] ?? $group['needVerification'] ?? 0);
$lookMemberInfo = (int)($group['look_member_info'] ?? $group['lookMemberInfo'] ?? 0);
$applyMemberFriend = (int)($group['apply_member_friend'] ?? $group['applyMemberFriend'] ?? 0);
$progress = sprintf("[群组 %d/%d]", $processed, $this->stats['groups']['total']);
if ($processed % 20 == 0 || $processed == 1) {
$this->log($output, "{$progress} 处理中...");
}
$this->log($output, "{$progress} 尝试创建群组: {$groupID}, 群主: {$ownerUserID}");
// 管理员信息
$adminUserIDs = (new \app\model\Openim\GroupMember())->setOption('connection','tettt')
->where('group_id',$groupID)
->where('role_level',60)
->column('user_id');
//cp($adminUserIDs );
// 成员信息
$memberUserIDs = (new \app\model\Openim\GroupMember())->setOption('connection','tettt')
->where('group_id',$groupID)
->where('role_level',20)
->column('user_id');
//cp($memberUserIDs );
$memberUserIDs = array_unique($memberUserIDs);
$_memberUserIDs = array_slice($memberUserIDs, 0, 10);
$memberUserIDs = array_slice($memberUserIDs, 10);
try {
$this->sdk->group->createGroup(
$ownerUserID,
$_memberUserIDs,
$adminUserIDs,
$groupName,
$groupID,
$faceURL,
$introduction,
$notification,
$ex,
$groupType,
$needVerification,
$lookMemberInfo,
$applyMemberFriend
);
while(count($memberUserIDs)){
$_memberUserIDs = array_slice($memberUserIDs, 0, 10);
$memberUserIDs = array_slice($memberUserIDs, 10);
try{
$this->sdk->group->inviteUserToGroup($groupID, $_memberUserIDs);
} catch (\Exception $e) {
$this->log($output, "{$progress} ❌ 邀请成员失败: " . $e->getMessage());
}
}
$this->stats['groups']['success']++;
//$this->log($output, "{$progress} ✅ 创建成功");
} catch (\Exception $e) {
$this->stats['groups']['failed']++;
if ($e->getCode() == 1202 || strpos($e->getMessage(), 'GroupIDExisted') !== false) {
$this->log($output, "{$progress} ️ 群组已存在,跳过创建");
$this->stats['groups']['success']++;
continue;
} else {
$this->log($output, "{$progress} ❌ 创建失败: " . $e->getMessage());
}
}
$progressBar->advance();
}
// 4. 结束进度条
$progressBar->finish();
}
private function migrateGroupMembers(OutputInterface $output): void
{
$this->log($output, "");
$this->log($output, "═════════════════ 步骤3: 迁移群成员 ═════════════════");
$this->log($output, "");
$groups = $this->queryOldDb('group', [], ['projection' => ['group_id' => 1, 'groupID' => 1]]);
$groupIDs = [];
foreach ($groups as $g) {
$gid = (string)($g['group_id'] ?? $g['groupID'] ?? '');
if (!empty($gid) && !in_array($gid, $this->skipGroups)) {
$groupIDs[] = $gid;
}
}
$totalMembers = 0;
foreach ($groupIDs as $groupID) {
$members = $this->queryOldDb('group_member', ['group_id' => $groupID]);
$ownerUserID = null;
$adminUserIDs = [];
$memberUserIDs = [];
foreach ($members as $member) {
$userID = (string)($member['user_id'] ?? $member['userID'] ?? '');
if (empty($userID)) continue;
$roleLevel = (int)($member['role_level'] ?? $member['roleLevel'] ?? 0);
if ($roleLevel == 100) {
$ownerUserID = $userID;
} elseif ($roleLevel == 60) {
$adminUserIDs[] = $userID;
} else {
$memberUserIDs[] = $userID;
}
}
if (empty($memberUserIDs) && empty($adminUserIDs)) {
continue;
}
$totalMembers += count($memberUserIDs);
$this->stats['members']['total'] += count($memberUserIDs);
$progress = sprintf("[群 %s 成员 %d]", $groupID, count($memberUserIDs));
$this->log($output, "{$progress} 处理中...");
// 分批邀请,每批最多50人
$batches = array_chunk($memberUserIDs, 50);
foreach ($batches as $batch) {
if (empty($batch)) {
continue;
}
$attempts = 0;
while ($attempts < $this->retry) {
try {
$this->log($output, "{$progress} 邀请成员: " . implode(', ', array_slice($batch, 0, 5)) . (count($batch) > 5 ? '...' : ''));
$result = $this->sdk->group->inviteUserToGroup($groupID, $ownerUserID ?? 'admin', $batch);
$this->log($output, "{$progress} API返回: " . json_encode($result, JSON_UNESCAPED_UNICODE));
if (isset($result['errCode']) && $result['errCode'] != 0) {
// 检查是否是重复键错误
if (strpos($result['errMsg'] ?? '', 'duplicate key') !== false || strpos($result['errMsg'] ?? '', 'DuplicateKey') !== false) {
$this->log($output, "{$progress} ️ 部分成员已存在,跳过");
$this->stats['members']['success'] += count($batch);
} else {
$this->stats['members']['failed'] += count($batch);
$this->log($output, "{$progress} ❌ 邀请失败: " . ($result['errMsg'] ?? '未知错误'));
}
} else {
$this->stats['members']['success'] += count($batch);
$this->log($output, "{$progress} ✅ 邀请成功");
}
break;
} catch (\Exception $e) {
$attempts++;
// 检查是否是重复键错误
if (strpos($e->getMessage(), 'duplicate key') !== false || strpos($e->getMessage(), 'DuplicateKey') !== false) {
$this->log($output, "{$progress} ️ 部分成员已存在,跳过");
$this->stats['members']['success'] += count($batch);
break;
} elseif ($attempts >= $this->retry) {
$this->stats['members']['failed'] += count($batch);
$this->log($output, "{$progress} ❌ 邀请异常: " . $e->getMessage());
} else {
$this->log($output, "{$progress} ⚠️ 邀请失败,第 {$attempts}/{$this->retry} 次重试...");
usleep(100000);
}
}
}
usleep(10000);
}
}
$this->log($output, "📊 共处理 {$totalMembers} 个群成员");
}
private function migrateMessages(OutputInterface $output): void
{
$this->log($output, "");
$this->log($output, "═════════════════ 步骤4: 迁移消息 ═════════════════");
$this->log($output, "");
$pipeline = [
['$unwind' => '$msgs'],
['$match' => ['msgs.msg' => ['$ne' => null]]],
['$sort' => ['msgs.msg.send_time' => 1]],
];
$pipeline[] = ['$project' => ['doc_id' => 1, 'msg' => '$msgs.msg']];
$command = new \MongoDB\Driver\Command([
'aggregate' => 'msg',
'pipeline' => $pipeline,
'cursor' => new \stdClass
]);
$cursor = $this->oldManager->executeCommand('tettt', $command);
$messages = [];
foreach ($cursor as $doc) {
$messages[] = $this->bsonToArray($doc);
}
$this->stats['messages']['total'] = count($messages);
$this->log($output, "📊 找到 {$this->stats['messages']['total']} 条消息");
$processed = 0;
foreach ($messages as $doc) {
$processed++;
$msg = $doc['msg'] ?? [];
if (empty($msg)) {
$this->stats['messages']['skipped']++;
continue;
}
$sendID = (string)($msg['send_id'] ?? $msg['sendID'] ?? '');
$recvID = (string)($msg['recv_id'] ?? $msg['recvID'] ?? '');
$groupID = (string)($msg['group_id'] ?? $msg['groupID'] ?? '');
$contentType = (int)($msg['content_type'] ?? $msg['contentType'] ?? 101);
$sessionType = (int)($msg['session_type'] ?? $msg['sessionType'] ?? 1);
if (in_array($sendID, $this->skipUsers)) {
$this->stats['messages']['skipped']++;
continue;
}
if ($sessionType == 3 && in_array($groupID, $this->skipGroups)) {
$this->stats['messages']['skipped']++;
continue;
}
// 跳过特殊消息类型(如系统通知等)
if (in_array($contentType, [200, 201, 202, 203, 204, 205])) {
$this->stats['messages']['skipped']++;
continue;
}
$progress = sprintf("[消息 %d/%d]", $processed, $this->stats['messages']['total']);
if ($processed % 100 == 0 || $processed == 1) {
$this->log($output, "{$progress} 处理中...");
}
try {
$this->log($output, "{$progress} 发送消息: sendID={$sendID}, recvID={$recvID}, groupID={$groupID}, contentType={$contentType}, sessionType={$sessionType}");
$result = $this->sendMessage($msg);
$this->log($output, "{$progress} API返回: " . json_encode($result, JSON_UNESCAPED_UNICODE));
if ($result['success'] ?? false) {
$this->stats['messages']['success']++;
if ($processed % 100 == 0) {
$this->log($output, "{$progress} ✅ 发送成功");
}
} else {
$this->stats['messages']['failed']++;
$this->log($output, "{$progress} ❌ 发送失败: " . ($result['errMsg'] ?? '未知错误'));
// 遇到NotInGroupYetError时跳过,继续迁移其他消息
if (strpos(($result['errMsg'] ?? ''), 'NotInGroupYetError') === false) {
// 遇到其他错误时退出
throw new \Exception("消息发送失败: " . ($result['errMsg'] ?? '未知错误'));
} else {
$this->log($output, "{$progress} ️ 跳过NotInGroupYetError错误,继续迁移");
}
}
} catch (\Exception $e) {
$this->stats['messages']['failed']++;
$this->log($output, "{$progress} ❌ 发送异常: " . $e->getMessage());
// 遇到NotInGroupYetError异常时跳过,继续迁移其他消息
if (strpos($e->getMessage(), 'NotInGroupYetError') === false) {
// 遇到其他异常时退出
throw $e;
} else {
$this->log($output, "{$progress} ️ 跳过NotInGroupYetError异常,继续迁移");
}
}
if ($this->delay > 0) {
usleep($this->delay * 1000);
}
}
}
private function sendMessage(array $msg): array
{
$sendID = (string)($msg['send_id'] ?? $msg['sendID'] ?? '');
$recvID = (string)($msg['recv_id'] ?? $msg['recvID'] ?? '');
$groupID = (string)($msg['group_id'] ?? $msg['groupID'] ?? '');
$contentType = (int)($msg['content_type'] ?? $msg['contentType'] ?? 101);
$sessionType = (int)($msg['session_type'] ?? $msg['sessionType'] ?? 1);
$sendTime = (int)($msg['send_time'] ?? $msg['sendTime'] ?? 0);
$content = $msg['content'] ?? '';
$ex = (string)($msg['ex'] ?? '');
if (empty($sendID)) {
return ['success' => false, 'errMsg' => 'sendID为空'];
}
$contentData = $this->parseContent($content, $contentType);
// 构建消息数据
$messageData = [
'content' => $contentData,
'contentType' => $contentType,
'sendTime' => $sendTime,
'ex' => $ex,
'isOnlineOnly' => false,
'notOfflinePush' => true
];
// 根据会话类型调用不同的发送方法
if ($sessionType == 1 && !empty($recvID)) {
// 单聊
$result = $this->sdk->message->sendSingleMessage($sendID, $recvID, $messageData);
} elseif (!empty($groupID)) {
// 群聊
$result = $this->sdk->message->sendGroupMessage($sendID, $groupID, $messageData);
} else {
return ['success' => false, 'errMsg' => '缺少必要的参数'];
}
return [
'success' => !($result['errCode'] ?? 0),
'errMsg' => $result['errMsg'] ?? ''
];
}
private function parseContent($content, int $contentType): array
{
if (is_string($content)) {
$decoded = json_decode($content, true);
if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) {
return $decoded;
}
return ['content' => $content, 'text' => $content];
}
if (is_array($content)) {
return $content;
}
return ['content' => '', 'text' => ''];
}
private function bsonToArray($data): array
{
if ($data instanceof \MongoDB\Model\BSONArray) {
return $data->getArrayCopy();
}
if ($data instanceof \MongoDB\Model\BSONDocument) {
return $data->getArrayCopy();
}
if (is_object($data)) {
return json_decode(json_encode($data), true);
}
return is_array($data) ? $data : [];
}
private function printStats(OutputInterface $output): void
{
$this->log($output, "");
$this->log($output, "╔════════════════════════════════════════════════════════════╗");
$this->log($output, "║ 迁移统计报告 ║");
$this->log($output, "╠════════════════════════════════════════════════════════════╣");
$this->log($output, "║ 用户: 总数 {$this->stats['users']['total']}, 成功 {$this->stats['users']['success']}, 失败 {$this->stats['users']['failed']}");
$this->log($output, "║ 群组: 总数 {$this->stats['groups']['total']}, 成功 {$this->stats['groups']['success']}, 失败 {$this->stats['groups']['failed']}");
$this->log($output, "║ 成员: 总数 {$this->stats['members']['total']}, 成功 {$this->stats['members']['success']}, 失败 {$this->stats['members']['failed']}");
$this->log($output, "║ 消息: 总数 {$this->stats['messages']['total']}, 成功 {$this->stats['messages']['success']}, 失败 {$this->stats['messages']['failed']}, 跳过 {$this->stats['messages']['skipped']}");
$this->log($output, "╚════════════════════════════════════════════════════════════╝");
}
private function log(OutputInterface $output, string $message): void
{
$output->writeln($message);
}
/**
* 获取OpenIM SDK实例
*
* @return object
*/
function getSdk()
{
if ($this->sdk) {
return $this->sdk;
}
$this->sdk = new \support\OpenImSdk\Client([
'host' => config('openim.server'),
'secret' => config('openim.secret'),
]);
return $this->sdk;
}
private function initConnections(OutputInterface $output): void
{
$this->log($output, "正在初始化连接...");
$this->getSdk();
$uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/tettt?authSource=admin';
$this->oldManager = new \MongoDB\Driver\Manager($uri);
$this->log($output, "✅ 连接成功");
}
private function cleanExistingData(OutputInterface $output,$collections=[]): void
{
// 记录开始清理数据的日志信息
$this->log($output, "\n═════════════════ 清理现有数据 ═════════════════");
$this->log($output, "");
// 构建新数据库(OpenIM v3)的MongoDB连接URI
$uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/openim_v3?authSource=admin';
// 创建MongoDB驱动管理器实例,用于操作新数据库
$this->newManager = new \MongoDB\Driver\Manager($uri);
try {
// 记录开始清理数据的状态
$this->log($output, "正在清理mongodb数据...");
// 定义需要清空的数据集合列表(保留user集合,清空其他所有业务数据)
// 遍历所有需要清理的集合,逐个执行清空操作
foreach ($collections as $collection) {
try {
// 创建批量写入操作对象
$bulk = new \MongoDB\Driver\BulkWrite;
// 添加删除所有文档的操作(空条件表示删除全部)
$bulk->delete([]);
// 执行批量删除操作,指定数据库和集合名称
$this->newManager->executeBulkWrite('openim_v3.' . $collection, $bulk);
// 记录该集合清空成功的日志
$this->log($output, "已清空集合: {$collection}");
} catch (\Exception $e) {
// 单个集合清空失败时记录警告信息,不影响其他集合的清理
$this->log($output, "⚠️ 清空集合 {$collection} 失败: " . $e->getMessage());
}
}
$this->log($output, "正在清理redis数据...");
$redis = new \Redis();
$host = '127.0.0.1';
$port = 16379;
$password = 'n1e5a6s6m7';
$output->writeln("连接 Redis: {$host}:{$port}");
if ($redis->connect($host, $port)) {
if (!empty($password)) {
$redis->auth($password);
}
$result = $redis->flushAll();
if ($result) {
$output->writeln("✅ Redis 清空成功");
} else {
$output->writeln("❌ Redis 清空失败");
}
} else {
$output->writeln("❌ 无法连接到 Redis");
}
// 记录所有数据清理完成的日志
$this->log($output, "✅ 数据清理完成");
} catch (\Exception $e) {
// 捕获整体清理过程中的异常,记录错误但不抛出,确保程序继续执行
$this->log($output, "❌ 清理数据失败: " . $e->getMessage());
// 不抛出异常,继续执行
}
}
private function queryOldDb(string $collection, array $filter = [], array $options = []): array
{
$query = new \MongoDB\Driver\Query($filter, $options);
$cursor = $this->oldManager->executeQuery('tettt.' . $collection, $query);
$result = [];
foreach ($cursor as $doc) {
$result[] = $this->bsonToArray($doc);
}
return $result;
}
/**
* 备份MongoDB数据
* @param OutputInterface $output
* @param string $step
* @return string
*/
private function backupMongoDB(OutputInterface $output, string $step): string
{
$this->log($output, "═════════════════ 备份MongoDB数据 ═════════════════");
// 确保备份目录存在
if (!is_dir($this->backupDir)) {
mkdir($this->backupDir, 0755, true);
}
// 生成备份文件名
$timestamp = date('YmdHis');
$backupFile = "{$this->backupDir}/openim_v3_{$step}_{$timestamp}.json";
try {
// 使用现有的新数据库连接
if (!$this->newManager) {
$uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/openim_v3?authSource=admin';
$this->newManager = new \MongoDB\Driver\Manager($uri);
}
// 获取所有集合
$command = new \MongoDB\Driver\Command(['listCollections' => 1]);
$cursor = $this->newManager->executeCommand('openim_v3', $command);
$collections = $cursor->toArray();
//$this->log($output, "找到 " . count($collections) . " 个集合");
$backupData = [];
// 备份每个集合
foreach ($collections as $collection) {
$collectionName = $collection->name;
if (in_array($collectionName, ['system.indexes', 'system.profile'])) {
continue;
}
//$this->log($output, "备份集合: {$collectionName}");
$query = new \MongoDB\Driver\Query([]);
$cursor = $this->newManager->executeQuery('openim_v3.' . $collectionName, $query);
$documents = [];
foreach ($cursor as $doc) {
$document = $this->bsonToArray($doc);
// 处理ObjectId
if (isset($document['_id']) && is_array($document['_id']) && isset($document['_id']['$oid'])) {
$document['_id'] = $document['_id']['$oid'];
}
$documents[] = $document;
}
if (!empty($documents)) {
$backupData[$collectionName] = $documents;
//$this->log($output, " - 备份了 " . count($documents) . " 条记录");
}
}
// 保存备份文件
file_put_contents($backupFile, json_encode($backupData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
$this->log($output, "✅ 备份成功: {$backupFile} (" . filesize($backupFile) . " 字节)");
$this->currentBackup = $backupFile;
return $backupFile;
} catch (\Exception $e) {
$this->log($output, "❌ 备份失败: " . $e->getMessage());
return '';
}
}
/**
* 回滚MongoDB数据
* @param OutputInterface $output
* @param string $backupFile
* @return bool
*/
private function restoreMongoDB(OutputInterface $output, string $backupFile): bool
{
$this->log($output, "═════════════════ 回滚MongoDB数据 ═════════════════");
if (!file_exists($backupFile)) {
$this->log($output, "❌ 备份文件不存在: {$backupFile}");
return false;
}
try {
// 读取备份文件
$backupData = json_decode(file_get_contents($backupFile), true);
if (empty($backupData)) {
$this->log($output, "❌ 备份文件为空");
return false;
}
// 连接到新数据库
$uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/openim_v3?authSource=admin';
$manager = new \MongoDB\Driver\Manager($uri);
// 清空所有集合
$this->log($output, "清空现有数据...");
foreach (array_keys($backupData) as $collectionName) {
$bulk = new \MongoDB\Driver\BulkWrite;
$bulk->delete([]);
$manager->executeBulkWrite('openim_v3.' . $collectionName, $bulk);
}
// 恢复数据
foreach ($backupData as $collectionName => $documents) {
$documentCount = count($documents);
$this->log($output, "恢复集合: {$collectionName} ({$documentCount} 条记录)");
$bulk = new \MongoDB\Driver\BulkWrite;
foreach ($documents as $document) {
// 处理_id字段
if (isset($document['_id']) && is_string($document['_id'])) {
// 尝试创建ObjectId
try {
$document['_id'] = new \MongoDB\BSON\ObjectId($document['_id']);
} catch (\Exception $e) {
// 如果不是有效的ObjectId格式,保持原样
}
}
$bulk->insert($document);
}
$result = $manager->executeBulkWrite('openim_v3.' . $collectionName, $bulk);
$this->log($output, "恢复成功: {$result->getInsertedCount()} 条记录");
}
$this->log($output, "✅ 回滚成功");
return true;
} catch (\Exception $e) {
$this->log($output, "❌ 回滚失败: " . $e->getMessage());
return false;
}
}
}
+2 -2
View File
@@ -1575,8 +1575,8 @@ class Openim extends Command
}
$this->sdk = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002',
'secret' => 'n1e5a6s6m7',
'host' => config('openim.server'),
'secret' => config('openim.secret'),
]);
return $this->sdk;
+2 -6
View File
@@ -49,10 +49,6 @@ class User extends Command
return 0;
}
function login(InputInterface $input, OutputInterface $output){
// $IM = new \support\OpenImSdk\Client([
// 'host' => 'http://127.0.0.1:10002', // OpenIM API地址
// 'secret' => 'n1e5a6s6m7', // OpenIM密钥
// ]);
$user_id = $input->getOption('user_id');
if(!$user_id){
return false;
@@ -133,8 +129,8 @@ class User extends Command
return $this->sdk;
}
$this->sdk = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'n1e5a6s6m7', // OpenIM密钥
'host' => config('openim.server'), // OpenIM API地址
'secret' => config('openim.secret'), // OpenIM密钥
]);
return $this->sdk;
}
+4 -4
View File
@@ -21,8 +21,8 @@ class HookController{
$nickname= Input('nickname');
$users = Input('users');
$im = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'n1e5a6s6m7', // OpenIM密钥
'host' => config('openim.server'), // OpenIM API地址
'secret' => config('openim.secret'), // OpenIM密钥
]);
foreach($users as $k=>$v){
@@ -374,8 +374,8 @@ class HookController{
return $this->sdk;
}
$this->sdk = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'n1e5a6s6m7', // OpenIM密钥
'host' => config('openim.server'), // OpenIM API地址
'secret' => config('openim.secret'), // OpenIM密钥
]);
return $this->sdk;
}
+6
View File
@@ -0,0 +1,6 @@
<?php
return [
'server' => 'http://127.0.0.1:10002',
'admin' => 'imAdmin',
'secret' => 'n1e5a6s6m7',
];
+2 -2
View File
@@ -24,8 +24,8 @@ class OpenimBase extends Crud
return $this->sdk;
}
$this->sdk = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'n1e5a6s6m7', // OpenIM密钥
'host' => config('openim.server'), // OpenIM API地址
'secret' => config('openim.secret'), // OpenIM密钥
]);
return $this->sdk;
}
+2 -2
View File
@@ -35,8 +35,8 @@ class Config implements MiddlewareInterface
'config' => $config
]);
$IM = new \support\OpenImSdk\Client([
'host' => 'http://127.0.0.1:10002', // OpenIM API地址
'secret' => 'n1e5a6s6m7', // OpenIM密钥
'host' => config('openim.server'), // OpenIM API地址
'secret' => config('openim.secret'), // OpenIM密钥
]);
$request->IM = $IM;
return $handler($request);
+5 -10
View File
@@ -20,7 +20,7 @@ class Auth
'userID' => $userID,
'secret' => Config::getSecret()
];
return Utils::send(Url::$getAdminToken, $data, '获取管理员token错误');
return Utils::send(Url::$getAdminToken, $data);
}
/**
@@ -34,7 +34,7 @@ class Auth
{
// 获取管理员token
$platformID = Utils::getPlatformId( $platformID );
return Utils::send(Url::$getUserToken, ['userID' => $userID, 'platformID' => $platformID], '获取用户token错误');
return Utils::send(Url::$getUserToken, ['userID' => $userID, 'platformID' => $platformID]);
}
/**
@@ -45,13 +45,10 @@ class Auth
*/
public function forceLogout(string $userID, string $platformID = 'android'): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
// 清除本地缓存的用户token
Utils::clearToken($userID);
$platformID = Utils::getPlatformId( $platformID );
return Utils::send(Url::$forceLogout, ['userID' => $userID, 'platformID' => $platformID], '强制登出错误', $adminToken);
return Utils::send(Url::$forceLogout, ['userID' => $userID, 'platformID' => $platformID]);
}
/**
@@ -61,7 +58,7 @@ class Auth
*/
public function parseToken(string $token): array
{
return Utils::send(Url::$parseToken, [], '解析当前用户token错误', $token);
return Utils::send(Url::$parseToken, []);
}
@@ -72,8 +69,6 @@ class Auth
*/
public function userToken(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$userToken, ['userID' => $userID], '用户登录错误', $adminToken);
return Utils::send(Url::$userToken, ['userID' => $userID]);
}
}
+3 -9
View File
@@ -16,8 +16,6 @@ class Conversation
*/
public function getOwnerConversation(string $userID, int $pageNumber = 1, int $showNumber = 20): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'userID' => $userID,
'pagination' => [
@@ -25,7 +23,7 @@ class Conversation
'showNumber' => $showNumber
]
];
return Utils::send(Url::$getOwnerConversation, $data, '获取当前用户分页会话列表失败', $adminToken);
return Utils::send(Url::$getOwnerConversation, $data);
}
/**
@@ -35,8 +33,6 @@ class Conversation
*/
public function getSortedConversationList(string $userID,$conversationIDs='',int $page=1,int $pagesize=10): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getSortedConversationList, [
'userID' => $userID,
'conversationIDs' => $conversationIDs,
@@ -44,7 +40,7 @@ class Conversation
'pageNumber' => $page,
'showNumber' => $pagesize
]
], '获取排序的会话列表失败', $adminToken);
]);
}
/**
@@ -63,8 +59,6 @@ class Conversation
*/
public function setConversations(string $conversationID, array $userIDs, int $recvMsgOpt = 0, bool $isPinned = false, bool $isPrivateChat = false, int $groupAtType = 0, string $ex = '', bool $isMsgDestruct = false, int $msgDestructTime = 0, int $burnDuration = 0): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'conversationID' => $conversationID,
'userIDs' => $userIDs,
@@ -79,6 +73,6 @@ class Conversation
'burnDuration' => $burnDuration
]
];
return Utils::send(Url::$setConversations, $data, '为多个用户设置相同会话ID的字段失败', $adminToken);
return Utils::send(Url::$setConversations, $data);
}
}
+16 -40
View File
@@ -15,10 +15,8 @@ class Friend
*/
public function addBlack(string $ownerUserID, string $blackUserID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['ownerUserID' => $ownerUserID, 'blackUserID' => $blackUserID];
return Utils::send(Url::$addBlack, $data, '添加黑名单错误', $adminToken);
return Utils::send(Url::$addBlack, $data);
}
/**
@@ -30,12 +28,12 @@ class Friend
*/
public function addFriend(string $fromUserID, string $toUserID, string $reqMsg): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['fromUserID' => $fromUserID, 'toUserID' => $toUserID, 'reqMsg' => $reqMsg];
return Utils::send(Url::$addFriend, $data, '添加好友错误', $adminToken);
return Utils::send(Url::$addFriend, $data);
}
/**
* 同意/拒绝好友请求
* @param string $ownerUserID 处理者ID
@@ -46,15 +44,13 @@ class Friend
*/
public function addFriendResponse(string $ownerUserID, string $friendUserID, string $handleMsg, int $handleResult): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'ownerUserID' => $ownerUserID,
'friendUserID' => $friendUserID,
'handleMsg' => $handleMsg,
'handleResult' => $handleResult
];
return Utils::send(Url::$addFriendResponse, $data, '同意/拒绝好友请求错误', $adminToken);
return Utils::send(Url::$addFriendResponse, $data);
}
/**
@@ -65,10 +61,8 @@ class Friend
*/
public function deleteFriend(string $ownerUserID, string $friendUserID): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['ownerUserID' => $ownerUserID, 'friendUserID' => $friendUserID];
return Utils::send(Url::$deleteFriend, $data, '删除好友错误', $adminToken);
return Utils::send(Url::$deleteFriend, $data);
}
/**
@@ -78,9 +72,7 @@ class Friend
*/
public function getBlackList(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getBlackList, ['userID' => $userID], '获取黑名单列表错误', $adminToken);
return Utils::send(Url::$getBlackList, ['userID' => $userID]);
}
/**
@@ -90,9 +82,7 @@ class Friend
*/
public function getFriendApplyList(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getFriendApplyList, ['userID' => $userID], '获取好友申请列表错误', $adminToken);
return Utils::send(Url::$getFriendApplyList, ['userID' => $userID]);
}
/**
@@ -102,15 +92,13 @@ class Friend
*/
public function getFriendList(string $userID,$page=1,$pagesize=1000): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getFriendList, [
'userID' => $userID,
"pagination" => [
"pageNumber" => $page,
"showNumber" => $pagesize
]
], '获取用户的好友列表错误', $adminToken);
]);
}
/**
@@ -120,9 +108,7 @@ class Friend
*/
public function getSelfFriendApplyList(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getSelfFriendApplyList, ['userID' => $userID], '获取自己的好友申请列表错误', $adminToken);
return Utils::send(Url::$getSelfFriendApplyList, ['userID' => $userID]);
}
/**
@@ -131,12 +117,10 @@ class Friend
* @param array $friendUserIDs 好友ID列表
* @return array
*/
public function importFriend(string $ownerUserID, array $friendUserIDs = []): array
public function importFriend(string $ownerUserID, array $friendUserIDs = []): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['ownerUserID' => $ownerUserID, 'friendUserIDs' => $friendUserIDs];
return Utils::send(Url::$importFriend, $data, '批量导入好友错误', $adminToken);
return Utils::send(Url::$importFriend, $data);
}
/**
@@ -147,10 +131,8 @@ class Friend
*/
public function isFriend(string $userID1, string $userID2): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['userID1' => $userID1, 'userID2' => $userID2];
return Utils::send(Url::$isFriend, $data, '检查用户之间是否为好友错误', $adminToken);
return Utils::send(Url::$isFriend, $data);
}
/**
@@ -161,10 +143,8 @@ class Friend
*/
public function removeBlack(string $ownerUserID, string $blackUserID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['ownerUserID' => $ownerUserID, 'blackUserID' => $blackUserID];
return Utils::send(Url::$removeBlack, $data, '把用户移除黑名单错误', $adminToken);
return Utils::send(Url::$removeBlack, $data);
}
/**
@@ -176,10 +156,8 @@ class Friend
*/
public function setFriendRemark(string $fromUserID, string $toUserID, string $remark): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['fromUserID' => $fromUserID, 'toUserID' => $toUserID, 'remark' => $remark];
return Utils::send(Url::$setFriendRemark, $data, '设置好友备注错误', $adminToken);
return Utils::send(Url::$setFriendRemark, $data);
}
/**
@@ -193,8 +171,6 @@ class Friend
*/
public function updateFriends(string $ownerUserID, string $friendUserID, string $remark = '', bool $isPinned = false, string $ex = ''): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'ownerUserID' => $ownerUserID,
'friendUserID' => $friendUserID
@@ -213,6 +189,6 @@ class Friend
$data['ex'] = $ex;
}
return Utils::send(Url::$updateFriends, $data, '更新好友信息失败', $adminToken);
return Utils::send(Url::$updateFriends, $data);
}
}
+28 -67
View File
@@ -31,8 +31,6 @@ class Group
string $groupID = '', string $faceURL = '', string $introduction = '', string $notification = '',
string $ex = '', int $groupType = 2, int $needVerification = 0, int $lookMemberInfo = 0, int $applyMemberFriend = 0): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'ownerUserID' => $ownerUserID,
'memberUserIDs' => $memberUserIDs,
@@ -50,25 +48,26 @@ class Group
'applyMemberFriend' => $applyMemberFriend
]
];
return Utils::send(Url::$createGroup, $data, '创建群组失败', $adminToken);
return Utils::send(Url::$createGroup, $data);
}
/**
* 申请加入群组
* @param string $token 用户token
* @param string $inviterUserID 用户ID
* @param string $groupID 群组ID
* @param string $reqMsg 申请消息
* @param int $joinSource 加入来源
* @return array
*/
public function joinGroup(string $token, string $groupID, string $reqMsg = '', int $joinSource = 0): array
public function joinGroup(string $inviterUserID, string $groupID, string $reqMsg = '', int $joinSource = 0): array
{
$data = [
'inviterUserID' => $inviterUserID,
'groupID' => $groupID,
'reqMsg' => $reqMsg,
'reqMessage' => $reqMsg,
'joinSource' => $joinSource
];
return Utils::send(Url::$joinGroup, $data, '申请加入群组失败', $token);
return Utils::send(Url::$joinGroup, $data);
}
/**
@@ -79,7 +78,7 @@ class Group
*/
public function quitGroup(string $token, string $groupID): array
{
return Utils::send(Url::$quitGroup, ['groupID' => $groupID], '退出群组失败', $token);
return Utils::send(Url::$quitGroup, ['groupID' => $groupID]);
}
/**
@@ -89,9 +88,7 @@ class Group
*/
public function getGroupsInfo(array $groupIDs): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getGroupsInfo, ['groupIDs' => $groupIDs], '获取群组信息失败', $adminToken);
return Utils::send(Url::$getGroupsInfo, ['groupIDs' => $groupIDs]);
}
/**
@@ -113,7 +110,7 @@ class Group
'showNumber' => $pagesize
]
];
return Utils::send(Url::$getGroupMemberList, $data, '获取群成员列表失败');
return Utils::send(Url::$getGroupMemberList, $data);
}
/**
@@ -124,34 +121,28 @@ class Group
*/
public function getGroupMembersInfo(string $groupID, array $userIDs): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'userIDs' => $userIDs
];
return Utils::send(Url::$getGroupMembersInfo, $data, '获取指定群成员信息失败', $adminToken);
return Utils::send(Url::$getGroupMembersInfo, $data);
}
/**
* 将用户拉入群组
* @param string $groupID 群组ID
* @param string $inviterUserID 邀请者ID
* @param array $invitedUserIDList 被邀请的用户ID列表
* @param string $reason 邀请原因
* @return array
*/
public function inviteUserToGroup(string $groupID, string $inviterUserID, array $invitedUserIDList, string $reason = ''): array
public function inviteUserToGroup(string $groupID, array $invitedUserIDList, string $reason = ''): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'inviterUserID' => $inviterUserID,
'invitedUserIDList' => $invitedUserIDList,
'invitedUserIDs' => $invitedUserIDList,
'reason' => $reason,
];
return Utils::send(Url::$inviteUserToGroup, $data, '将用户拉入群组失败', $adminToken);
return Utils::send(Url::$inviteUserToGroup, $data);
}
/**
@@ -164,15 +155,13 @@ class Group
*/
public function kickGroupMember(string $groupID, string $kickUserID, array $kickedUserIDs, string $reason = ''): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'kickUserID' => $kickUserID,
'kickedUserIDs' => $kickedUserIDs,
'reason' => $reason
];
return Utils::send(Url::$kickGroupMember, $data, '踢出群成员失败', $adminToken);
return Utils::send(Url::$kickGroupMember, $data);
}
/**
@@ -184,14 +173,12 @@ class Group
*/
public function transferGroupOwner(string $groupID, string $oldOwnerUserID, string $newOwnerUserID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'oldOwnerUserID' => $oldOwnerUserID,
'newOwnerUserID' => $newOwnerUserID
];
return Utils::send(Url::$transferGroupOwner, $data, '转让群主失败', $adminToken);
return Utils::send(Url::$transferGroupOwner, $data);
}
/**
@@ -201,9 +188,7 @@ class Group
*/
public function getJoinedGroupList(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getJoinedGroupList, ['userID' => $userID], '获取用户加入的群组列表失败', $adminToken);
return Utils::send(Url::$getJoinedGroupList, ['userID' => $userID]);
}
/**
@@ -213,9 +198,7 @@ class Group
*/
public function dismissGroup(string $groupID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$dismissGroup, ['groupID' => $groupID], '解散群组失败', $adminToken);
return Utils::send(Url::$dismissGroup, ['groupID' => $groupID]);
}
/**
@@ -227,14 +210,12 @@ class Group
*/
public function setGroupMemberNickname(string $groupID, string $userID, string $nickname): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'userID' => $userID,
'nickname' => $nickname
];
return Utils::send(Url::$setGroupMemberNickname, $data, '设置群成员昵称失败', $adminToken);
return Utils::send(Url::$setGroupMemberNickname, $data);
}
/**
@@ -246,13 +227,11 @@ class Group
*/
public function setGroupMemberInfo(string $groupID, string $userID, array $data): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = array_merge([
'groupID' => $groupID,
'userID' => $userID
], $data);
return Utils::send(Url::$setGroupMemberInfo, $data, '设置群成员信息失败', $adminToken);
return Utils::send(Url::$setGroupMemberInfo, $data);
}
/**
@@ -262,9 +241,7 @@ class Group
*/
public function getGroupMemberUserIDs(string $groupID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getGroupMemberUserIDs, ['groupID' => $groupID], '获取群成员用户ID列表失败', $adminToken);
return Utils::send(Url::$getGroupMemberUserIDs, ['groupID' => $groupID]);
}
/**
@@ -276,8 +253,6 @@ class Group
*/
public function getGroupAllMemberList(string $groupID, int $offset = 0, int $count = 100): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'pagination' => [
@@ -285,7 +260,7 @@ class Group
'showNumber' => $count
]
];
return Utils::send(Url::$getGroupAllMemberList, $data, '获取群成员列表失败', $adminToken);
return Utils::send(Url::$getGroupAllMemberList, $data);
}
/**
@@ -295,9 +270,7 @@ class Group
*/
public function getUserReqGroupApplicationList(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getUserReqGroupApplicationList, ['userID' => $userID], '获取用户加群申请列表失败', $adminToken);
return Utils::send(Url::$getUserReqGroupApplicationList, ['userID' => $userID]);
}
/**
@@ -308,13 +281,11 @@ class Group
*/
public function getGroupApplicationListByUserID(string $groupID, array $userIDs): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'userIDs' => $userIDs
];
return Utils::send(Url::$getGroupUsersReqApplicationList, $data, '获取指定用户对指定群组的加群请求失败', $adminToken);
return Utils::send(Url::$getGroupUsersReqApplicationList, $data);
}
/**
@@ -328,8 +299,6 @@ class Group
*/
public function groupApplicationResponse(string $groupID, string $fromUserID, string $handledUserID, int $handleResult, string $handleMsg = ''): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'groupID' => $groupID,
'fromUserID' => $fromUserID,
@@ -337,7 +306,7 @@ class Group
'handleResult' => $handleResult,
'handleMsg' => $handleMsg
];
return Utils::send(Url::$groupApplicationResponse, $data, '处理群组申请失败', $adminToken);
return Utils::send(Url::$groupApplicationResponse, $data);
}
/**
@@ -347,9 +316,7 @@ class Group
*/
public function muteGroup(string $groupID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$muteGroup, ['groupID' => $groupID], '禁言群组失败', $adminToken);
return Utils::send(Url::$muteGroup, ['groupID' => $groupID]);
}
/**
@@ -359,9 +326,7 @@ class Group
*/
public function cancelMuteGroup(string $groupID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$cancelMuteGroup, ['groupID' => $groupID], '取消禁言群组失败', $adminToken);
return Utils::send(Url::$cancelMuteGroup, ['groupID' => $groupID]);
}
/**
@@ -373,10 +338,8 @@ class Group
*/
public function muteGroupMember(string $groupID, string $userID, int $mutedSeconds = 0): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['groupID' => $groupID, 'userID' => $userID, 'mutedSeconds' => $mutedSeconds];
return Utils::send(Url::$muteGroupMember, $data, '禁言群成员失败', $adminToken);
return Utils::send(Url::$muteGroupMember, $data);
}
/**
@@ -387,9 +350,7 @@ class Group
*/
public function cancelMuteGroupMember(string $groupID, string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = ['groupID' => $groupID, 'userID' => $userID];
return Utils::send(Url::$cancelMuteGroupMember, $data, '取消禁言群成员失败', $adminToken);
return Utils::send(Url::$cancelMuteGroupMember, $data);
}
}
+9 -25
View File
@@ -68,8 +68,6 @@ class Message
*/
public function sendMsg(string $sendID, string $recvID = '', string $groupID = '', string $senderNickname = '', string $senderFaceURL = '', int $senderPlatformID = 1, array $content = [], int $contentType = 101, int $sessionType = 1, bool $isOnlineOnly = false, bool $notOfflinePush = false, int $sendTime = 0, array $offlinePushInfo = [], string $ex = ''): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'sendID' => $sendID,
'senderNickname' => $senderNickname,
@@ -106,7 +104,7 @@ class Message
$data['offlinePushInfo'] = $offlinePushInfo;
}
return Utils::send(Url::$sendMsg, $data, '发送消息失败', $adminToken);
return Utils::send(Url::$sendMsg, $data);
}
/**
@@ -121,8 +119,6 @@ class Message
*/
public function batchSendMsg(string $sendID, string $senderNickname, string $senderFaceURL, int $sessionType, int $contentType, string $content): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'senderPlatformID' => 0,
'sendID' => $sendID,
@@ -132,7 +128,7 @@ class Message
'contentType' => $contentType,
'content' => ['text' => $content]
];
return Utils::send(Url::$batchSendMsg, $data, '批量发送消息失败', $adminToken);
return Utils::send(Url::$batchSendMsg, $data);
}
/**
@@ -142,9 +138,7 @@ class Message
*/
public function clearMsg(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$clearMsg, ['userID' => $userID], '清空用户消息失败', $adminToken);
return Utils::send(Url::$clearMsg, ['userID' => $userID]);
}
/**
@@ -156,14 +150,12 @@ class Message
*/
public function delMsg(string $userID, string $conversationID, array $seqs): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'userID' => $userID,
'conversationID' => $conversationID,
'seqs' => $seqs
];
return Utils::send(Url::$delMsg, $data, '删除消息失败', $adminToken);
return Utils::send(Url::$delMsg, $data);
}
/**
@@ -175,14 +167,12 @@ class Message
*/
public function revokeMessage(string $conversationID, string $seq, string $userID): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'conversationID' => $conversationID,
'seq' => intval($seq),
'userID' => $userID
];
return Utils::send(Url::$revokeMessage, $data, '撤回消息失败', $adminToken);
return Utils::send(Url::$revokeMessage, $data);
}
/**
@@ -233,7 +223,7 @@ class Message
'reliabilityLevel' => 1,
];
//log_alert($data);
return Utils::send(Url::$sendBusinessNotification, $data, '发送业务通知失败');
return Utils::send(Url::$sendBusinessNotification, $data);
}
/**
@@ -243,9 +233,7 @@ class Message
*/
public function getAllConversations(string $userID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getAllConversations, ['userID' => $userID], '获取用户所有会话失败', $adminToken);
return Utils::send(Url::$getAllConversations, ['userID' => $userID]);
}
/**
@@ -256,13 +244,11 @@ class Message
*/
public function getConversation(string $userID, string $conversationID): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'userID' => $userID,
'conversationID' => $conversationID
];
return Utils::send(Url::$getConversation, $data, '获取会话失败', $adminToken);
return Utils::send(Url::$getConversation, $data);
}
/**
@@ -273,12 +259,10 @@ class Message
*/
public function getConversations(string $userID, array $conversationIDs): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'userID' => $userID,
'conversationIDs' => $conversationIDs
];
return Utils::send(Url::$getConversations, $data, '获取会话列表失败', $adminToken);
return Utils::send(Url::$getConversations, $data);
}
}
+29 -59
View File
@@ -15,15 +15,13 @@ class User
*/
public function getUsers(int $pagination = 1, int $showNumber = 20): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'pagination' => [
'pageNumber' => $pagination,
'showNumber' => $showNumber
]
];
return Utils::send(Url::$getUsers, $data, '获取用户列表错误', $adminToken);
return Utils::send(Url::$getUsers, $data);
}
/**
@@ -33,9 +31,7 @@ class User
*/
public function getUsersOnlineStatus(array $userIDList): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getUsersOnlineStatus, ['userIDList' => $userIDList], '获取用户在线状态错误', $adminToken);
return Utils::send(Url::$getUsersOnlineStatus, ['userIDList' => $userIDList]);
}
/**
@@ -45,9 +41,7 @@ class User
*/
public function getUsersOnlineTokenDetail(array $userIDList): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getUsersOnlineTokenDetail, ['userIDList' => $userIDList], '获取用户在线token详情错误', $adminToken);
return Utils::send(Url::$getUsersOnlineTokenDetail, ['userIDList' => $userIDList]);
}
/**
@@ -56,22 +50,17 @@ class User
*/
public function getSubscribeUsersStatus(): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getSubscribeUsersStatus, [], '获取订阅用户状态错误', $adminToken);
return Utils::send(Url::$getSubscribeUsersStatus, []);
}
/**
* 订阅用户状态
* @param string $token 管理员token
* @param array $userIDList 用户ID列表
* @return array
*/
public function subscribeUsersStatus(array $userIDList): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$subscribeUsersStatus, ['userIDList' => $userIDList], '订阅用户状态错误', $adminToken);
return Utils::send(Url::$subscribeUsersStatus, ['userIDList' => $userIDList]);
}
/**
@@ -81,9 +70,7 @@ class User
*/
public function setGlobalMsgRecvOpt(int $globalRecvMsgOpt): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$setGlobalMsgRecvOpt, ['globalRecvMsgOpt' => $globalRecvMsgOpt], '设置全局免打扰错误', $adminToken);
return Utils::send(Url::$setGlobalMsgRecvOpt, ['globalRecvMsgOpt' => $globalRecvMsgOpt]);
}
/**
@@ -94,13 +81,11 @@ class User
*/
public function updateUserInfo(string $userID, array $data): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = array_merge(['userID' => $userID], $data);
$data = [
'userInfo' => $data
];
return Utils::send(Url::$updateUserInfo, $data, '修改用户信息错误', $adminToken);
return Utils::send(Url::$updateUserInfo, $data);
}
/**
@@ -119,7 +104,7 @@ class User
'showNumber' => $showNumber
]
];
return Utils::send(Url::$searchNotificationAccount, $data, '搜索通知账号错误');
return Utils::send(Url::$searchNotificationAccount, $data);
}
/**
@@ -127,11 +112,7 @@ class User
* @param string $userID 用户ID
* @param string $nickname 昵称
* @param string $faceURL 头像
* @param int $gender 性别
* @param string $phoneNumber 手机号
* @param string $birth 生日
* @param string $email 邮箱
* @param string $ex 扩展字段
* @param \support\OpenImSdk\Enum\appMangerLevel $appMangerLevel 应用管理等级
* @return array
*/
public function addNotificationAccount(string $userID, string $nickname = '', string $faceURL = '', \support\OpenImSdk\Enum\appMangerLevel $appMangerLevel = \support\OpenImSdk\Enum\appMangerLevel::Notify): array
@@ -142,7 +123,7 @@ class User
'faceURL' => $faceURL,
'appMangerLevel' => $appMangerLevel->value,
];
return Utils::send(Url::$addNotificationAccount, $data, '添加通知账号错误');
return Utils::send(Url::$addNotificationAccount, $data);
}
/**
@@ -150,11 +131,6 @@ class User
* @param string $userID 用户ID
* @param string $nickname 昵称
* @param string $faceURL 头像
* @param int $gender 性别
* @param string $phoneNumber 手机号
* @param string $birth 生日
* @param string $email 邮箱
* @param string $ex 扩展字段
* @return array
*/
public function updateNotificationAccount(string $userID, string $nickname = '', string $faceURL = ''): array
@@ -165,7 +141,7 @@ class User
'nickname' => $nickname,
'faceURL' => $faceURL
];
return Utils::send(Url::$updateNotificationAccount, $data, '更新通知账号错误');
return Utils::send(Url::$updateNotificationAccount, $data);
}
/**
@@ -175,9 +151,7 @@ class User
*/
public function accountCheck(array $checkUserIDList): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$accountCheck, ['checkUserIDList' => $checkUserIDList], '检查列表账户注册状态错误', $adminToken);
return Utils::send(Url::$accountCheck, ['checkUserIDList' => $checkUserIDList]);
}
/**
@@ -186,9 +160,7 @@ class User
*/
public function getAllUsersUid($page=1,$limit=100): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getAllUsersUid, ['pagination'=>['pageNumber'=>$page,"showNumber"=>$limit]], '获取所有用户uid列表错误', $adminToken);
return Utils::send(Url::$getAllUsersUid, ['pagination'=>['pageNumber'=>$page,"showNumber"=>$limit]]);
}
/**
@@ -198,9 +170,7 @@ class User
*/
public function getSelfUserInfo(string $userID): array
{
// 获取管理员token
$userToken = Utils::getUserToken($userID);
return Utils::send(Url::$getSelfUserInfo, ['userID' => $userID], '获取自己的信息错误', $userToken);
return Utils::send(Url::$getSelfUserInfo, ['userID' => $userID]);
}
/**
@@ -210,9 +180,7 @@ class User
*/
public function getUsersInfo(array $userIDList): array
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
return Utils::send(Url::$getUsersInfo, ['userIDList' => $userIDList], '获取用户信息错误', $adminToken);
return Utils::send(Url::$getUsersInfo, ['userIDList' => $userIDList]);
}
//Header
@@ -233,19 +201,21 @@ class User
* @param string $faceURL 头像地址
* @return array
*/
public function userRegister(string $userID, string $nickname = '', string $faceURL = ''): array|bool
public function userRegister(string|array $userID, string $nickname = '', string $faceURL = ''): array|bool
{
// 获取管理员token
$adminToken = Utils::getAdminToken();
$data = [
'users' => [
[
'userID' => $userID,
'nickname' => $nickname,
'faceURL' => $faceURL
if(is_array($userID)){
$data['users'] = $userID;
}else{
$data = [
'users' => [
[
'userID' => $userID,
'nickname' => $nickname,
'faceURL' => $faceURL
]
]
]
];
return Utils::send(Url::$userRegister, $data, '注册IM错误', $adminToken);
];
}
return Utils::send(Url::$userRegister, $data);
}
}
+10 -9
View File
@@ -80,23 +80,24 @@ class Utils
* 发送API请求
* @param string $path API路径
* @param array $data 请求数据
* @param string $errMsg 错误信息
* @param string $token 认证令牌
* @return array 响应数据
*/
public static function send(string $path, array $data, string $errMsg='', string $token = ''): array|bool
public static function send(string $path, array $data): array|bool
{
if($path != Url::$getAdminToken){
$token = $token ? $token : Utils::getAdminToken();
$token = Utils::getAdminToken();
}
$url = Url::buildUrl($path);
//cp($url);
//cp($data);
$res = self::request($url, $data, $token);
//cp($res);
$res = json_decode($res, true);
if($res['errCode'] !==0 ){
cp('=============================调试信息=====================================');
cp($url);
cp(json_encode($data));
cp($res);
cp('=============================end=====================================');
throw new \Exception($res['errMsg'],$res['errCode']);
//throw new \Exception($res['errDlt'],$res['errCode']);
}
@@ -132,7 +133,7 @@ class Utils
$result = self::send(Url::$getAdminToken, [
'userID' => $userID,
'secret' => Config::getSecret()
], '获取管理员Token失败');
]);
$token = $result['token'];
// 使用API返回的过期时间
$expireTimeSeconds = $result['expireTimeSeconds'] ?? null;
@@ -167,7 +168,7 @@ class Utils
$result = self::send(Url::$getUserToken, [
'userID' => $userID,
'platformID' => self::getPlatformId($platformID)
], '获取用户Token失败', $adminToken);
]);
$token = $result['token'];