Przeglądaj źródła

feat(rcs-number): 新增 usapanel 通道支持

wui 1 rok temu
rodzic
commit
cd7cb163b8

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

@@ -29,6 +29,7 @@ export enum RcsNumberSource {
     cowboy = 'cowboy',
     durainus = 'durainus',
     textverified = 'textverified',
+    usapanel = 'usapanel'
 }
 
 @Entity()

+ 68 - 0
src/rcs-number/impl/usapanel.service.ts

@@ -0,0 +1,68 @@
+import { GetNumberResponse, GetNumberService } from './get-number-service'
+import { RcsNumberSource } from '../entities/rcs-number.entity'
+import axios from 'axios'
+import { InternalServerErrorException } from '@nestjs/common'
+
+const API_KEY = 'wpJohESEZsjW1LtlyoGwZw53'
+
+const axiosInstance = axios.create({
+    baseURL: 'https://panel.hellomeetyou.com/api/'
+})
+
+export class usapanel extends GetNumberService {
+    source: RcsNumberSource = RcsNumberSource.usapanel
+
+    async getNumber(country: string, num?: number): Promise<GetNumberResponse> {
+        if (country.toUpperCase() !== 'US') {
+            throw new Error('Invalid country')
+        }
+        const res = await axiosInstance.post(
+            'line/changeService',
+            {
+                services: 'GOOGLE_MESSENGER',
+                zip: ''
+            },
+            {
+                headers: {
+                    'Content-Type': 'application/json',
+                    Accept: 'application/json',
+                    'X-API-Key': API_KEY
+                }
+            }
+        )
+
+        if (!res.data.phoneNumber) {
+            throw new InternalServerErrorException(res.data.error)
+        }
+
+        return {
+            number: res.data.phoneNumber.replace(/\D/g, ''),
+            orderId: res.data.phoneNumber,
+            operatorCode: '',
+            rawResponse: [res.data]
+        }
+    }
+
+    async releaseNumber(number: string) {}
+
+    async retriveMessage(orderId: string, num?: number): Promise<string> {
+        const { data } = await axiosInstance.get('line', {
+            headers: {
+                'Content-Type': 'application/json',
+                Accept: 'application/json',
+                'X-API-Key': API_KEY
+            }
+        })
+
+        const smsList: any[] = data.sms
+        if (smsList.length > 0) {
+            return smsList[0].text
+        }
+    }
+
+    async blockNumber(number: string) {}
+
+    async cacheNumber(country: string, size: number) {
+        return null
+    }
+}

+ 2 - 0
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 { usapanel } from './impl/usapanel.service'
 import { textverified } from './impl/textverified.service'
 
 @Module({
@@ -44,6 +45,7 @@ import { textverified } from './impl/textverified.service'
         hwyzm,
         cowboy,
         durainus,
+        usapanel,
         textverified
     ],
     controllers: [RcsNumberController],

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

@@ -31,6 +31,7 @@ import { RedisService } from '@liaoliaots/nestjs-redis'
 import Redis from 'ioredis'
 import { Channel } from '../channel/entities/channel.entities'
 import { durainus } from './impl/durainus.service'
+import { usapanel } from './impl/usapanel.service'
 
 @Injectable()
 export class RcsNumberService {
@@ -65,6 +66,7 @@ export class RcsNumberService {
         private hwyzm: hwyzm,
         private cowboy: cowboy,
         private durainus: durainus,
+        private usapanel: usapanel,
         private textverified: textverified,
         private readonly redisService: RedisService
     ) {
@@ -157,6 +159,15 @@ export class RcsNumberService {
 
         const channel = availableChannels[Math.floor(Math.random() * availableChannels.length)]
 
+        if (channel.source === RcsNumberSource.usapanel) {
+            const status = await this.redis.get('usapanel')
+            if (status) {
+                throw new ServiceUnavailableException('usapanel不可重复取码')
+            } else {
+                await this.redis.set('usapanel', '1')
+                await this.redis.expire('usapanel', 60 * 3)
+            }
+        }
         const numberService = this.getNumberService(channel.source)
         let res: GetNumberResponse
         try {
@@ -295,6 +306,8 @@ export class RcsNumberService {
                 return this.durainus
             case RcsNumberSource.textverified:
                 return this.textverified
+            case RcsNumberSource.usapanel:
+                return this.usapanel
             default:
                 throw new ServiceUnavailableException('不支持的短信通道')
         }
@@ -337,10 +350,14 @@ export class RcsNumberService {
                         } else if (number.orderId.slice(-4) === '0034') {
                             update.from = RcsNumberSource.cloud034
                         }
+                    } else if (number.from === RcsNumberSource.usacode) {
+                        await this.redis.del('usacode')
                     }
                     await this.rcsNumberRepository.update(number.id, update)
                 }
-            } catch (e) {}
+            } catch (e) {
+                console.log(e.message)
+            }
         })
     }
 

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

@@ -683,7 +683,8 @@ export class TaskService implements OnModuleInit {
             cloud041: 0,
             cloud050: 0,
             xyz: 0,
-            cowboy: 0
+            cowboy: 0,
+            usapanel: 0
         }
         const cloudInstance = axios.create({
             baseURL: 'http://52.77.17.214:9001/api/'
@@ -691,6 +692,9 @@ export class TaskService implements OnModuleInit {
         const xyzInstance = axios.create({
             baseURL: 'http://113.28.178.155:8003/api/'
         })
+        const panelInstance = axios.create({
+            baseURL: 'https://panel.hellomeetyou.com/api/'
+        })
         await Promise.all([
             (async () => {
                 try {
@@ -812,6 +816,20 @@ export class TaskService implements OnModuleInit {
                         res.cloud050 = cloud050Res.data.data.integral
                     }
                 } catch (e) {}
+            })(),
+            (async () => {
+                try {
+                    const panelRes = await panelInstance.get('account',{
+                        headers: {
+                            'Content-Type': 'application/json',
+                            Accept: 'application/json',
+                            'X-API-Key': 'wpJohESEZsjW1LtlyoGwZw53'
+                        }
+                    })
+                    if (panelRes.data){
+                        res.usapanel = panelRes.data.balance
+                    }
+                } catch (e) {}
             })()
         ])
         return res