完善手机接码逻辑

This commit is contained in:
QLHazyCoder
2026-05-15 05:07:34 +08:00
parent a7ea261093
commit 22fc865f19
10 changed files with 475 additions and 61 deletions
+22 -12
View File
@@ -574,22 +574,32 @@
return /not\s+enough\s+(?:user\s+)?balance|not\s+enough\s+rating|unauthorized|invalid\s+token|banned|bad\s+(?:country|operator)|no\s+product|server\s+offline/i.test(text);
}
function assertMaxPriceCompatibleWithOperator(state = {}) {
const maxPrice = normalizeFiveSimMaxPrice(state.fiveSimMaxPrice);
const operator = normalizeFiveSimOperator(state.fiveSimOperator);
if (maxPrice && operator !== DEFAULT_OPERATOR) {
throw new Error('5sim maxPrice only works when operator is "any"; clear the price limit or switch operator to any before buying a number.');
}
}
async function buyActivationWithPrice(state = {}, countryConfig, maxPrice, deps = {}) {
const config = resolveConfig(state, deps);
const operator = normalizeFiveSimOperator(state.fiveSimOperator);
function assertMaxPriceCompatibleWithOperator(state = {}) {
const maxPrice = normalizeFiveSimMaxPrice(state.fiveSimMaxPrice);
const operator = normalizeFiveSimOperator(state.fiveSimOperator);
if (maxPrice && operator !== DEFAULT_OPERATOR) {
throw new Error('5sim maxPrice only works when operator is "any"; clear the price limit or switch operator to any before buying a number.');
}
}
function normalizeReuseEnabled(state = {}) {
if (Object.prototype.hasOwnProperty.call(state, 'phoneSmsReuseEnabled')) {
return state.phoneSmsReuseEnabled !== false;
}
if (Object.prototype.hasOwnProperty.call(state, 'heroSmsReuseEnabled')) {
return state.heroSmsReuseEnabled !== false;
}
return true;
}
async function buyActivationWithPrice(state = {}, countryConfig, maxPrice, deps = {}) {
const config = resolveConfig(state, deps);
const operator = normalizeFiveSimOperator(state.fiveSimOperator);
const query = {};
if (maxPrice !== null && maxPrice !== undefined) {
query.maxPrice = maxPrice;
}
if (state.fiveSimReuseEnabled !== false) {
if (normalizeReuseEnabled(state)) {
query.reuse = 1;
}
const payload = await fetchJson(
+106 -10
View File
@@ -1,41 +1,137 @@
// phone-sms/providers/registry.js — 接码平台注册表
// phone-sms/providers/registry.js - phone SMS provider registry
(function attachPhoneSmsProviderRegistry(root, factory) {
root.PhoneSmsProviderRegistry = factory(root);
})(typeof self !== 'undefined' ? self : globalThis, function createPhoneSmsProviderRegistry(root) {
const PROVIDER_HERO_SMS = 'hero-sms';
const PROVIDER_FIVE_SIM = '5sim';
const PROVIDER_NEXSMS = 'nexsms';
const DEFAULT_PROVIDER = PROVIDER_HERO_SMS;
const DEFAULT_PROVIDER_ORDER = Object.freeze([
PROVIDER_HERO_SMS,
PROVIDER_FIVE_SIM,
PROVIDER_NEXSMS,
]);
const PROVIDER_DEFINITIONS = Object.freeze({
[PROVIDER_HERO_SMS]: Object.freeze({
id: PROVIDER_HERO_SMS,
label: 'HeroSMS',
moduleKey: 'PhoneSmsHeroSmsProvider',
}),
[PROVIDER_FIVE_SIM]: Object.freeze({
id: PROVIDER_FIVE_SIM,
label: '5sim',
moduleKey: 'PhoneSmsFiveSimProvider',
}),
[PROVIDER_NEXSMS]: Object.freeze({
id: PROVIDER_NEXSMS,
label: 'NexSMS',
moduleKey: 'PhoneSmsNexSmsProvider',
}),
});
function normalizeProviderId(value = '') {
const normalized = String(value || '').trim().toLowerCase();
return normalized === PROVIDER_FIVE_SIM ? PROVIDER_FIVE_SIM : PROVIDER_HERO_SMS;
function resolveProviderKey(value = '') {
if (value && typeof value === 'object' && !Array.isArray(value)) {
return String(value.provider || value.id || value.value || '').trim().toLowerCase();
}
return String(value || '').trim().toLowerCase();
}
function isKnownProviderId(providerId = '') {
return Boolean(PROVIDER_DEFINITIONS[providerId]);
}
function normalizeProviderId(value = '', fallback = DEFAULT_PROVIDER) {
const normalized = resolveProviderKey(value);
if (isKnownProviderId(normalized)) {
return normalized;
}
const fallbackNormalized = resolveProviderKey(fallback);
if (isKnownProviderId(fallbackNormalized)) {
return fallbackNormalized;
}
return DEFAULT_PROVIDER;
}
function normalizeProviderOrder(value = [], fallbackOrder = DEFAULT_PROVIDER_ORDER) {
const source = Array.isArray(value)
? value
: String(value || '')
.split(/[\r\n,;]+/)
.map((entry) => String(entry || '').trim())
.filter(Boolean);
const normalized = [];
const seen = new Set();
const pushProvider = (entry) => {
const provider = normalizeProviderId(entry, DEFAULT_PROVIDER);
if (!provider || seen.has(provider)) {
return;
}
seen.add(provider);
normalized.push(provider);
};
source.forEach((entry) => {
pushProvider(entry && typeof entry === 'object' && !Array.isArray(entry)
? (entry.provider || entry.id || entry.value || '')
: entry);
});
if (normalized.length) {
return normalized.slice(0, DEFAULT_PROVIDER_ORDER.length);
}
const fallback = Array.isArray(fallbackOrder) ? fallbackOrder : [];
fallback.forEach((entry) => {
pushProvider(entry && typeof entry === 'object' && !Array.isArray(entry)
? (entry.provider || entry.id || entry.value || '')
: entry);
});
return normalized.slice(0, DEFAULT_PROVIDER_ORDER.length);
}
function getProviderIds() {
return DEFAULT_PROVIDER_ORDER.slice();
}
function getProviderDefinition(providerId = DEFAULT_PROVIDER) {
return PROVIDER_DEFINITIONS[normalizeProviderId(providerId)] || PROVIDER_DEFINITIONS[DEFAULT_PROVIDER];
}
function getProviderModule(providerId = DEFAULT_PROVIDER) {
const normalized = normalizeProviderId(providerId);
if (normalized === PROVIDER_FIVE_SIM) {
return root.PhoneSmsFiveSimProvider || null;
const definition = getProviderDefinition(providerId);
const moduleKey = definition?.moduleKey;
if (!moduleKey) {
return null;
}
return root.PhoneSmsHeroSmsProvider || null;
return root?.[moduleKey] || null;
}
function createProvider(providerId = DEFAULT_PROVIDER, deps = {}) {
const definition = getProviderDefinition(providerId);
const module = getProviderModule(providerId);
if (!module || typeof module.createProvider !== 'function') {
throw new Error(`Phone SMS provider is not loaded: ${normalizeProviderId(providerId)}`);
throw new Error(`Phone SMS provider module is not loaded: ${definition.id}`);
}
return module.createProvider(deps);
}
function getProviderLabel(providerId = DEFAULT_PROVIDER) {
return normalizeProviderId(providerId) === PROVIDER_FIVE_SIM ? '5sim' : 'HeroSMS';
return getProviderDefinition(providerId)?.label || 'HeroSMS';
}
return {
PROVIDER_HERO_SMS,
PROVIDER_FIVE_SIM,
PROVIDER_NEXSMS,
DEFAULT_PROVIDER,
DEFAULT_PROVIDER_ORDER,
PROVIDER_DEFINITIONS,
normalizeProviderId,
normalizeProviderOrder,
getProviderIds,
getProviderDefinition,
getProviderModule,
createProvider,
getProviderLabel,