Pārlūkot izejas kodu

feat(rcs-number): 集成 smstiger 短信平台

- 在 rcs-number模块中添加 smstiger服务
- 更新 rcs-number 实体,增加 smstiger 作为短信来源之一
- 修改 rcs-number 服务,支持 smstiger 短信平台的操作
- 在任务服务中添加 smstiger API 性能统计
wui 8 mēneši atpakaļ
vecāks
revīzija
c687d7f8a8

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

@@ -45,7 +45,8 @@ export enum RcsNumberSource {
     sms4verify02 = 'sms4verify02',
     sms23256 = 'sms23256',
     svenkvint = 'svenkvint',
-    smsapi = 'smsapi'
+    smsapi = 'smsapi',
+    smstiger = 'smstiger'
 }
 
 @Entity()

+ 62 - 0
src/rcs-number/impl/smstiger.service.ts

@@ -0,0 +1,62 @@
+import { RcsNumberSource } from '../entities/rcs-number.entity'
+import { GetNumberResponse, GetNumberService } from './get-number-service'
+import axios from 'axios'
+
+const axiosInstance = axios.create({
+    baseURL: 'https://api.tiger-sms.com/stubs/'
+})
+const api_key = 't6AV7f5KgwRmWsK9M5xN6uTTtHiog8EQ'
+const service = 'gms'
+const countryCode = '187'
+
+export class smstiger extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.smstiger
+
+    async getNumber(country: string, num?: number): Promise<GetNumberResponse> {
+        if (country.toLocaleLowerCase() !== 'us') throw new Error(`Platform ${this.source} only support US.`)
+        const res = await axiosInstance.get(`handler_api.php`, {
+            params: {
+                api_key,
+                action: 'getNumber',
+                service,
+                country: countryCode
+            }
+        })
+        const data = res.data
+        const split = data.split(':')
+        if (split[0] !== 'ACCESS_NUMBER') {
+            throw new Error(`Platform ${this.source} get number error: ${data}`)
+        }
+
+        return {
+            number: split[2],
+            orderId: split[1],
+            operatorCode: '',
+            operatorName: '',
+            rawResponse: data
+        }
+    }
+
+    async retriveMessage(orderId: string, num?: number): Promise<string> {
+        const res = await axiosInstance.get(`handler_api.php`, {
+            params: {
+                api_key,
+                action: 'getStatus',
+                id: orderId
+            }
+        })
+        const data = res.data.split(':')
+        if (data[0] === 'STATUS_OK') {
+            return `Your Messenger verification code is G-${data[1]}`
+        }
+        return null
+    }
+
+    async releaseNumber(number: string): Promise<void> {}
+
+    async blockNumber(number: string): Promise<void> {}
+
+    async cacheNumber(country: string, size: number): Promise<GetNumberResponse[]> {
+        return null
+    }
+}

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

@@ -29,6 +29,7 @@ import { sms4verify } from './impl/sms4verify.service'
 import { sms23256 } from './impl/sms23256.service'
 import { svenkvint } from './impl/svenkvint.service'
 import { smsapi } from './impl/smsapi.service'
+import { smstiger } from './impl/smstiger.service'
 
 @Module({
     imports: [
@@ -60,7 +61,8 @@ import { smsapi } from './impl/smsapi.service'
         sms4verify,
         sms23256,
         svenkvint,
-        smsapi
+        smsapi,
+        smstiger
     ],
     controllers: [RcsNumberController],
     exports: [RcsNumberService]

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

@@ -5,7 +5,7 @@ import { InjectRepository } from '@nestjs/typeorm'
 import { RcsNumber, RcsNumberSource, RcsNumberStatus } from './entities/rcs-number.entity'
 import { PageRequest } from '../common/dto/page-request'
 import { paginate, Pagination } from 'nestjs-typeorm-paginate'
-import { Between, In, MoreThan, Not, Repository } from 'typeorm'
+import { Between, MoreThan, Not, Repository } from 'typeorm'
 import { DeviceService } from 'src/device/device.service'
 import { TaskService } from 'src/task/task.service'
 import { OperatorConfigService } from 'src/operator_config/operator_config.service'
@@ -38,6 +38,7 @@ import { sms4verify } from './impl/sms4verify.service'
 import { sms23256 } from './impl/sms23256.service'
 import { svenkvint } from './impl/svenkvint.service'
 import { smsapi } from './impl/smsapi.service'
+import { smstiger } from './impl/smstiger.service'
 
 @Injectable()
 export class RcsNumberService {
@@ -85,6 +86,7 @@ export class RcsNumberService {
         private sms23256: sms23256,
         private svenkvint: svenkvint,
         private smsapi: smsapi,
+        private smstiger: smstiger,
         private readonly redisService: RedisService
     ) {
         this.durian = new durian('unsnap3094', 'U3Jma1hkbUxXblEyL0ZYai9WWFVvdz09', RcsNumberSource.durian)
@@ -365,6 +367,8 @@ export class RcsNumberService {
                 return this.svenkvint
             case RcsNumberSource.smsapi:
                 return this.smsapi
+            case RcsNumberSource.smstiger:
+                return this.smstiger
             default:
                 throw new ServiceUnavailableException('不支持的短信通道')
         }

+ 26 - 1
src/task/task.service.ts

@@ -710,7 +710,8 @@ export class TaskService implements OnModuleInit {
             usapanel: 0,
             dashboard: 0,
             smspva: 0,
-            smspva02: 0
+            smspva02: 0,
+            smstiger: 0
         }
         // const cloudInstance = axios.create({
         //     baseURL: 'http://52.77.17.214:9001/api/',
@@ -728,6 +729,9 @@ export class TaskService implements OnModuleInit {
         const smspvaInstance = axios.create({
             baseURL: 'https://api.smspva.com/activation/'
         })
+        const smstigerInstance = axios.create({
+            baseURL: 'https://api.tiger-sms.com/stubs/'
+        })
 
         // 创建性能日志对象
         const perfLogs = {}
@@ -1000,6 +1004,27 @@ export class TaskService implements OnModuleInit {
                 perfLogs['smspva02'].endTime = Date.now()
                 perfLogs['smspva02'].duration = perfLogs['smspva02'].endTime - perfLogs['smspva02'].startTime
                 Logger.log(`API调用性能统计 - smspva02: ${perfLogs['smspva02'].duration}ms`, this.TAG)
+            })(),
+            (async () => {
+                const startTime = Date.now()
+                perfLogs['smstiger'] = { startTime }
+                try {
+                    const smstigerRes = await smstigerInstance.get('handler_api.php', {
+                        params: {
+                            api_key: 't6AV7f5KgwRmWsK9M5xN6uTTtHiog8EQ',
+                            action: 'getBalance'
+                        }
+                    })
+                    const data = smstigerRes.data.split(':')
+                    if (data[0] === 'ACCESS_BALANCE') {
+                        res.smstiger = data[1]
+                    }
+                } catch (e) {
+                    Logger.warn(`smstiger API调用失败: ${e.message}`, this.TAG)
+                }
+                perfLogs['smstiger'].endTime = Date.now()
+                perfLogs['smstiger'].duration = perfLogs['smstiger'].endTime - perfLogs['smstiger'].startTime
+                Logger.log(`API调用性能统计 - smstiger: ${perfLogs['smstiger'].duration}ms`, this.TAG)
             })()
         ])