xiongzhu 1 rok temu
rodzic
commit
579f58900f

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

@@ -27,7 +27,8 @@ export enum RcsNumberSource {
     xyz = 'xyz',
     hwyzm = 'hwyzm',
     cowboy = 'cowboy',
-    durainus = 'durainus'
+    durainus = 'durainus',
+    textverified = 'textverified',
 }
 
 @Entity()

+ 72 - 0
src/rcs-number/impl/textverified.service.ts

@@ -0,0 +1,72 @@
+import axios from 'axios'
+import { GetNumberService, GetNumberResponse } from './get-number-service'
+import { RcsNumber, RcsNumberSource, RcsNumberStatus } from '../entities/rcs-number.entity'
+import { InternalServerErrorException, Logger } from '@nestjs/common'
+import { addMinutes } from 'date-fns'
+
+const account = 'ihzc9190@gmail.com'
+const apiKey = 'oFASOiuSPfZVddOhB83XtLyJrilufUpGvAIuyQxRPn8kwiAylaBYsXsOvFIKrg'
+
+let token = ''
+let expiresAt = null
+
+async function getAxiosInstance() {
+    const axiosInstance = axios.create({
+        baseURL: 'https://www.textverified.com'
+    })
+    if (!(token && expiresAt && expiresAt > Date.now())) {
+        const { data } = await axiosInstance.post('/api/pub/v2/auth', null, {
+            headers: {
+                'content-length': 0,
+                'x-api-key': apiKey,
+                'x-api-username': account
+            }
+        })
+        token = data.token
+        expiresAt = addMinutes(new Date(data.expiresAt), -1)
+    }
+    axiosInstance.defaults.headers.common['Authorization'] = `Bearer ${token}`
+    return axiosInstance
+}
+
+export class textverified extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.textverified
+
+    async getNumber(country: string, num?: number): Promise<GetNumberResponse> {
+        if (country.toLocaleLowerCase() !== 'us') throw new Error('Only US is supported')
+        const axiosInstance = await getAxiosInstance()
+        const {
+            data: { href }
+        } = await axiosInstance.post('/api/pub/v2/verifications', {
+            serviceName: 'googlemessenger',
+            capability: 'sms'
+        })
+        const { data: detail } = await axiosInstance.get(href)
+        return {
+            orderId: detail.id,
+            number: detail.number,
+            operatorCode: '',
+            rawResponse: JSON.stringify(detail),
+            source: this.source,
+            expiryTime: new Date(detail.endsAt)
+        }
+    }
+
+    async releaseNumber(number: string) {}
+
+    async retriveMessage(orderId: string, num?: number): Promise<string> {
+        const axiosInstance = await getAxiosInstance()
+        const { data } = await axiosInstance.get(`/api/pub/v2/sms`, {
+            params: { ReservationId: orderId }
+        })
+        if (data.data && data.data.length) {
+            return data.data[0].smsContent.trim()
+        }
+    }
+
+    async blockNumber(number: string) {}
+
+    async cacheNumber(country: string, size: number) {
+        return null
+    }
+}

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

@@ -20,6 +20,7 @@ import { hwyzm } from './impl/hwyzm.service'
 import { cowboy } from './impl/cowboy.service'
 import { durainus } from './impl/durainus.service'
 import { SysConfigModule } from 'src/sys-config/sys-config.module'
+import { textverified } from './impl/textverified.service'
 
 @Module({
     imports: [
@@ -31,9 +32,21 @@ import { SysConfigModule } from 'src/sys-config/sys-config.module'
         CarrierIdModule,
         SysConfigModule
     ],
-    providers: [RcsNumberService, mwze167, durian, i18nvc, firefox, d38, cloud214, xyz, hwyzm, cowboy, durainus],
+    providers: [
+        RcsNumberService,
+        mwze167,
+        durian,
+        i18nvc,
+        firefox,
+        d38,
+        cloud214,
+        xyz,
+        hwyzm,
+        cowboy,
+        durainus,
+        textverified
+    ],
     controllers: [RcsNumberController],
     exports: [RcsNumberService]
 })
-export class RcsNumberModule {
-}
+export class RcsNumberModule {}

+ 4 - 0
src/rcs-number/rcs-number.service.ts

@@ -1,3 +1,4 @@
+import { textverified } from './impl/textverified.service'
 import { mwze167 } from './impl/mwze167.service'
 import { forwardRef, Inject, Injectable, Logger, ServiceUnavailableException } from '@nestjs/common'
 import { InjectRepository } from '@nestjs/typeorm'
@@ -64,6 +65,7 @@ export class RcsNumberService {
         private hwyzm: hwyzm,
         private cowboy: cowboy,
         private durainus: durainus,
+        private textverified: textverified,
         private readonly redisService: RedisService
     ) {
         this.cloud033 = new cloud214('100033', '1e40ca9795b1fc038db76512175d59b5', RcsNumberSource.cloud033)
@@ -291,6 +293,8 @@ export class RcsNumberService {
                 return this.cowboy
             case RcsNumberSource.durainus:
                 return this.durainus
+            case RcsNumberSource.textverified:
+                return this.textverified
             default:
                 throw new ServiceUnavailableException('不支持的短信通道')
         }