界面错误

sshsvgsj  (UID: 957) 8天前 [复制链接]
帖子链接已复制到剪贴板

74 3

)); } } $r = db_update('emby_accounts', array('id' => $id), $arr); return $r !== FALSE ? array('code' => 0, 'message' => '更新成功') : array('code' => -1, 'message' => '更新失败'); } function emby_account_read($id) { return db_find_one('emby_accounts', array('id' => $id)); } function emby_account_delete($id) { // 获取账户信息用于日志记录 $account = emby_account_read($id); if(!empty($account)) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "删除账户,ID:{$id}", 'related_id' => $id, 'level' => EMBY_LOG_LEVEL_INFO )); } return db_delete('emby_accounts', array('id' => $id)); } function emby_account_count($cond = array()) { return db_count('emby_accounts', $cond); } // 域名解析 function emby_resume_domain_dns($domain, $zone_id, $record_id, $server_ip) { // 恢复解析(更新为正确的服务器IP) $update_result = cloudflare_update_dns_record( $zone_id, $record_id, 'A', $domain, $server_ip, true, ); return $update_result; } // 检查过期账号并加入队列 function emby_account_check_expired_and_queue() { // 获取所有过期的账号 $accounts = db_find("emby_accounts", array("expire_time" => array("<=" => time()), "status" => 1), array(), 1, 1000); if(empty($accounts)) { xn_log("没有过期账号", "account"); return; } xn_log("发现过期账号数量: " . count($accounts), "account"); // 直接将所有过期账号存入队列 $queue_key = 'emby_expired_accounts_queue'; cache_set($queue_key, $accounts, 86400); // 24小时过期 xn_log("队列更新完成,共 " . count($accounts) . " 个账号", "account"); } // 处理域名解析失败的账号 function emby_account_process_dns_failed_queue() { $queue_key = 'emby_dns_failed_queue'; // 获取队列中的所有账号 $accounts = cache_get($queue_key); if(empty($accounts) || !is_array($accounts)) { xn_log("DNS失败队列为空", "account"); return; } $remaining_accounts = array(); foreach($accounts as $account) { try { if(empty($account)) { continue; } xn_log("处理DNS失败账号: " . json_encode($account), "account"); // 获取重试次数 $retry_key = 'emby_dns_retry_' . $account['id']; $retry_count = cache_get($retry_key) ?: 0; // 尝试暂停域名解析 $dns_result = emby_resume_domain_dns( $account['domain'], $account['cloudflare_zone_id'], $account['cloudflare_record_id'], "1.2.3.4" ); xn_log("重试暂停域名解析结果: " . json_encode($dns_result), "account"); if($dns_result['code'] != 0 || empty($dns_result)) { // 如果重试次数超过5次,记录错误 if($retry_count >= 5) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "暂停域名解析失败(重试5次):" . $dns_result['message'], 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); cache_delete($retry_key); } else { // 增加重试次数并保留账号在队列中 cache_set($retry_key, $retry_count + 1, 86400); $remaining_accounts[] = $account; } } // DNS解析成功,清除重试计数 cache_delete($retry_key); emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "域名解析暂停成功(重试后)", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_INFO )); } catch(Exception $e) { xn_log("处理DNS失败队列异常: " . $e->getMessage(), "account"); $remaining_accounts[] = $account; } } // 更新队列 if(!empty($remaining_accounts)) { cache_set($queue_key, $remaining_accounts, 86400); xn_log("更新DNS失败队列,剩余 " . count($remaining_accounts) . " 个账号", "account"); } else { cache_delete($queue_key); xn_log("DNS失败队列处理完成,清空队列", "account"); } } // 处理禁用账号失败的队列 function emby_account_process_disable_failed_queue() { $queue_key = 'emby_disable_failed_queue'; // 获取队列中的所有账号 $accounts = cache_get($queue_key); if(empty($accounts) || !is_array($accounts)) { xn_log("禁用账号失败队列为空", "account"); return; } $remaining_accounts = array(); foreach($accounts as $account) { try { if(empty($account)) { continue; } // 获取重试次数 $retry_key = 'emby_disable_retry_' . $account['id']; $retry_count = cache_get($retry_key) ?: 0; // 获取服务器信息 $server = emby_server_read($account['server_id']); if(empty($server)) { xn_log("服务器不存在,ID: " . $account['server_id'], "account"); cache_delete($retry_key); } xn_log("处理禁用失败账号: " . json_encode($account), "account"); // 重试禁用账户 $policy_result = emby_api_set_user_policy($server, $account['emby_id'], array( 'IsDisabled' => true, )); xn_log("重试禁用账户结果: " . json_encode($policy_result), "account"); if($policy_result['code'] != 0 || empty($policy_result)) { // 如果重试次数超过5次,记录错误 if($retry_count >= 5) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "禁用账户失败(重试5次):" . $policy_result['message'], 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); cache_delete($retry_key); } else { // 增加重试次数并保留账号在队列中 cache_set($retry_key, $retry_count + 1, 86400); $remaining_accounts[] = $account; } } // 禁用成功,清除重试计数 cache_delete($retry_key); emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "账户禁用成功(重试后)", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_INFO )); // 继续处理域名解析 $dns_result = emby_resume_domain_dns( $account['domain'], $account['cloudflare_zone_id'], $account['cloudflare_record_id'], "1.2.3.4" ); if($dns_result['code'] != 0 || empty($dns_result)) { // 如果DNS解析失败,将账号加入DNS失败队列 $dns_queue = cache_get('emby_dns_failed_queue') ?: array(); $dns_queue[] = $account; cache_set('emby_dns_failed_queue', $dns_queue, 86400); cache_set('emby_dns_retry_' . $account['id'], 0, 86400); emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "暂停域名解析失败,已加入重试队列:" . $dns_result['message'], 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_WARNING )); } // 更新账号状态 $update_result = db_update('emby_accounts', array('id' => $account['id']), array('status' => 0)); if($update_result === FALSE) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "账户状态更新失败", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); } } catch(Exception $e) { xn_log("处理禁用失败队列异常: " . $e->getMessage(), "account"); $remaining_accounts[] = $account; } } // 更新队列 if(!empty($remaining_accounts)) { cache_set($queue_key, $remaining_accounts, 86400); xn_log("更新禁用失败队列,剩余 " . count($remaining_accounts) . " 个账号", "account"); } else { cache_delete($queue_key); xn_log("禁用失败队列处理完成,清空队列", "account"); } } // 修改原来的账号处理函数,添加禁用失败处理 function emby_account_process_expired_queue() { $queue_key = 'emby_expired_accounts_queue'; // 获取队列中的所有账号 $accounts = cache_get($queue_key); xn_log("获取队列账号: " . ($accounts ? json_encode($accounts) : "空"), "account"); if(empty($accounts)) { xn_log("队列为空", "account"); return; } xn_log("开始处理队列,共 " . count($accounts) . " 个账号", "account"); $remaining_accounts = array(); $dns_failed_accounts = array(); $disable_failed_accounts = array(); foreach($accounts as $account) { try { if(empty($account)) { continue; } // 获取重试次数 $retry_key = 'emby_account_retry_' . $account['id']; $retry_count = cache_get($retry_key) ?: 0; if($retry_count >= 5) { xn_log("账号 {$account['id']} 重试次数超过5次,跳过处理", "account"); emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "账号处理失败(重试5次)", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); } xn_log("处理队列中账号: " . json_encode($account), "account"); // 获取服务器信息 $server = emby_server_read($account['server_id']); if(empty($server)) { xn_log("服务器不存在,ID: " . $account['server_id'], "account"); } // 禁用账户 $policy_result = emby_api_set_user_policy($server, $account['emby_id'], array( 'IsDisabled' => true, )); xn_log("禁用账户结果:". json_encode($policy_result), "account"); if($policy_result['code'] != 0 || empty($policy_result)) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "API禁用账户失败:" . $policy_result['message'], 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); // 增加重试次数 cache_set($retry_key, $retry_count + 1, 86400); $disable_failed_accounts[] = $account; } // 暂停域名解析 $dns_result = emby_resume_domain_dns( $account['domain'], $account['cloudflare_zone_id'], $account['cloudflare_record_id'], "1.2.3.4" // 使用统一的IP地址 ); xn_log("暂停域名解析结果: " . json_encode($dns_result), "account"); if($dns_result['code'] != 0 || empty($dns_result)) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "暂停域名解析失败:" . $dns_result['message'], 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); // 增加重试次数 cache_set($retry_key, $retry_count + 1, 86400); $dns_failed_accounts[] = $account; } $update_result = db_update('emby_accounts', array('id' => $account['id']), array('status' => 0)); xn_log("更新用户状态: " . json_encode($update_result), "account"); if($update_result === FALSE) { emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "账户状态更新失败", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_ERROR )); $remaining_accounts[] = $account; } // 清除重试计数 cache_delete($retry_key); // 记录账户禁用日志 emby_log_create(array( 'uid' => $account['uid'], 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "账户已过期,自动禁用", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_INFO )); xn_log("账号处理完成: " . $account['id'], "account"); } catch(Exception $e) { xn_log("处理队列异常: " . $e->getMessage(), "account"); $remaining_accounts[] = $account; } } // 更新各个队列 if(!empty($dns_failed_accounts)) { cache_set('emby_dns_failed_queue', $dns_failed_accounts, 86400); xn_log("更新DNS失败队列,共 " . count($dns_failed_accounts) . " 个账号", "account"); } if(!empty($disable_failed_accounts)) { cache_set('emby_disable_failed_queue', $disable_failed_accounts, 86400); xn_log("更新禁用失败队列,共 " . count($disable_failed_accounts) . " 个账号", "account"); } if(!empty($remaining_accounts)) { cache_set($queue_key, $remaining_accounts, 86400); xn_log("更新主队列,剩余 " . count($remaining_accounts) . " 个账号", "account"); } else { cache_delete($queue_key); xn_log("队列处理完成,已清空队列", "account"); } } // 禁用/启用账号 function emby_account_toggle_status($uid, $disable = true) { // 获取账号信息 $account = db_find_one('emby_accounts', array('uid' => $uid)); xn_log("账号信息: " . json_encode($account), "emby_account"); if(empty($account)) { return array('code' => -1, 'message' => '账号不存在'); } // 获取服务器信息 $server = emby_server_read($account['server_id']); xn_log("服务器信息: " . json_encode($server), "emby_account"); if(empty($server)) { return array('code' => -1, 'message' => '服务器不存在'); } try { // 设置用户策略 $policy_result = emby_api_set_user_policy($server, $account['emby_id'], array( 'IsDisabled' => $disable, )); xn_log("更新用户策略结果: " . json_encode($policy_result), "emby_account"); $dns_ip = $disable ? "1.2.3.4" : $server['ip']; xn_log("DNS IP: " . $dns_ip, "emby_account"); $dns_result = emby_resume_domain_dns($account['domain'], $account['cloudflare_zone_id'], $account['cloudflare_record_id'], $dns_ip); xn_log("暂停域名解析结果: " . json_encode($dns_result), "emby_account"); // 更新账号状态 $result = db_update('emby_accounts', array('id' => $account['id']), array( 'status' => $disable ? 0 : 1, )); xn_log("更新账号状态结果: " . json_encode($result), "emby_account"); // 记录操作日志 emby_log_create(array( 'uid' => $uid, 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => $disable ? "账号已禁用" : "账号已启用", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_INFO )); } catch(Exception $e) { xn_log("操作账号失败:" . $e->getMessage(), "emby_account"); } } // 查询服务器用户 function emby_server_users($server_id, $page = 1, $page_size = 10) { $users = db_find('emby_accounts', array('server_id' => $server_id), array('id' => -1), $page, $page_size); $total = db_count('emby_accounts', array('server_id' => $server_id)); return array('code' => 0, 'message' => 'success', 'data' => array('users' => $users, 'total' => $total)); } /** * 搜索论坛用户 * * @param string $keyword 搜索关键词 * @return array 用户列表 */ function emby_search_forum_users($keyword) { // 转义搜索关键词 $keyword = addslashes($keyword); // 限制返回数量,防止数据量过大 $limit = 10; // 构建查询条件 $cond = array(); // XiunoBBS 的条件格式 $cond['username'] = array('LIKE' => "%$keyword%"); // 指定要返回的字段 $cols = array('uid', 'username', 'email'); // 查询用户,注意参数顺序:表名, 条件, 排序, 页码, 每页数量, 主键, 字段 $users = db_find('user', $cond, array(), 1, $limit, '', $cols); if(!$users) { return array(); } // 检查用户是否已有关联账号 foreach($users as &$user) { $exists = emby_account_find_by_uid($user['uid']); $user['has_emby'] = !empty($exists); } return $users; } /** * 根据用户ID查找关联的Emby账号 * * @param int $uid 用户ID * @return array|false 账号信息 */ function emby_account_find_by_uid($uid) { $account = db_find_one('emby_accounts', array('uid' => $uid)); return $account; } function emby_api_set_user_status($server, $user_id, $status) { // 获取当前用户信息 $account = db_find_one('emby_accounts', array('emby_id' => $user_id)); if(empty($account)) { return array('code' => -1, 'message' => '用户不存在'); } // 设置 Emby API 的禁用状态 $result = emby_api_request('/emby/Users/' . $user_id . '/Policy', array( 'IsDisabled' => $status == 0 ? true : false, ), 'POST', $server); if($result['code'] != 0) { return $result; } // 更新数据库状态 // 如果是永久用户(status = 2),禁用时设置为 -2(特殊禁用状态),启用时恢复为 2 $new_status = $status; if($account['status'] == 2 && $status == 0) { $new_status = -2; // 永久用户的禁用状态 } elseif($account['status'] == -2 && $status == 1) { $new_status = 2; // 恢复永久状态 } elseif($account['status'] == 2 && $status == 1) { $new_status = 2; // 保持永久状态 } if(!db_update('emby_accounts', array('emby_id' => $user_id), array('status' => $new_status))) { return array('code' => -1, 'message' => '更新用户状态失败'); } return array('code' => 0, 'message' => '设置用户状态成功'); } // 获取所有媒体库分类 function emby_api_get_libraries($server) { $result = emby_api_request('/Library/VirtualFolders', null, 'GET', $server); if($result['code'] != 0) { return $result; } $libraries = array(); foreach($result['data'] as $lib) { $libraries[] = array( 'name' => $lib['Name'], 'type' => $lib['CollectionType'], 'id' => $lib['ItemId'] ); } return array( 'code' => 0, 'message' => 'success', 'data' => $libraries ); } // 设置用户媒体库访问权限 function emby_api_block_libraries($server, $user_id, $libraries = array()) { // 获取当前用户信息 $user_result = emby_api_get_user($server, $user_id); if(!isset($user_result['code']) || $user_result['code'] != 0) { return array( 'code' => -1, 'message' => '获取用户信息失败' ); } // 获取当前策略 $policy = isset($user_result['data']['Policy']) ? $user_result['data']['Policy'] : array(); // 更新媒体库权限 $policy['BlockedMediaFolders'] = $libraries; // 更新用户策略 return emby_api_request('/Users/' . $user_id . '/Policy', $policy, 'POST', $server); } // 获取用户当前的媒体库权限设置 function emby_api_get_user_libraries($server, $user_id) { // 获取所有媒体库 $libraries_result = emby_api_get_libraries($server); if(!isset($libraries_result['code']) || $libraries_result['code'] != 0) { return array( 'code' => -1, 'message' => '获取媒体库列表失败' ); } // 获取用户信息 $user_result = emby_api_get_user($server, $user_id); if(!isset($user_result['code']) || $user_result['code'] != 0) { return array( 'code' => -1, 'message' => '获取用户信息失败' ); } // 确保返回一个空数组而不是 null $blocked_libraries = array(); if(isset($user_result['data']['Policy']['BlockedMediaFolders']) && is_array($user_result['data']['Policy']['BlockedMediaFolders'])) { $blocked_libraries = $user_result['data']['Policy']['BlockedMediaFolders']; } return array( 'code' => 0, 'message' => array( 'libraries' => $libraries_result['data'], 'blocked_libraries' => $blocked_libraries ) ); } // 生成密码策略 function emby_api_pwd_policy($user_id, $reset = false, $new_password = null) { if($new_password === null) { return array( 'Id' => $user_id, 'ResetPassword' => $reset ); } else { return array( 'Id' => $user_id, 'NewPw' => $new_password ); } } // 重置用户密码 function emby_api_reset_password($server, $user_id, $new_password = null) { // 第一步:重置密码 $reset_policy = emby_api_pwd_policy($user_id, true); $reset_result = emby_api_request('/Users/' . $user_id . '/Password', $reset_policy, 'POST', $server); if($reset_result['code'] != 0) { return $reset_result; } // 如果提供了新密码,设置新密码 if($new_password !== null) { $new_policy = emby_api_pwd_policy($user_id, false, $new_password); $new_result = emby_api_request('/Users/' . $user_id . '/Password', $new_policy, 'POST', $server); if($new_result['code'] != 0) { return $new_result; } } return array( 'code' => 0, 'message' => '密码重置成功' ); } ?>

界面错误

上传时间:2025-07-08
上传用户:sshsvgsj
免责声明

此内容由网友转载自网络公开渠道,仅供学习测试,著作权归原作者所有。
本站不对此内容担负法律责任,请于下载后24小时内删除。
如发现内容侵权,请联系本站邮箱:[email protected],我们将在12小时内及时处理。

这家伙太懒了,什么也没留下。
已有回复 (3)
  • V Surile  (UID: 1) CEO @Ta
    8天前
    沙发
    在更新哦、
  •  (UID: 188) @Ta
    8天前
    椅子
    什么情况
  • Sapphirecho8  (UID: 946) @Ta
    7天前
    板凳
服务器赞助商
发新帖
推广
服务器赞助商