完善手机接码逻辑
This commit is contained in:
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user