文件
2026-06-04 22:42:27 +08:00

1572 行
55 KiB
PHP

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
<?php
// 启动会话
session_start();
// 设置CORS头
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
// 处理OPTIONS请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
exit;
}
// 引入模块
require_once 'config.php';
require_once 'modules/user.php';
require_once 'modules/message.php';
require_once 'modules/friend.php';
require_once 'modules/group.php';
// 获取配置
$config = include 'config.php';
// 设置响应头
header('Content-Type: application/json');
// 检查用户是否已登录
function checkLogin() {
if (!isLoggedIn()) {
echo json_encode(['success' => false, 'message' => '用户未登录']);
exit;
}
}
// 获取当前登录用户ID
function getCurrentUserId() {
return $_SESSION['user_id'];
}
// 网页信息缓存
$pageInfoCache = [];
// 获取网页OG信息
function fetchPageOGInfo($url) {
global $pageInfoCache;
// 检查缓存
$cacheKey = md5($url);
if (isset($pageInfoCache[$cacheKey])) {
return $pageInfoCache[$cacheKey];
}
$result = [
'title' => '',
'description' => '',
'image' => null,
'site_name' => '',
'favicon' => ''
];
try {
// 解析URL获取域名
$urlParts = parse_url($url);
$scheme = isset($urlParts['scheme']) ? $urlParts['scheme'] : 'https';
$host = isset($urlParts['host']) ? $urlParts['host'] : '';
$origin = $scheme . '://' . $host;
// 设置默认favicon
$result['favicon'] = $origin . '/favicon.ico';
$result['site_name'] = $host;
// 使用cURL获取网页内容
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 3); // 减少超时时间
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2); // 减少连接超时
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 3);
$html = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200 || !$html) {
// 获取失败,返回基本信息
$result['title'] = $host;
$pageInfoCache[$cacheKey] = $result;
return $result;
}
// 创建DOMDocument对象解析HTML
$dom = new DOMDocument();
libxml_use_internal_errors(true);
// 尝试加载HTML,处理编码问题
$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
if (@$dom->loadHTML($html)) {
// 清除错误
libxml_clear_errors();
// 解析meta标签
$metas = $dom->getElementsByTagName('meta');
foreach ($metas as $meta) {
$property = $meta->getAttribute('property');
$name = $meta->getAttribute('name');
$content = $meta->getAttribute('content');
if (empty($content)) continue;
// 解析OG标签
switch ($property) {
case 'og:title':
$result['title'] = trim($content);
break;
case 'og:description':
$result['description'] = trim($content);
break;
case 'og:image':
$result['image'] = trim($content);
break;
case 'og:site_name':
$result['site_name'] = trim($content);
break;
}
// 解析Twitter卡片标签
switch ($name) {
case 'twitter:title':
if (empty($result['title'])) {
$result['title'] = trim($content);
}
break;
case 'twitter:description':
if (empty($result['description'])) {
$result['description'] = trim($content);
}
break;
case 'twitter:image':
if (empty($result['image'])) {
$result['image'] = trim($content);
}
break;
}
// 解析description
if ($name === 'description' && empty($result['description'])) {
$result['description'] = trim($content);
}
}
// 如果没有找到OG title,尝试获取HTML title标签
if (empty($result['title'])) {
$titles = $dom->getElementsByTagName('title');
if ($titles->length > 0) {
$result['title'] = trim($titles->item(0)->nodeValue);
}
}
// 如果还是没有title,使用域名
if (empty($result['title'])) {
$result['title'] = $host;
}
// 处理相对路径的图片URL
if (!empty($result['image'])) {
if (strpos($result['image'], 'http') !== 0) {
if (strpos($result['image'], '//') === 0) {
$result['image'] = $scheme . ':' . $result['image'];
} elseif (strpos($result['image'], '/') === 0) {
$result['image'] = $origin . $result['image'];
} else {
$path = isset($urlParts['path']) ? dirname($urlParts['path']) : '/';
$result['image'] = $origin . $path . '/' . $result['image'];
}
}
}
}
// 缓存结果
$pageInfoCache[$cacheKey] = $result;
return $result;
} catch (Exception $e) {
// 发生异常,返回基本信息
$urlParts = parse_url($url);
$host = isset($urlParts['host']) ? $urlParts['host'] : $url;
$scheme = isset($urlParts['scheme']) ? $urlParts['scheme'] : 'https';
$result['title'] = $host;
$result['site_name'] = $host;
$result['favicon'] = $scheme . '://' . $host . '/favicon.ico';
// 缓存错误结果
$pageInfoCache[$cacheKey] = $result;
return $result;
}
}
// 处理API请求
$action = isset($_GET['action']) ? $_GET['action'] : (isset($_POST['action']) ? $_POST['action'] : '');
switch ($action) {
// 获取GitHub登录配置
case 'getGitHubConfig':
$githubConfig = $config['github'] ?? [];
echo json_encode(['success' => true, 'config' => $githubConfig]);
break;
// 获取QQ登录配置
case 'getQQConfig':
$qqConfig = $config['qq'] ?? [];
echo json_encode(['success' => true, 'config' => $qqConfig]);
break;
// 获取微软登录配置
case 'getMicrosoftConfig':
$microsoftConfig = $config['microsoft'] ?? [];
echo json_encode(['success' => true, 'config' => $microsoftConfig]);
break;
// 获取Discord登录配置
case 'getDiscordConfig':
$discordConfig = $config['discord'] ?? [];
echo json_encode(['success' => true, 'config' => $discordConfig]);
break;
// 设置备注
case 'setNote':
checkLogin();
$userId = getCurrentUserId();
$targetId = $_POST['target_id'] ?? '';
$targetType = $_POST['target_type'] ?? '';
$note = $_POST['note'] ?? '';
if (!$targetId || !$targetType) {
echo json_encode(['success' => false, 'message' => '缺少必要参数']);
break;
}
$db = Database::getInstance();
$currentTime = time();
// 确保notes表存在
$db->query("CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
target_id TEXT NOT NULL,
target_type TEXT NOT NULL,
note TEXT DEFAULT '',
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE(user_id, target_id, target_type)
)");
// 先检查是否已存在备注
$existing = $db->query("SELECT id FROM notes WHERE user_id = :user_id AND target_id = :target_id AND target_type = :target_type", [
'user_id' => $userId,
'target_id' => $targetId,
'target_type' => $targetType
]);
if (!empty($existing)) {
// 更新现有备注
$result = $db->execute("UPDATE notes SET note = :note, updated_at = :updated_at WHERE user_id = :user_id AND target_id = :target_id AND target_type = :target_type", [
'note' => $note,
'updated_at' => $currentTime,
'user_id' => $userId,
'target_id' => $targetId,
'target_type' => $targetType
]);
} else {
// 插入新备注
$result = $db->execute("INSERT INTO notes (user_id, target_id, target_type, note, created_at, updated_at) VALUES (:user_id, :target_id, :target_type, :note, :created_at, :updated_at)", [
'user_id' => $userId,
'target_id' => $targetId,
'target_type' => $targetType,
'note' => $note,
'created_at' => $currentTime,
'updated_at' => $currentTime
]);
}
echo json_encode(['success' => true, 'message' => '备注设置成功']);
break;
// 获取备注
case 'getNote':
checkLogin();
$userId = getCurrentUserId();
$targetId = $_GET['target_id'] ?? '';
$targetType = $_GET['target_type'] ?? '';
if (!$targetId || !$targetType) {
echo json_encode(['success' => false, 'message' => '缺少必要参数']);
break;
}
$db = Database::getInstance();
$result = $db->query("SELECT note FROM notes WHERE user_id = :user_id AND target_id = :target_id AND target_type = :target_type", [
'user_id' => $userId,
'target_id' => $targetId,
'target_type' => $targetType
]);
$note = !empty($result) ? $result[0]['note'] : '';
echo json_encode(['success' => true, 'note' => $note]);
break;
// 添加好友(发送好友请求)
case 'addFriend':
checkLogin();
$username = isset($_POST['username']) ? $_POST['username'] : '';
$userId = getCurrentUserId();
if (addFriend($userId, $username)) {
echo json_encode(['success' => true, 'message' => '好友请求已发送,请等待对方确认']);
} else {
echo json_encode(['success' => false, 'message' => '添加好友失败,用户不存在或已经是好友']);
}
break;
// 获取用户信息
case 'getUserInfo':
checkLogin();
$username = isset($_POST['username']) ? $_POST['username'] : '';
if (!$username) {
echo json_encode(['success' => false, 'message' => '用户名不能为空']);
break;
}
// 检查是否是系统账户
if ($username === 'Parlz官方') {
// 返回系统账户信息
$systemUser = [
'id' => 100000,
'username' => 'Parlz官方',
'avatar' => '',
'online' => true,
'is_admin' => true,
'is_banned' => false
];
echo json_encode(['success' => true, 'user' => $systemUser]);
} else {
// 获取用户信息
$userInfo = getUserByUsername($username);
if ($userInfo) {
echo json_encode(['success' => true, 'user' => $userInfo]);
} else {
echo json_encode(['success' => false, 'message' => '用户不存在']);
}
}
break;
// 获取IP地理位置
case 'getIPLocation':
// 获取用户真实IP
function getRealIP() {
$ip = $_SERVER['REMOTE_ADDR'];
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[0]);
}
return $ip;
}
$ip = getRealIP();
// 简单的IP地理位置映射(可根据需要扩展)
$location = '未知';
// 这里可以添加更复杂的IP地理位置数据库查询
// 暂时返回IP地址作为位置
$location = $ip;
echo json_encode(['success' => true, 'location' => $location, 'ip' => $ip]);
break;
// 检查好友关系
case 'checkFriendship':
checkLogin();
$friendId = isset($_POST['friendId']) ? $_POST['friendId'] : '';
$userId = getCurrentUserId();
if (!$friendId) {
echo json_encode(['success' => false, 'message' => '好友ID不能为空']);
break;
}
// 检查是否是好友
$isFriend = isFriend($userId, $friendId);
echo json_encode(['success' => true, 'isFriend' => $isFriend]);
break;
// 获取好友请求列表
case 'getFriendRequests':
checkLogin();
$userId = getCurrentUserId();
$requests = getFriendRequests($userId);
echo json_encode(['success' => true, 'requests' => $requests]);
break;
// 接受好友请求
case 'acceptFriendRequest':
checkLogin();
$requestId = isset($_POST['requestId']) ? $_POST['requestId'] : '';
if (!$requestId) {
echo json_encode(['success' => false, 'message' => '请求ID不能为空']);
break;
}
if (acceptFriendRequest($requestId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '接受好友请求失败']);
}
break;
// 拒绝好友请求
case 'rejectFriendRequest':
checkLogin();
$requestId = isset($_POST['requestId']) ? $_POST['requestId'] : '';
if (!$requestId) {
echo json_encode(['success' => false, 'message' => '请求ID不能为空']);
break;
}
if (rejectFriendRequest($requestId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '拒绝好友请求失败']);
}
break;
// 踢出好友(删除好友)
case 'removeFriend':
checkLogin();
$userId = getCurrentUserId();
$friendId = isset($_POST['friendId']) ? $_POST['friendId'] : '';
if (!$friendId) {
echo json_encode(['success' => false, 'message' => '好友ID不能为空']);
break;
}
if (removeFriend($userId, $friendId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '删除好友失败']);
}
break;
// 获取好友列表
case 'getFriends':
checkLogin();
$userId = getCurrentUserId();
$friends = getFriends($userId);
echo json_encode(['success' => true, 'friends' => $friends]);
break;
// 获取聊天历史
case 'getChatHistory':
checkLogin();
$userId = getCurrentUserId();
$targetId = isset($_GET['targetId']) ? $_GET['targetId'] : '';
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 20;
$olderThan = isset($_GET['olderThan']) ? (int)$_GET['olderThan'] : null;
$isGroup = isset($_GET['isGroup']) ? ($_GET['isGroup'] === 'true') : false;
if (!$targetId) {
echo json_encode(['success' => false, 'message' => '目标ID不能为空']);
break;
}
$result = getChatHistory($userId, $targetId, $page, $limit, $olderThan, $isGroup);
echo json_encode(['success' => true, 'messages' => $result['messages'], 'hasMore' => $result['hasMore']]);
break;
// 发送消息
case 'sendMessage':
checkLogin();
$userId = getCurrentUserId();
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
$content = isset($_POST['content']) ? $_POST['content'] : '';
$quote = isset($_POST['quote']) ? json_decode($_POST['quote'], true) : null;
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
if (!$targetId || !$content) {
echo json_encode(['success' => false, 'message' => '目标ID和消息内容不能为空']);
break;
}
// 检查用户是否在群组中被禁言
if ($isGroup) {
if (isUserMuted($targetId, $userId)) {
echo json_encode(['success' => false, 'message' => '您已被禁言,无法发送消息']);
break;
}
}
if (sendMessage($userId, $targetId, $content, false, $quote, $isGroup)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '发送消息失败']);
}
break;
// 获取未读消息
case 'getUnreadMessages':
checkLogin();
$userId = getCurrentUserId();
$messages = getUnreadMessages($userId);
echo json_encode(['success' => true, 'messages' => $messages]);
break;
// 标记消息为已读
case 'markAsRead':
checkLogin();
$userId = getCurrentUserId();
$senderId = isset($_GET['senderId']) ? $_GET['senderId'] : '';
if (!$senderId) {
echo json_encode(['success' => false, 'message' => '发送者ID不能为空']);
break;
}
if (markMessagesAsRead($userId, $senderId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '标记消息失败']);
}
break;
// 标记消息为已送达
case 'markAsDelivered':
checkLogin();
$userId = getCurrentUserId();
$senderId = isset($_GET['senderId']) ? $_GET['senderId'] : '';
if (!$senderId) {
echo json_encode(['success' => false, 'message' => '发送者ID不能为空']);
break;
}
if (markMessagesAsDelivered($userId, $senderId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '标记消息失败']);
}
break;
// 发送图片
case 'sendImage':
checkLogin();
$userId = getCurrentUserId();
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
if (!$targetId) {
echo json_encode(['success' => false, 'message' => '目标ID不能为空']);
break;
}
// 检查是否有文件上传
if (!isset($_FILES['image']) || $_FILES['image']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => '图片上传失败']);
break;
}
// 创建图片存储目录
$uploadDir = __DIR__ . '/uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
// 生成唯一文件名
$fileExtension = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
$fileName = uniqid() . '.' . $fileExtension;
$filePath = $uploadDir . $fileName;
// 移动上传文件
if (move_uploaded_file($_FILES['image']['tmp_name'], $filePath)) {
// 生成相对路径
$relativePath = 'uploads/' . $fileName;
// 发送图片消息
if (sendMessage($userId, $targetId, $relativePath, true, null, $isGroup)) {
echo json_encode(['success' => true]);
} else {
// 删除已上传的图片
if (file_exists($filePath)) {
unlink($filePath);
}
echo json_encode(['success' => false, 'message' => '发送图片失败']);
}
} else {
echo json_encode(['success' => false, 'message' => '图片保存失败']);
}
break;
// 发送附件
case 'sendAttachment':
checkLogin();
$userId = getCurrentUserId();
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
if (!$targetId) {
echo json_encode(['success' => false, 'message' => '目标ID不能为空']);
break;
}
// 检查是否有文件上传
if (!isset($_FILES['attachment']) || $_FILES['attachment']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => '附件上传失败']);
break;
}
// 验证文件大小(30MB
$maxSize = 30 * 1024 * 1024;
if ($_FILES['attachment']['size'] > $maxSize) {
echo json_encode(['success' => false, 'message' => '文件大小不能超过30MB']);
break;
}
// 验证文件类型
$validExtensions = ['zip', 'rar', '7z'];
$fileExtension = strtolower(pathinfo($_FILES['attachment']['name'], PATHINFO_EXTENSION));
if (!in_array($fileExtension, $validExtensions)) {
echo json_encode(['success' => false, 'message' => '只能上传zip、rar、7z格式的压缩文件']);
break;
}
// 创建附件存储目录
$uploadDir = __DIR__ . '/message_upload/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
// 生成唯一文件名
$fileName = uniqid() . '.' . $fileExtension;
$filePath = $uploadDir . $fileName;
// 移动上传文件
if (move_uploaded_file($_FILES['attachment']['tmp_name'], $filePath)) {
// 生成相对路径
$relativePath = 'message_upload/' . $fileName;
// 发送附件消息
if (sendMessage($userId, $targetId, $relativePath, false, null, $isGroup)) {
echo json_encode(['success' => true]);
} else {
// 删除已上传的附件
if (file_exists($filePath)) {
unlink($filePath);
}
echo json_encode(['success' => false, 'message' => '发送附件失败']);
}
} else {
echo json_encode(['success' => false, 'message' => '附件保存失败']);
}
break;
// 更改用户名
case 'changeUsername':
checkLogin();
$userId = getCurrentUserId();
$newUsername = isset($_POST['newUsername']) ? $_POST['newUsername'] : '';
if (!$newUsername) {
echo json_encode(['success' => false, 'message' => '用户名不能为空']);
break;
}
if (strlen($newUsername) < 2 || strlen($newUsername) > 20) {
echo json_encode(['success' => false, 'message' => '用户名长度应在2-20个字符之间']);
break;
}
if (changeUsername($userId, $newUsername)) {
// 更新会话中的用户名
$_SESSION['username'] = $newUsername;
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '用户名已存在']);
}
break;
// 更改用户简介
case 'changeBio':
checkLogin();
$userId = getCurrentUserId();
$newBio = isset($_POST['newBio']) ? $_POST['newBio'] : '';
if (strlen($newBio) > 200) {
echo json_encode(['success' => false, 'message' => '简介长度不能超过200个字符']);
break;
}
if (changeUserBio($userId, $newBio)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '修改简介失败']);
}
break;
// 更新在线状态
case 'updateOnlineStatus':
checkLogin();
$userId = getCurrentUserId();
$online = isset($_POST['online']) ? ($_POST['online'] === '1') : true;
updateUserOnlineStatus($userId, $online);
echo json_encode(['success' => true]);
break;
// 撤回消息
case 'recallMessage':
checkLogin();
$userId = getCurrentUserId();
$targetId = isset($_POST['targetId']) ? $_POST['targetId'] : '';
$content = isset($_POST['content']) ? $_POST['content'] : '';
$messageId = isset($_POST['messageId']) ? $_POST['messageId'] : '';
$isGroup = isset($_POST['isGroup']) ? ($_POST['isGroup'] === 'true') : false;
if (!$targetId || (!$content && !$messageId)) {
echo json_encode(['success' => false, 'message' => '目标ID和消息内容或消息ID不能为空']);
break;
}
if (recallMessage($userId, $targetId, $content, $isGroup, $messageId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '撤回消息失败']);
}
break;
// 举报消息
case 'reportMessage':
checkLogin();
$userId = getCurrentUserId();
$messageId = isset($_POST['messageId']) ? $_POST['messageId'] : '';
$reason = isset($_POST['reason']) ? $_POST['reason'] : '';
if (!$messageId) {
echo json_encode(['success' => false, 'message' => '消息ID不能为空']);
break;
}
if (reportMessage($messageId, $userId, $reason)) {
echo json_encode(['success' => true, 'message' => '举报成功,管理员将尽快处理']);
} else {
echo json_encode(['success' => false, 'message' => '举报失败,消息不存在或您已举报过']);
}
break;
// 获取当前头像
case 'getCurrentAvatar':
checkLogin();
$userId = getCurrentUserId();
$avatar = getCurrentUserAvatar($userId);
echo json_encode(['success' => true, 'avatar' => $avatar]);
break;
// 修改头像
case 'changeAvatar':
checkLogin();
$userId = getCurrentUserId();
// 检查是否有文件上传
if (!isset($_FILES['avatar']) || $_FILES['avatar']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => '头像上传失败']);
break;
}
// 创建头像存储目录
$uploadDir = __DIR__ . '/uploads/avatars/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
// 生成唯一文件名
$fileExtension = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);
$fileName = uniqid() . '.' . $fileExtension;
$filePath = $uploadDir . $fileName;
// 移动上传文件
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $filePath)) {
// 生成相对路径
$relativePath = 'uploads/avatars/' . $fileName;
// 更新用户头像
if (updateUserAvatar($userId, $relativePath)) {
echo json_encode(['success' => true, 'avatar' => $relativePath]);
} else {
// 删除已上传的头像
if (file_exists($filePath)) {
unlink($filePath);
}
echo json_encode(['success' => false, 'message' => '更新头像失败']);
}
} else {
echo json_encode(['success' => false, 'message' => '头像保存失败']);
}
break;
// 修改位置
case 'changeLocation':
checkLogin();
$userId = getCurrentUserId();
$newLocation = isset($_POST['newLocation']) ? $_POST['newLocation'] : '';
// 更新用户位置
$db = Database::getInstance();
$result = $db->execute("UPDATE users SET last_ip = :last_ip WHERE id = :id", [
'last_ip' => $newLocation,
'id' => $userId
]);
if ($result) {
echo json_encode(['success' => true, 'location' => $newLocation]);
} else {
echo json_encode(['success' => false, 'message' => '更新位置失败']);
}
break;
// 群组管理相关接口
// 创建群组
case 'createGroup':
checkLogin();
$userId = getCurrentUserId();
$groupName = isset($_POST['groupName']) ? $_POST['groupName'] : '';
$memberIds = isset($_POST['memberIds']) ? json_decode($_POST['memberIds'], true) : [];
if (!$groupName) {
echo json_encode(['success' => false, 'message' => '群组名称不能为空']);
break;
}
$group = createGroup($userId, $groupName, $memberIds);
echo json_encode(['success' => true, 'group' => $group]);
break;
// 获取用户群组列表
case 'getUserGroups':
checkLogin();
$userId = getCurrentUserId();
$groups = getUserGroups($userId);
echo json_encode(['success' => true, 'groups' => $groups]);
break;
// 获取群组成员
case 'getGroupMembers':
checkLogin();
$groupId = isset($_GET['groupId']) ? $_GET['groupId'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
$members = getGroupMembers($groupId);
echo json_encode(['success' => true, 'members' => $members]);
break;
// 添加群成员
case 'addGroupMember':
checkLogin();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
if (!$groupId || !$userId) {
echo json_encode(['success' => false, 'message' => '群组ID和用户ID不能为空']);
break;
}
if (addGroupMember($groupId, $userId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '添加成员失败']);
}
break;
// 移除群成员
case 'removeGroupMember':
checkLogin();
$currentUserId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
if (!$groupId || !$userId) {
echo json_encode(['success' => false, 'message' => '群组ID和用户ID不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $currentUserId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以移除成员']);
break;
}
// 管理员不能移除自己
if ($currentUserId === $userId) {
echo json_encode(['success' => false, 'message' => '管理员不能移除自己']);
break;
}
if (removeGroupMember($groupId, $userId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '移除成员失败']);
}
break;
// 更新群组信息
case 'updateGroup':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$groupName = isset($_POST['groupName']) ? $_POST['groupName'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $userId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以修改群组信息']);
break;
}
$groupData = [];
if ($groupName) {
$groupData['name'] = $groupName;
}
if (updateGroup($groupId, $groupData)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '更新群组失败']);
}
break;
// 删除群组
case 'deleteGroup':
checkLogin();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
if (deleteGroup($groupId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '删除群组失败']);
}
break;
// 退出群组
case 'leaveGroup':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
if (leaveGroup($groupId, $userId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '退出群组失败']);
}
break;
// 禁言/解禁用户
case 'muteUser':
checkLogin();
$currentUserId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
$muted = isset($_POST['muted']) ? ($_POST['muted'] === 'true') : false;
if (!$groupId || !$userId) {
echo json_encode(['success' => false, 'message' => '群组ID和用户ID不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $currentUserId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以禁言用户']);
break;
}
if (muteUser($groupId, $userId, $muted)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '操作失败']);
}
break;
// 更新成员角色
case 'updateGroupMemberRole':
checkLogin();
$currentUserId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$userId = isset($_POST['userId']) ? $_POST['userId'] : '';
$role = isset($_POST['role']) ? $_POST['role'] : '';
if (!$groupId || !$userId || !$role) {
echo json_encode(['success' => false, 'message' => '群组ID、用户ID和角色不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $currentUserId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以修改成员角色']);
break;
}
// 不能修改自己的角色
if ($currentUserId === $userId) {
echo json_encode(['success' => false, 'message' => '不能修改自己的角色']);
break;
}
// 检查用户是否是群成员
if (!isGroupMember($groupId, $userId)) {
echo json_encode(['success' => false, 'message' => '用户不是群成员']);
break;
}
// 更新用户角色
$db = Database::getInstance();
$result = $db->execute("UPDATE group_members SET role = :role WHERE group_id = :groupId AND user_id = :userId", [
'role' => $role,
'groupId' => $groupId,
'userId' => $userId
]);
if ($result) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '操作失败']);
}
break;
// 通过群号获取群组信息
case 'getGroupByGroupId':
checkLogin();
$group_id = isset($_GET['group_id']) ? $_GET['group_id'] : '';
if (!$group_id) {
echo json_encode(['success' => false, 'message' => '群号不能为空']);
break;
}
$group = getGroupByGroupId($group_id);
if ($group) {
echo json_encode(['success' => true, 'group' => $group]);
} else {
echo json_encode(['success' => false, 'message' => '群组不存在']);
}
break;
// 通过群号加入群组
case 'joinGroupByGroupId':
checkLogin();
$userId = getCurrentUserId();
$group_id = isset($_POST['group_id']) ? $_POST['group_id'] : '';
if (!$group_id) {
echo json_encode(['success' => false, 'message' => '群号不能为空']);
break;
}
if (joinGroupByGroupId($group_id, $userId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '加入群组失败,可能是群号不存在或您已经是群成员']);
}
break;
// 修改群头像
case 'changeGroupAvatar':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $userId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以修改群头像']);
break;
}
// 检查是否有文件上传
if (!isset($_FILES['avatar']) || $_FILES['avatar']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => '头像上传失败']);
break;
}
// 创建头像存储目录
$uploadDir = __DIR__ . '/uploads/group_avatars/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
// 生成唯一文件名
$fileExtension = pathinfo($_FILES['avatar']['name'], PATHINFO_EXTENSION);
$fileName = uniqid() . '.' . $fileExtension;
$filePath = $uploadDir . $fileName;
// 移动上传文件
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $filePath)) {
// 生成相对路径
$relativePath = 'uploads/group_avatars/' . $fileName;
// 更新群组头像
$groupData = ['avatar' => $relativePath];
if (updateGroup($groupId, $groupData)) {
echo json_encode(['success' => true, 'avatar' => $relativePath]);
} else {
// 删除已上传的头像
if (file_exists($filePath)) {
unlink($filePath);
}
echo json_encode(['success' => false, 'message' => '更新群头像失败']);
}
} else {
echo json_encode(['success' => false, 'message' => '头像保存失败']);
}
break;
// 邀请好友加入群组
case 'inviteToGroup':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$friendUsername = isset($_POST['friendUsername']) ? $_POST['friendUsername'] : '';
$friendId = isset($_POST['userId']) ? $_POST['userId'] : null;
if (!$groupId || (!$friendUsername && !$friendId)) {
echo json_encode(['success' => false, 'message' => '群组ID和好友信息不能为空']);
break;
}
// 检查用户是否是群成员
if (!isGroupMember($groupId, $userId)) {
echo json_encode(['success' => false, 'message' => '您不是群成员,无法邀请他人']);
break;
}
// 获取好友用户信息
if (!$friendId) {
$friends = getAllUsers();
foreach ($friends as $friend) {
if ($friend['username'] === $friendUsername) {
$friendId = $friend['id'];
break;
}
}
if (!$friendId) {
echo json_encode(['success' => false, 'message' => '好友不存在']);
break;
}
}
// 邀请好友加入群组
if (addGroupMember($groupId, $friendId)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '邀请失败,可能是好友已经是群成员']);
}
break;
// 获取群组分享链接
case 'getGroupShareLink':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
// 检查用户是否是群成员
if (!isGroupMember($groupId, $userId)) {
echo json_encode(['success' => false, 'message' => '您不是群成员,无法分享群组']);
break;
}
// 获取群组信息
$group = getGroupById($groupId);
if (!$group) {
echo json_encode(['success' => false, 'message' => '群组不存在']);
break;
}
// 生成分享链接
$shareLink = 'https://www.parlz.com/join_group.php?group_id=' . $group['group_id'];
echo json_encode(['success' => true, 'shareLink' => $shareLink, 'groupName' => $group['name']]);
break;
// 群组公告相关接口
// 获取群组公告
case 'getGroupAnnouncements':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_GET['groupId']) ? $_GET['groupId'] : '';
if (!$groupId) {
echo json_encode(['success' => false, 'message' => '群组ID不能为空']);
break;
}
// 检查用户是否是群成员
if (!isGroupMember($groupId, $userId)) {
echo json_encode(['success' => false, 'message' => '您不是群成员,无法查看群公告']);
break;
}
// 获取群组信息
$group = getGroupById($groupId);
if (!$group) {
echo json_encode(['success' => false, 'message' => '群组不存在']);
break;
}
// 获取公告
$db = Database::getInstance();
$announcements = $db->query("SELECT * FROM group_announcements WHERE group_id = :groupId ORDER BY created_at DESC", ['groupId' => $groupId]);
echo json_encode(['success' => true, 'announcements' => $announcements]);
break;
// 创建/更新群组公告
case 'updateGroupAnnouncement':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$content = isset($_POST['content']) ? $_POST['content'] : '';
if (!$groupId || !$content) {
echo json_encode(['success' => false, 'message' => '群组ID和公告内容不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $userId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以发布公告']);
break;
}
// 获取群组信息
$group = getGroupById($groupId);
if (!$group) {
echo json_encode(['success' => false, 'message' => '群组不存在']);
break;
}
// 构建公告数据
$announcement = [
'id' => generateId(),
'group_id' => $groupId,
'content' => $content,
'created_by' => $userId,
'created_at' => getCurrentTimestamp()
];
// 插入新公告
$db = Database::getInstance();
$db->execute("INSERT INTO group_announcements (id, group_id, content, created_by, created_at)
VALUES (:id, :group_id, :content, :created_by, :created_at)", $announcement);
echo json_encode(['success' => true, 'announcement' => $announcement]);
break;
// 删除群组公告
case 'deleteGroupAnnouncement':
checkLogin();
$userId = getCurrentUserId();
$groupId = isset($_POST['groupId']) ? $_POST['groupId'] : '';
$announcementId = isset($_POST['announcementId']) ? $_POST['announcementId'] : '';
if (!$groupId || !$announcementId) {
echo json_encode(['success' => false, 'message' => '群组ID和公告ID不能为空']);
break;
}
// 检查用户是否是群组管理员
$userRole = getUserGroupRole($groupId, $userId);
if ($userRole !== 'admin') {
echo json_encode(['success' => false, 'message' => '只有群组管理员可以删除公告']);
break;
}
// 获取群组信息
$group = getGroupById($groupId);
if (!$group) {
echo json_encode(['success' => false, 'message' => '群组不存在']);
break;
}
// 删除公告
$db = Database::getInstance();
$result = $db->execute("DELETE FROM group_announcements WHERE id = :announcementId AND group_id = :groupId", [
'announcementId' => $announcementId,
'groupId' => $groupId
]);
if ($result) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '删除公告失败']);
}
break;
// 获取网页信息(解析OG标签)
case 'getPageInfo':
$url = isset($_GET['url']) ? $_GET['url'] : '';
if (!$url) {
echo json_encode(['success' => false, 'message' => 'URL不能为空']);
break;
}
// 验证URL格式
if (!filter_var($url, FILTER_VALIDATE_URL)) {
echo json_encode(['success' => false, 'message' => '无效的URL']);
break;
}
// 获取网页内容
$pageInfo = fetchPageOGInfo($url);
if ($pageInfo) {
echo json_encode(['success' => true, 'data' => $pageInfo]);
} else {
echo json_encode(['success' => false, 'message' => '获取网页信息失败']);
}
break;
// 管理员获取举报列表
case 'getReports':
checkLogin();
$userId = getCurrentUserId();
// 检查是否是管理员
if (!isAdmin($userId)) {
echo json_encode(['success' => false, 'message' => '权限不足']);
break;
}
$status = isset($_GET['status']) ? $_GET['status'] : null;
$reports = getReports($status);
// 获取每个举报的消息详情和用户信息
$detailedReports = [];
foreach ($reports as $report) {
$message = getReportedMessage($report['message_id']);
$reporter = getUserById($report['reporter_id']);
$processedBy = $report['processed_by'] ? getUserById($report['processed_by']) : null;
$detailedReports[] = [
'report' => $report,
'message' => $message,
'reporter' => $reporter,
'processed_by' => $processedBy
];
}
echo json_encode(['success' => true, 'reports' => $detailedReports]);
break;
// 管理员处理举报
case 'processReport':
checkLogin();
$userId = getCurrentUserId();
// 检查是否是管理员
if (!isAdmin($userId)) {
echo json_encode(['success' => false, 'message' => '权限不足']);
break;
}
$reportId = isset($_POST['reportId']) ? $_POST['reportId'] : '';
$action = isset($_POST['action']) ? $_POST['action'] : '';
$reason = isset($_POST['reason']) ? $_POST['reason'] : '';
if (!$reportId || !$action) {
echo json_encode(['success' => false, 'message' => '举报ID和操作不能为空']);
break;
}
if (processReport($reportId, $userId, $action, $reason)) {
echo json_encode(['success' => true]);
} else {
echo json_encode(['success' => false, 'message' => '处理举报失败']);
}
break;
// 更新用户邮箱
case 'updateEmail':
checkLogin();
$userId = getCurrentUserId();
$email = isset($_POST['email']) ? $_POST['email'] : '';
if (!$email) {
echo json_encode(['success' => false, 'message' => '邮箱不能为空']);
break;
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo json_encode(['success' => false, 'message' => '无效的邮箱格式']);
break;
}
if (updateUserEmail($userId, $email)) {
echo json_encode(['success' => true, 'message' => '邮箱更新成功,请检查您的邮箱进行验证']);
} else {
// 检查邮箱是否已被使用
$db = Database::getInstance();
$existingUser = $db->query("SELECT * FROM users WHERE email = :email AND id != :id", [
'email' => $email,
'id' => $userId
]);
if (!empty($existingUser)) {
echo json_encode(['success' => false, 'message' => '该邮箱已被其他用户使用']);
} else {
echo json_encode(['success' => false, 'message' => '邮件发送失败,请稍后重试或联系管理员']);
}
}
break;
// 获取当前登录用户信息
case 'getCurrentUser':
checkLogin();
$userId = getCurrentUserId();
$username = $_SESSION['username'];
// 获取用户详细信息
$user = getUserById($userId);
if ($user) {
echo json_encode(['success' => true, 'user' => $user]);
} else {
// 如果获取失败,返回会话中的基本信息
echo json_encode(['success' => true, 'user' => [
'id' => $userId,
'username' => $username
]]);
}
break;
// 更新用户协议设置
case 'updateTermsSettings':
checkLogin();
$userId = getCurrentUserId();
$requireTermsAgreement = isset($_POST['require_terms_agreement']) ? (int)$_POST['require_terms_agreement'] : 0;
// 更新用户个人设置
$db = Database::getInstance();
$sql = "UPDATE users SET getip = :value WHERE id = :user_id";
$result = $db->execute($sql, [
'value' => $requireTermsAgreement,
'user_id' => $userId
]);
if ($result) {
echo json_encode(['success' => true, 'message' => '设置更新成功']);
} else {
echo json_encode(['success' => false, 'message' => '设置更新失败']);
}
break;
// 获取用户协议设置
case 'getTermsSettings':
checkLogin();
$userId = getCurrentUserId();
$db = Database::getInstance();
$result = $db->query("SELECT getip FROM users WHERE id = :user_id", ['user_id' => $userId]);
if (empty($result)) {
echo json_encode(['success' => true, 'getip' => 1]); // 默认开启
} else {
echo json_encode(['success' => true, 'getip' => (int)$result[0]['getip']]);
}
break;
// 登录API
case 'login':
$username = isset($_POST['username']) ? $_POST['username'] : '';
// 必须使用加密后的密码
$password = isset($_POST['password_hash']) ? $_POST['password_hash'] : '';
if (!$username || !$password) {
echo json_encode(['success' => false, 'message' => '无效的请求']);
break;
}
if (login($username, $password)) {
// 登录成功,返回用户信息
$userId = $_SESSION['user_id'];
$user = getUserById($userId);
echo json_encode(['success' => true, 'user' => $user]);
} else {
echo json_encode(['success' => false, 'message' => '用户名或密码错误']);
}
break;
// 注册API
case 'register':
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';
$email = isset($_POST['email']) ? $_POST['email'] : '';
if (!$username || !$password || !$email) {
echo json_encode(['success' => false, 'message' => '用户名、密码和邮箱不能为空']);
break;
}
if (register($username, $password, $email)) {
// 注册成功后自动登录
login($username, $password);
// 返回用户信息
$userId = $_SESSION['user_id'];
$user = getUserById($userId);
echo json_encode(['success' => true, 'user' => $user]);
} else {
echo json_encode(['success' => false, 'message' => '用户名已存在']);
}
break;
// 默认响应
default:
echo json_encode(['success' => false, 'message' => '无效的API请求']);
break;
}
?>