Преглед изворни кода

feat(rcs-number): 新增 globalcode 和 smsman 服务

- 实现了 globalcode 和 smsman 服务的接口和功能
- 在 RcsNumberService 中集成了新服务
- 更新了 RcsNumberSource 枚举,添加了新的服务源
wui пре 6 месеци
родитељ
комит
777c3a7ef6

+ 3 - 1
src/rcs-number/entities/rcs-number.entity.ts

@@ -49,7 +49,9 @@ export enum RcsNumberSource {
     smsapi = 'smsapi',
     smstiger = 'smstiger',
     smstiger02 = 'smstiger02',
-    xlcode = 'xlcode'
+    xlcode = 'xlcode',
+    smsman = 'smsman',
+    globalcode = 'globalcode'
 }
 
 @Entity()

+ 65 - 0
src/rcs-number/impl/globalcode.service.ts

@@ -0,0 +1,65 @@
+import { RcsNumberSource } from '../entities/rcs-number.entity'
+import { GetNumberResponse, GetNumberService } from './get-number-service'
+import axios from 'axios'
+import { InternalServerErrorException } from '@nestjs/common'
+
+const token = '6555dc93c3fecf222ff4daea6a3697a6ee66a8d60ea47bdb2e19281e226f3b61'
+const serviceId = '84'
+const spid = '2'
+
+const axiosInstance = axios.create({
+    baseURL: 'https://api.globalsimc.com/serviceapi'
+})
+
+export class globalcode extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.globalcode
+
+    async getNumber(country: string, num?: number): Promise<GetNumberResponse> {
+        const { data } = await axiosInstance.get('/getnumber/', {
+            params: {
+                token,
+                serviceid: serviceId,
+                iso: country.toUpperCase(),
+                spid
+            }
+        })
+
+        if (data.code !== 1) {
+            throw new InternalServerErrorException('Failed to get number')
+        }
+
+        return {
+            number: data.data.tel,
+            orderId: data.data.orderid,
+            operatorCode: data.data.code,
+            operatorName: '',
+            rawResponse: data.data
+        }
+    }
+
+    async retriveMessage(orderId: string, num?: number): Promise<string> {
+        const { data } = await axiosInstance.get('/getcode/', {
+            params: {
+                token,
+                id: orderId
+            }
+        })
+
+        if (data.code !== 1) {
+            throw new InternalServerErrorException('Failed to get message')
+        }
+
+        const smsData = data.data[orderId]
+        if (smsData && smsData.sms != '') {
+            return smsData.sms
+        }
+    }
+
+    async releaseNumber(number: string): Promise<void> {}
+
+    async blockNumber(number: string): Promise<void> {}
+
+    async cacheNumber(country: string, size: number): Promise<GetNumberResponse[]> {
+        return null
+    }
+}

+ 77 - 0
src/rcs-number/impl/smsman.service.ts

@@ -0,0 +1,77 @@
+import { RcsNumberSource } from '../entities/rcs-number.entity'
+import { GetNumberResponse, GetNumberService } from './get-number-service'
+import axios from 'axios'
+import { InternalServerErrorException } from '@nestjs/common'
+
+const token = 'BFEjAMIAEsd8EhmyReGZyKxdGPolhpSx'
+const application_id = '4962'
+const countryMap = {}
+
+const axiosInstance = axios.create({
+    baseURL: 'https://api.sms-man.com/control/'
+})
+
+export class smsman extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.smsman
+
+    async getNumber(country: string, num?: number): Promise<GetNumberResponse> {
+        if (Object.keys(countryMap).length === 0) {
+            await this.getCountryMap()
+        }
+
+        if (!countryMap[country.toUpperCase()]) {
+            throw new Error(`Country ${country} not supported`)
+        }
+
+        const res = await axiosInstance.get('get-number', {
+            params: {
+                token,
+                country_id: countryMap[country.toUpperCase()],
+                application_id
+            }
+        })
+
+        if (res.data.error_code) {
+            throw new InternalServerErrorException(res.data.error_msg)
+        }
+
+        return {
+            number: res.data.number,
+            orderId: res.data.request_id,
+            operatorCode: '',
+            operatorName: '',
+            rawResponse: res.data
+        }
+    }
+
+    async retriveMessage(orderId: string, num?: number): Promise<string> {
+        const { data } = await axiosInstance.get('get-sms', {
+            params: {
+                token,
+                request_id: orderId
+            }
+        })
+        if (data.sms_code) {
+            return `Your Messenger verification code is G-${data.sms_code}`
+        }
+    }
+
+    async releaseNumber(number: string): Promise<void> {}
+
+    async blockNumber(number: string): Promise<void> {}
+
+    async cacheNumber(country: string, size: number): Promise<GetNumberResponse[]> {
+        return null
+    }
+
+    private async getCountryMap() {
+        const res = await axiosInstance.get('countries', {
+            params: {
+                token
+            }
+        })
+        Object.values(res.data).forEach((country: any) => {
+            countryMap[country.code] = country.id
+        })
+    }
+}

+ 5 - 1
src/rcs-number/rcs-number.module.ts

@@ -31,6 +31,8 @@ import { svenkvint } from './impl/svenkvint.service'
 import { smsapi } from './impl/smsapi.service'
 import { smstiger } from './impl/smstiger.service'
 import { xlcode } from './impl/xlcode.service'
+import { smsman } from './impl/smsman.service'
+import { globalcode } from './impl/globalcode.service'
 
 @Module({
     imports: [
@@ -64,7 +66,9 @@ import { xlcode } from './impl/xlcode.service'
         svenkvint,
         smsapi,
         smstiger,
-        xlcode
+        xlcode,
+        smsman,
+        globalcode
     ],
     controllers: [RcsNumberController],
     exports: [RcsNumberService]

+ 57 - 49
src/rcs-number/rcs-number.service.ts

@@ -40,6 +40,8 @@ import { svenkvint } from './impl/svenkvint.service'
 import { smsapi } from './impl/smsapi.service'
 import { smstiger } from './impl/smstiger.service'
 import { xlcode } from './impl/xlcode.service'
+import { smsman } from './impl/smsman.service'
+import { globalcode } from './impl/globalcode.service'
 
 @Injectable()
 export class RcsNumberService {
@@ -63,55 +65,6 @@ export class RcsNumberService {
 
     private readonly redis: Redis | null
 
-    constructor(
-        @InjectRepository(RcsNumber)
-        private rcsNumberRepository: Repository<RcsNumber>,
-        @InjectRepository(BlackList)
-        private blackListRepository: Repository<BlackList>,
-        @Inject(forwardRef(() => DeviceService))
-        private deviceService: DeviceService,
-        @Inject(forwardRef(() => TaskService))
-        private taskService: TaskService,
-        private operatorConfigService: OperatorConfigService,
-        private channelService: ChannelService,
-        private carrierIdService: CarrierIdService,
-        private sysConfigService: SysConfigService,
-        private mwze167: mwze167,
-        private i18nvc: i18nvc,
-        private firefox: firefox,
-        private d38: d38,
-        private xyz: xyz,
-        private hwyzm: hwyzm,
-        private cowboy: cowboy,
-        private durainus: durainus,
-        private usapanel: usapanel,
-        private textverified: textverified,
-        private dashboard: dashboard,
-        private sms23256: sms23256,
-        private svenkvint: svenkvint,
-        private smsapi: smsapi,
-        private xlcode: xlcode,
-        private readonly redisService: RedisService
-    ) {
-        this.durian = new durian('unsnap3094', 'U3Jma1hkbUxXblEyL0ZYai9WWFVvdz09', RcsNumberSource.durian)
-        this.durian02 = new durian('unsnap30941', 'RHJGV1paR1BFWjlFbCtnakUza2xJdz09', RcsNumberSource.durian02)
-        this.cloud033 = new cloud214('100033', '1e40ca9795b1fc038db76512175d59b5', RcsNumberSource.cloud033)
-        this.cloud034 = new cloud214('100034', '54bdd0d9dd6707b2b40d8deb5edb1385', RcsNumberSource.cloud034)
-        this.cloud037 = new cloud214('100037', 'aaec6c21e54dc53b92e472df21a95bb7', RcsNumberSource.cloud037)
-        this.cloud041 = new cloud214('100041', '8174f3107605645d17fd6c5edc0bfb7d', RcsNumberSource.cloud041)
-        this.cloud050 = new cloud214('100050', '6c0f25c802b82d2a5c78f01fb627be2c', RcsNumberSource.cloud050)
-        this.sms4verify01 = new sms4verify('Yt8kbBGbvMTL3OBZ2dvwXCm78MI59D', '0', RcsNumberSource.sms4verify01)
-        this.sms4verify02 = new sms4verify('402qwEj44JiaWMOOBPIxMnWaqeyIuV', '0', RcsNumberSource.sms4verify02)
-        this.sms4verify03 = new sms4verify('LFSsOnOjipHUE6jtgCpcEy7M9SEGme', '0.45', RcsNumberSource.sms4verify03)
-        this.sms7979 = new sms7979('BbrlHwT4IWrfxR1tbSP6O8RkzW7Gdh', 45, RcsNumberSource.sms7979)
-        this.sms797902 = new sms7979('BbrlHwT4IWrfxR1tbSP6O8RkzW7Gdh', 45, RcsNumberSource.sms797902)
-        this.smspva = new smspva('uNW56fGr0zstfs87Xn0e1l2gCYVnb1', RcsNumberSource.smspva)
-        this.smspva02 = new smspva('rTTL8pZtKkQ60zjU82bvbMEP7G6XGU', RcsNumberSource.smspva02)
-        this.smstiger = new smstiger('Aq7XKGX7qnCf6y8CouchYJ0VK60AxISm', RcsNumberSource.smstiger)
-        this.smstiger02 = new smstiger('t6AV7f5KgwRmWsK9M5xN6uTTtHiog8EQ', RcsNumberSource.smstiger02)
-        this.redis = this.redisService.getOrThrow()
-    }
-
     async findAll(req: PageRequest<RcsNumber>): Promise<Pagination<RcsNumber>> {
         let page = await paginate<RcsNumber>(this.rcsNumberRepository, req.page, req.search)
         let items = page.items
@@ -289,6 +242,57 @@ export class RcsNumberService {
         return number
     }
 
+    constructor(
+        @InjectRepository(RcsNumber)
+        private rcsNumberRepository: Repository<RcsNumber>,
+        @InjectRepository(BlackList)
+        private blackListRepository: Repository<BlackList>,
+        @Inject(forwardRef(() => DeviceService))
+        private deviceService: DeviceService,
+        @Inject(forwardRef(() => TaskService))
+        private taskService: TaskService,
+        private operatorConfigService: OperatorConfigService,
+        private channelService: ChannelService,
+        private carrierIdService: CarrierIdService,
+        private sysConfigService: SysConfigService,
+        private mwze167: mwze167,
+        private i18nvc: i18nvc,
+        private firefox: firefox,
+        private d38: d38,
+        private xyz: xyz,
+        private hwyzm: hwyzm,
+        private cowboy: cowboy,
+        private durainus: durainus,
+        private usapanel: usapanel,
+        private textverified: textverified,
+        private dashboard: dashboard,
+        private sms23256: sms23256,
+        private svenkvint: svenkvint,
+        private smsapi: smsapi,
+        private xlcode: xlcode,
+        private smsman: smsman,
+        private globalcode: globalcode,
+        private readonly redisService: RedisService
+    ) {
+        this.durian = new durian('unsnap3094', 'U3Jma1hkbUxXblEyL0ZYai9WWFVvdz09', RcsNumberSource.durian)
+        this.durian02 = new durian('unsnap30941', 'RHJGV1paR1BFWjlFbCtnakUza2xJdz09', RcsNumberSource.durian02)
+        this.cloud033 = new cloud214('100033', '1e40ca9795b1fc038db76512175d59b5', RcsNumberSource.cloud033)
+        this.cloud034 = new cloud214('100034', '54bdd0d9dd6707b2b40d8deb5edb1385', RcsNumberSource.cloud034)
+        this.cloud037 = new cloud214('100037', 'aaec6c21e54dc53b92e472df21a95bb7', RcsNumberSource.cloud037)
+        this.cloud041 = new cloud214('100041', '8174f3107605645d17fd6c5edc0bfb7d', RcsNumberSource.cloud041)
+        this.cloud050 = new cloud214('100050', '6c0f25c802b82d2a5c78f01fb627be2c', RcsNumberSource.cloud050)
+        this.sms4verify01 = new sms4verify('Yt8kbBGbvMTL3OBZ2dvwXCm78MI59D', '0', RcsNumberSource.sms4verify01)
+        this.sms4verify02 = new sms4verify('402qwEj44JiaWMOOBPIxMnWaqeyIuV', '0', RcsNumberSource.sms4verify02)
+        this.sms4verify03 = new sms4verify('LFSsOnOjipHUE6jtgCpcEy7M9SEGme', '0.45', RcsNumberSource.sms4verify03)
+        this.sms7979 = new sms7979('BbrlHwT4IWrfxR1tbSP6O8RkzW7Gdh', 45, RcsNumberSource.sms7979)
+        this.sms797902 = new sms7979('BbrlHwT4IWrfxR1tbSP6O8RkzW7Gdh', 45, RcsNumberSource.sms797902)
+        this.smspva = new smspva('uNW56fGr0zstfs87Xn0e1l2gCYVnb1', RcsNumberSource.smspva)
+        this.smspva02 = new smspva('rTTL8pZtKkQ60zjU82bvbMEP7G6XGU', RcsNumberSource.smspva02)
+        this.smstiger = new smstiger('Aq7XKGX7qnCf6y8CouchYJ0VK60AxISm', RcsNumberSource.smstiger)
+        this.smstiger02 = new smstiger('t6AV7f5KgwRmWsK9M5xN6uTTtHiog8EQ', RcsNumberSource.smstiger02)
+        this.redis = this.redisService.getOrThrow()
+    }
+
     async release(id: number): Promise<void> {
         const rcsNumber = await this.rcsNumberRepository.findOneBy({ id })
         if (rcsNumber) {
@@ -385,6 +389,10 @@ export class RcsNumberService {
                 return this.smstiger02
             case RcsNumberSource.xlcode:
                 return this.xlcode
+            case RcsNumberSource.globalcode:
+                return this.globalcode
+            case RcsNumberSource.smsman:
+                return this.smsman
             default:
                 throw new ServiceUnavailableException('不支持的短信通道')
         }