wuyi 1 жил өмнө
parent
commit
706265963c

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

@@ -1,6 +1,7 @@
 import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'
 import { JsonTransformer } from '../../transformers/json.transformer'
 import { Exclude } from 'class-transformer'
+import { firefox } from '../impl/firefox.service'
 
 export enum RcsNumberStatus {
     PENDING = 'pending',
@@ -13,7 +14,8 @@ export enum RcsNumberSource {
     usacode = 'usacode',
     mwze167 = 'mwze167',
     durian = 'durian',
-    i18nvc = 'i18nvc'
+    i18nvc = 'i18nvc',
+    firefox = 'firefox'
 }
 
 @Entity()

+ 99 - 0
src/rcs-number/impl/firefox.service.ts

@@ -0,0 +1,99 @@
+import axios from 'axios'
+import { GetNumberService, GetNumberResponse } from './get-number-service'
+import { RcsNumberSource } from '../entities/rcs-number.entity'
+
+const token = '560b119b09bebd305e9a732ce7bdcca4_74548'
+const iid = 1002
+
+
+const axiosInstance = axios.create({
+    baseURL: 'http://www.firefox.fun/'
+})
+
+const countryMap = {
+    'US': 'usa',
+    'GB': 'eng',
+    'IN': 'ind',
+    'ID': 'idn',
+    'AR': 'arg',
+    'PH': 'phl',
+    'CM': 'cmr',
+    'CO': 'col',
+    'BR': 'bra',
+    'VN': 'vnm',
+    'MX': 'mex',
+    'TR': 'tur',
+    'ZA': 'zaf'
+}
+
+export class firefox extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.firefox
+
+    async getNumber(country: string): Promise<GetNumberResponse> {
+        const countryCode = countryMap[country]
+        if (!countryCode) {
+            throw new Error('No available country')
+        }
+        const res = await axiosInstance.get('yhapi.ashx', {
+            params: {
+                token,
+                act: 'getPhone',
+                iid,
+                country: countryCode,
+                maxPrice: 2
+            }
+        })
+        let result = res.data
+
+        const parts = result.split('|').map(part => part.trim())
+
+        const code = parts[0]
+        const pkey = parts[1]
+        if (code !== '1') {
+            let errorMsg = ''
+            switch (pkey) {
+                case -1:
+                    errorMsg = 'No available numbers'
+                    break
+                case -6:
+                    errorMsg = 'Project disabled'
+                    break
+                case -5:
+                    errorMsg = 'Project not audited'
+                    break
+                case -8:
+                    errorMsg = 'Balance empty'
+                    break
+                case -10:
+                    errorMsg = 'Projects are not allowed to specify a number'
+                    break
+                default:
+                    errorMsg = 'false'
+            }
+            throw new Error(errorMsg)
+        }
+
+        const number = parts[7]
+        result = result.replace(/\|/g, '\n')
+        return {
+            number: number,
+            orderId: pkey,
+            operatorCode: '',
+            rawResponse: result
+        }
+    }
+
+    async reetriveMessage(orderId: string): Promise<string> {
+        const res = await axiosInstance.get('yhapi.ashx', {
+            params: {
+                act: 'getPhoneCode',
+                token,
+                pkey: orderId
+            }
+        })
+        const parts = res.data.split('|').map(part => part.trim())
+        if (parts[0] === '1') {
+            return parts[2]
+        }
+    }
+}

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

@@ -10,10 +10,11 @@ import { OperaterConfigModule } from 'src/operator_config/operator_config.module
 import { TaskModule } from 'src/task/task.module'
 import { ChannelModule } from 'src/channel/channel.module'
 import { i18nvc } from './impl/i18nvc.service'
+import { firefox } from './impl/firefox.service'
 
 @Module({
     imports: [TypeOrmModule.forFeature([RcsNumber]), DeviceModule, OperaterConfigModule, TaskModule, ChannelModule],
-    providers: [RcsNumberService, mwze167, durian, i18nvc],
+    providers: [RcsNumberService, mwze167, durian, i18nvc, firefox],
     controllers: [RcsNumberController],
     exports: [RcsNumberService]
 })

+ 51 - 15
src/rcs-number/rcs-number.service.ts

@@ -19,6 +19,7 @@ import { checkAndFormatNumber, matchOperator } from './helpers'
 import { GetNumberService } from './impl/get-number-service'
 import { ChannelService } from '../channel/channel.service'
 import { i18nvc } from './impl/i18nvc.service'
+import { firefox } from './impl/firefox.service'
 
 @Injectable()
 export class RcsNumberService {
@@ -33,7 +34,8 @@ export class RcsNumberService {
         private channelService: ChannelService,
         private mwze167: mwze167,
         private durian: durian,
-        private i18nvc: i18nvc
+        private i18nvc: i18nvc,
+        private firefox: firefox
     ) {
     }
 
@@ -99,15 +101,32 @@ export class RcsNumberService {
         }
         const channel = availableChannels[Math.floor(Math.random() * availableChannels.length)]
         let numberService: GetNumberService
-        if (channel.source === RcsNumberSource.mwze167) {
-            numberService = this.mwze167
-        } else if (channel.source === RcsNumberSource.durian) {
-            numberService = this.durian
-        } else if (channel.source === RcsNumberSource.i18nvc) {
-            numberService = this.i18nvc
-        } else {
-            throw new Error('不支持的短信通道')
+
+        switch (channel.source) {
+            case RcsNumberSource.mwze167:
+                numberService = this.mwze167
+                break
+            case RcsNumberSource.durian:
+                numberService = this.durian
+                break
+            case RcsNumberSource.i18nvc:
+                numberService = this.i18nvc
+                break
+            case RcsNumberSource.firefox:
+                numberService = this.firefox
+                break
+            default:
+                throw new Error('不支持的短信通道')
         }
+        // if (channel.source === RcsNumberSource.mwze167) {
+        //     numberService = this.mwze167
+        // } else if (channel.source === RcsNumberSource.durian) {
+        //     numberService = this.durian
+        // } else if (channel.source === RcsNumberSource.i18nvc) {
+        //     numberService = this.i18nvc
+        // } else {
+        //     throw new Error('不支持的短信通道')
+        // }
         const res = await numberService.getNumber(operatorConfig.country)
         res.number = checkAndFormatNumber(operatorConfig.country, res.number, res.operatorName)
         const mapTo = matchOperator(res.operatorCode, operatorConfig)
@@ -162,13 +181,30 @@ export class RcsNumberService {
 
             try {
                 let msg: string
-                if (number.from === RcsNumberSource.mwze167) {
-                    msg = await this.mwze167.reetriveMessage(number.orderId)
-                } else if (number.from === RcsNumberSource.durian) {
-                    msg = await this.durian.reetriveMessage(number.orderId)
-                } else if (number.from === RcsNumberSource.i18nvc) {
-                    msg = await this.i18nvc.reetriveMessage(number.orderId)
+
+                switch (number.from){
+                    case RcsNumberSource.mwze167:
+                        msg = await this.mwze167.reetriveMessage(number.orderId)
+                        break
+                    case RcsNumberSource.durian:
+                        msg = await this.durian.reetriveMessage(number.orderId)
+                        break
+                    case RcsNumberSource.i18nvc:
+                        msg = await this.i18nvc.reetriveMessage(number.orderId)
+                        break
+                    case RcsNumberSource.firefox:
+                        msg = await this.firefox.reetriveMessage(number.orderId)
+                        break
+                    default:
                 }
+
+                // if (number.from === RcsNumberSource.mwze167) {
+                //     msg = await this.mwze167.reetriveMessage(number.orderId)
+                // } else if (number.from === RcsNumberSource.durian) {
+                //     msg = await this.durian.reetriveMessage(number.orderId)
+                // } else if (number.from === RcsNumberSource.i18nvc) {
+                //     msg = await this.i18nvc.reetriveMessage(number.orderId)
+                // }
                 if (msg) {
                     number.status = RcsNumberStatus.SUCCESS
                     number.message = msg