Browse Source

feat(rcs-number): 集成 svenkvint 服务

wui 10 months ago
parent
commit
c853f17f38

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

@@ -5,6 +5,7 @@ import { durainus } from '../impl/durainus.service'
 import { dashboard } from '../impl/dashboard.service'
 import { sms7979 } from '../impl/sms7979.service'
 import { sms4verify } from '../impl/sms4verify.service'
+import { svenkvint } from '../impl/svenkvint.service'
 
 export enum RcsNumberStatus {
     PENDING = 'pending',
@@ -39,7 +40,8 @@ export enum RcsNumberSource {
     sms797902 = 'sms797902',
     sms4verify01 = 'sms4verify01',
     sms4verify02 = 'sms4verify02',
-    sms23256 = 'sms23256'
+    sms23256 = 'sms23256',
+    svenkvint = 'svenkvint'
 }
 
 @Entity()

+ 83 - 0
src/rcs-number/impl/svenkvint.service.ts

@@ -0,0 +1,83 @@
+import { GetNumberResponse, GetNumberService } from './get-number-service'
+import { RcsNumberSource } from '../entities/rcs-number.entity'
+import { InternalServerErrorException } from '@nestjs/common'
+import axios from 'axios'
+import { createHash } from 'node:crypto'
+import * as querystring from 'node:querystring'
+
+const axiosInstance = axios.create({
+    baseURL: 'https://zqdql.svenkvint.com/api/'
+})
+
+const channel = 'tot9v30ornQKSPx4'
+const key = 'yXVesXPIv4DqAjt55EAl'
+const pid = 451
+
+export class svenkvint extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.svenkvint
+
+    async getNumber(country: string, num?: number): Promise<GetNumberResponse> {
+        const timestamp = Math.floor(Date.now() / 1000)
+        const data = `channel=${channel}country=${country}pid=${pid}t=${timestamp}${key}`
+        const sign = createHash('md5').update(data).digest('hex')
+
+        const formData = querystring.stringify({
+            channel,
+            pid,
+            country,
+            t: timestamp,
+            sign
+        })
+
+        const res = await axiosInstance.post('order', formData, {
+            headers: {
+                'Content-Type': 'application/x-www-form-urlencoded'
+            }
+        })
+
+        if (res.data.code !== 0) {
+            throw new InternalServerErrorException(res.data.msg)
+        }
+
+        return {
+            number: res.data.phone,
+            orderId: res.data.taskid,
+            operatorCode: '',
+            operatorName: '',
+            rawResponse: res.data
+        }
+    }
+
+    async releaseNumber(number: string) {}
+
+    async retriveMessage(orderId: string, num?: number): Promise<string> {
+        const timestamp = Math.floor(Date.now() / 1000)
+        console.log(timestamp)
+        const data = `channel=${channel}t=${timestamp}taskid=${orderId}${key}`
+        const sign = createHash('md5').update(data).digest('hex')
+
+        const formData = querystring.stringify({
+            channel,
+            taskid: orderId,
+            t: timestamp,
+            sign
+        })
+
+        const res = await axiosInstance.post('code', formData, {
+            headers: {
+                'Content-Type': 'application/x-www-form-urlencoded'
+            }
+        })
+
+        console.log(res.data)
+        if (res.data.code == 0){
+            return `Your Messenger verification code is G-${res.data.vcode}`
+        }
+    }
+
+    async blockNumber(number: string) {}
+
+    async cacheNumber(country: string, size: number) {
+        return null
+    }
+}

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

@@ -27,6 +27,7 @@ import { smspva } from './impl/smspva.service'
 import { sms7979 } from './impl/sms7979.service'
 import { sms4verify } from './impl/sms4verify.service'
 import { sms23256 } from './impl/sms23256.service'
+import { svenkvint } from './impl/svenkvint.service'
 
 @Module({
     imports: [
@@ -56,7 +57,8 @@ import { sms23256 } from './impl/sms23256.service'
         smspva,
         sms7979,
         sms4verify,
-        sms23256
+        sms23256,
+        svenkvint
     ],
     controllers: [RcsNumberController],
     exports: [RcsNumberService]

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

@@ -36,6 +36,7 @@ import { smspva } from './impl/smspva.service'
 import { sms7979 } from './impl/sms7979.service'
 import { sms4verify } from './impl/sms4verify.service'
 import { sms23256 } from './impl/sms23256.service'
+import { svenkvint } from './impl/svenkvint.service'
 
 @Injectable()
 export class RcsNumberService {
@@ -79,6 +80,7 @@ export class RcsNumberService {
         private dashboard: dashboard,
         private smspva: smspva,
         private sms23256: sms23256,
+        private svenkvint: svenkvint,
         private readonly redisService: RedisService
     ) {
         this.cloud033 = new cloud214('100033', '1e40ca9795b1fc038db76512175d59b5', RcsNumberSource.cloud033)
@@ -341,6 +343,8 @@ export class RcsNumberService {
                 return this.sms4verify02
             case RcsNumberSource.sms23256:
                 return this.sms23256
+            case RcsNumberSource.svenkvint:
+                return this.svenkvint
             default:
                 throw new ServiceUnavailableException('不支持的短信通道')
         }