// 直接将所有过期账号存入队列 $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_account_reset_password($uid) { // 获取账号信息 $account = db_find_one('emby_accounts', array('uid' => $uid)); if(empty($account)) { return array('code' => -1, 'message' => '账号不存在'); } // 获取服务器信息 $server = emby_server_read($account['server_id']); if(empty($server)) { return array('code' => -1, 'message' => '服务器不存在'); } try { // 生成新密码 $new_password = emby_generate_random_password(); // 重置密码 $result = emby_api_request('/emby/Users/' . $account['emby_id'] . '/Password', array( 'Id' => $account['emby_id'], 'NewPw' => $new_password, 'ResetPassword' => true ), 'POST', $server); if($result['code'] != 0) { return array('code' => -1, 'message' => '重置密码失败'); } // 更新数据库中的密码 $update_result = db_update('emby_accounts', array('id' => $account['id']), array( 'password' => $new_password, 'update_time' => time() )); if(!$update_result) { return array('code' => -1, 'message' => '更新密码失败'); } // 记录操作日志 emby_log_create(array( 'uid' => $uid, 'type' => EMBY_LOG_TYPE_ACCOUNT, 'action' => "密码已重置", 'related_id' => $account['id'], 'level' => EMBY_LOG_LEVEL_INFO )); return array( 'code' => 0, 'message' => '密码重置成功', 'data' => array( 'password' => $new_password ) ); } catch(Exception $e) { xn_log("重置密码失败:" . $e->getMessage(), "emby_account"); return array('code' => -1, 'message' => '重置失败:' . $e->getMessage()); } } // 获取账号状态 function emby_account_get_status($uid) { // 获取账号信息 $account = db_find_one('emby_accounts', array('uid' => $uid)); if(empty($account)) { return array('code' => -1, 'message' => '账号不存在'); } // 获取服务器信息 $server = emby_server_read($account['server_id']); if(empty($server)) { return array('code' => -1, 'message' => '服务器不存在'); } try { // 获取用户信息 $result = emby_api_request('/emby/Users/' . $account['emby_id'], null, 'GET', $server); if($result['code'] != 0) { return array('code' => -1, 'message' => '获取用户信息失败'); } // 获取用户策略 $policy_result = emby_api_request('/emby/Users/' . $account['emby_id'] . '/Policy', null, 'GET', $server); if($policy_result['code'] != 0) { return array('code' => -1, 'message' => '获取用户策略失败'); } return array( 'code' => 0, 'message' => 'success', 'data' => array( 'account' => $account, 'user' => $result['data'], 'policy' => $policy_result['data'] ) ); } catch(Exception $e) { xn_log("获取账号状态失败:" . $e->getMessage(), "emby_account"); return array('code' => -1, 'message' => '获取失败:' . $e->getMessage()); } } ?>