|
|
@@ -1,276 +1,56 @@
|
|
|
-import axios, { AxiosError } from 'axios'
|
|
|
-import { GetNumberService } from './get-number-service'
|
|
|
-import { RcsNumber, RcsNumberSource, RcsNumberStatus } from '../entities/rcs-number.entity'
|
|
|
-import { HttpException, InternalServerErrorException, Logger, OnModuleInit, forwardRef } from '@nestjs/common'
|
|
|
-import { InjectRepository } from '@nestjs/typeorm'
|
|
|
-import { In, MoreThan, Not, Repository } from 'typeorm'
|
|
|
-import { Cron } from '@nestjs/schedule'
|
|
|
-import { Task } from '../../task/entities/task.entity'
|
|
|
-import { Channel } from '../../channel/entities/channel.entities'
|
|
|
-import { el } from 'date-fns/locale'
|
|
|
-import { addMinutes } from 'date-fns'
|
|
|
-import { channel } from 'diagnostics_channel'
|
|
|
-import { checkAndFormatNumber } from '../helpers'
|
|
|
-import * as util from 'node:util'
|
|
|
+import axios from 'axios'
|
|
|
+import { GetNumberService, GetNumberResponse } from './get-number-service'
|
|
|
+import { RcsNumberSource } from '../entities/rcs-number.entity'
|
|
|
+import { Logger } from '@nestjs/common'
|
|
|
|
|
|
const uid = '1715242407'
|
|
|
const sign = 'da1a847ef8f0df331884ce45d97e7e42'
|
|
|
const pid = '133'
|
|
|
|
|
|
-const name = 'unsnap3094'
|
|
|
-const ApiKey = 'U3Jma1hkbUxXblEyL0ZYai9WWFVvdz09'
|
|
|
-const dPid = '1580'
|
|
|
-
|
|
|
const axiosInstance = axios.create({
|
|
|
baseURL: 'http://api.mwze167.com/registerApi/'
|
|
|
})
|
|
|
-const durianInstance = axios.create({
|
|
|
- baseURL: 'http://104.194.87.44:1080/out/ext_api/'
|
|
|
-})
|
|
|
|
|
|
export class mwze167 extends GetNumberService {
|
|
|
- constructor(
|
|
|
- @InjectRepository(RcsNumber)
|
|
|
- private rcsNumberRepository: Repository<RcsNumber>,
|
|
|
- @InjectRepository(Task)
|
|
|
- private taskRepository: Repository<Task>,
|
|
|
- @InjectRepository(Channel)
|
|
|
- private channelRepository: Repository<Channel>
|
|
|
- ) {
|
|
|
- super()
|
|
|
- }
|
|
|
-
|
|
|
- async getNumber(deviceId?: string, taskId?: string, channelId?: string): Promise<RcsNumber> {
|
|
|
- let channel: Channel = null
|
|
|
- let number: string = null
|
|
|
- let fullNumber: string = null
|
|
|
- let orderId: string = null
|
|
|
- let operatorName: string = null
|
|
|
- let carrierName: string = null
|
|
|
- let imsi: string = null
|
|
|
- let mcc: string = null
|
|
|
- let mnc: string = null
|
|
|
- let platform: string = null
|
|
|
- let result: string = null
|
|
|
- try {
|
|
|
- if (channelId) {
|
|
|
- channel = await this.channelRepository.findOneBy({ id: parseInt(channelId) })
|
|
|
- } else if (taskId) {
|
|
|
- const task: Task = await this.taskRepository.findOneBy({ id: parseInt(taskId) })
|
|
|
- if (task.channels?.length > 0) {
|
|
|
- const randomIndex = Math.floor(Math.random() * task.channels.length)
|
|
|
- channel = await this.channelRepository.findOneBy({ id: task.channels[randomIndex] })
|
|
|
- }
|
|
|
- }
|
|
|
- if (!channel) {
|
|
|
- // 从数据库中获取随机的channel
|
|
|
- channel = await this.channelRepository.createQueryBuilder('channel').where('channel.switch = 1').orderBy('RAND()').limit(1).getOne()
|
|
|
- }
|
|
|
- Logger.log(
|
|
|
- `channelId=${channel.id}, country=${channel.country}, mcc=${channel.mcc}, mnc=${channel.mnc},platform=${channel.platform}`,
|
|
|
- `mwze167.service`
|
|
|
- )
|
|
|
-
|
|
|
- // 判断平台
|
|
|
- platform = channel.platform
|
|
|
- if (platform === 'durian') {
|
|
|
- const res = await durianInstance.get('getMobile', {
|
|
|
- params: {
|
|
|
- name,
|
|
|
- ApiKey,
|
|
|
- cuy: channel.country,
|
|
|
- pid: dPid,
|
|
|
- num: 1,
|
|
|
- noblack: 0,
|
|
|
- serial: 2,
|
|
|
- secret_key: null,
|
|
|
- vip: null
|
|
|
- }
|
|
|
- })
|
|
|
- const resultData = res.data
|
|
|
- Logger.log(resultData, 'durian')
|
|
|
- if (resultData.code !== 200) {
|
|
|
- throw new Error(resultData.msg)
|
|
|
- }
|
|
|
- fullNumber = resultData.data
|
|
|
- number = resultData.data.slice(3)
|
|
|
-
|
|
|
- // imsi
|
|
|
- const codeRes = await durianInstance.get('getMobileUserCode', {
|
|
|
- params: {
|
|
|
- name,
|
|
|
- ApiKey,
|
|
|
- pn: fullNumber
|
|
|
- }
|
|
|
- })
|
|
|
- const codeData = codeRes.data
|
|
|
- result = JSON.stringify(codeData)
|
|
|
- Logger.log(codeData, 'durian')
|
|
|
- if (codeData.code !== 200) {
|
|
|
- throw new Error(codeData.msg)
|
|
|
- }
|
|
|
- mcc = codeData.data.slice(0, 3)
|
|
|
- if (channel.mnc.length > 2) {
|
|
|
- imsi = codeData.data.slice(0, 6)
|
|
|
- mnc = codeData.data.slice(3, 6)
|
|
|
- } else {
|
|
|
- imsi = codeData.data.slice(0, 5)
|
|
|
- mnc = codeData.data.slice(3, 5)
|
|
|
- }
|
|
|
-
|
|
|
- } else if (platform === 'mwze167') {
|
|
|
- const res = await axiosInstance.get('getMobile', {
|
|
|
- params: {
|
|
|
- uid,
|
|
|
- sign,
|
|
|
- pid,
|
|
|
- cuy: channel.country.toUpperCase(),
|
|
|
- size: 1,
|
|
|
- ctype: 3
|
|
|
- }
|
|
|
- })
|
|
|
- const data = res.data
|
|
|
- result = JSON.stringify(data)
|
|
|
- Logger.log(data, 'mwze167')
|
|
|
- if (data.code !== 0) {
|
|
|
- throw new Error(data.msg)
|
|
|
- }
|
|
|
- number = data.data[0]?.number
|
|
|
- orderId = data.orderId
|
|
|
-
|
|
|
- const jsonString: string = data.data[0]?.mcc
|
|
|
- const parsedObject = JSON.parse(jsonString)
|
|
|
-
|
|
|
- operatorName = parsedObject?.operatorName
|
|
|
- carrierName = parsedObject?.carrierName
|
|
|
-
|
|
|
- mcc = parsedObject?.mcc
|
|
|
- mnc = parsedObject?.mnc
|
|
|
- if (mnc.length === 1) {
|
|
|
- mnc = '0' + mnc
|
|
|
- }
|
|
|
- imsi = mcc + mnc
|
|
|
- }
|
|
|
- } catch (e: any) {
|
|
|
- if (e.response) {
|
|
|
- Logger.error(e.response.data, 'mwze167.service')
|
|
|
- throw new InternalServerErrorException(e.response.data.message)
|
|
|
- } else {
|
|
|
- throw new InternalServerErrorException(e.message)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!number) {
|
|
|
- throw new InternalServerErrorException('No number available')
|
|
|
- }
|
|
|
- // 比较operatorName,如果为空判断imsi
|
|
|
- if (channel.operator !== null && platform === 'mwze167') {
|
|
|
- if (operatorName !== channel.operator) {
|
|
|
- throw new InternalServerErrorException('Operator name not matches.')
|
|
|
- }
|
|
|
- } else {
|
|
|
- if (channel.scope && channel.scope.length > 0) {
|
|
|
- // 判断是否在区间中
|
|
|
- const scope = channel.scope
|
|
|
- if (!scope.includes(Number(imsi))) {
|
|
|
- throw new InternalServerErrorException('IMSI not matches.')
|
|
|
- }
|
|
|
- } else if (mcc !== channel.mcc || mnc !== channel.mnc) {
|
|
|
- // 直接比较
|
|
|
- throw new InternalServerErrorException('MCC or MNC not matches.')
|
|
|
+ source: RcsNumberSource = RcsNumberSource.mwze167
|
|
|
+ async getNumber(country: string): Promise<GetNumberResponse> {
|
|
|
+ const res = await axiosInstance.get('getMobile', {
|
|
|
+ params: {
|
|
|
+ uid,
|
|
|
+ sign,
|
|
|
+ pid,
|
|
|
+ cuy: country.toUpperCase(),
|
|
|
+ size: 1,
|
|
|
+ ctype: 3
|
|
|
}
|
|
|
+ })
|
|
|
+ let data = res.data
|
|
|
+ if (data.code !== 0 || !(data.data && data.data.length)) {
|
|
|
+ throw new Error(data.msg)
|
|
|
}
|
|
|
-
|
|
|
- number = checkAndFormatNumber(channel.country, number, carrierName)
|
|
|
- const rcsNumber = new RcsNumber()
|
|
|
- rcsNumber.mcc = channel.mcc
|
|
|
- rcsNumber.mnc = channel.mnc
|
|
|
- rcsNumber.country = channel.country
|
|
|
- rcsNumber.number = number
|
|
|
- if (channel.platform === 'mwze167') {
|
|
|
- rcsNumber.extra = { orderId }
|
|
|
- rcsNumber.from = RcsNumberSource.mwze167
|
|
|
- } else if (channel.platform === 'durian') {
|
|
|
- rcsNumber.extra = { fullNumber }
|
|
|
- rcsNumber.from = RcsNumberSource.durian
|
|
|
+ Logger.log(data, 'mwze167')
|
|
|
+ const orderId = data.orderId
|
|
|
+ const operatorInfo = JSON.parse(data.data[0].mcc)
|
|
|
+ const operatorCode = operatorInfo.operator
|
|
|
+ const carrierName = operatorInfo.carrierName
|
|
|
+ const number = data.data[0].number
|
|
|
+
|
|
|
+ return {
|
|
|
+ orderId,
|
|
|
+ number,
|
|
|
+ operatorCode,
|
|
|
+ operatorName: carrierName,
|
|
|
+ rawResponse: data
|
|
|
}
|
|
|
- rcsNumber.expiryTime = new Date(Date.now() + 5 * 60 * 1000)
|
|
|
- rcsNumber.status = RcsNumberStatus.PENDING
|
|
|
- rcsNumber.deviceId = deviceId
|
|
|
- rcsNumber.taskId = taskId
|
|
|
- rcsNumber.result = result
|
|
|
- return await this.rcsNumberRepository.save(rcsNumber)
|
|
|
}
|
|
|
|
|
|
- @Cron('0/5 * * * * *')
|
|
|
- async getMessage() {
|
|
|
- const numbers = await this.rcsNumberRepository.findBy({
|
|
|
- expiryTime: MoreThan(addMinutes(new Date(), -1)),
|
|
|
- status: Not(RcsNumberStatus.EXPIRED)
|
|
|
- })
|
|
|
- numbers.forEach(async (number) => {
|
|
|
- if (number.expiryTime < new Date()) {
|
|
|
- if (number.status === RcsNumberStatus.PENDING) {
|
|
|
- number.status = RcsNumberStatus.EXPIRED
|
|
|
- await this.rcsNumberRepository.save(number)
|
|
|
- }
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- if (number.from === RcsNumberSource.mwze167) {
|
|
|
- const { data } = await axiosInstance.get('getMsg', {
|
|
|
- params: {
|
|
|
- uid,
|
|
|
- sign,
|
|
|
- orderId: number.extra.orderId
|
|
|
- }
|
|
|
- })
|
|
|
- if (data.data) {
|
|
|
- const msg = data.data.map((i) => i.txt).join('\n')
|
|
|
- number.status = RcsNumberStatus.SUCCESS
|
|
|
- number.message = msg
|
|
|
- await this.rcsNumberRepository.save(number)
|
|
|
- }
|
|
|
- } else if (number.from === RcsNumberSource.durian) {
|
|
|
- const { data } = await durianInstance.get('getMsg', {
|
|
|
- params: {
|
|
|
- name,
|
|
|
- ApiKey,
|
|
|
- pn: number.extra.fullNumber,
|
|
|
- pid: dPid,
|
|
|
- serial: 2
|
|
|
- }
|
|
|
- })
|
|
|
- if (data.code === 200) {
|
|
|
- number.status = RcsNumberStatus.SUCCESS
|
|
|
- number.message = `Your Messenger verification code is G-${data.data}`
|
|
|
- await this.rcsNumberRepository.save(number)
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- }
|
|
|
+ async reetriveMessage(orderId: string): Promise<string> {
|
|
|
+ const { data } = await axiosInstance.get('getMsg', {
|
|
|
+ params: { uid, sign, orderId }
|
|
|
})
|
|
|
+ if (data.data) {
|
|
|
+ const msg = data.data.map((i) => i.txt).join('\n')
|
|
|
+ return msg
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
- async getNumberOld(deviceId?: string): Promise<RcsNumber> {
|
|
|
- const rcsNumber = new RcsNumber()
|
|
|
- rcsNumber.mcc = '722'
|
|
|
- rcsNumber.mnc = '299'
|
|
|
- rcsNumber.country = 'ar'
|
|
|
- rcsNumber.number = '92612446939'
|
|
|
- let orderId = 'orderId": "1259926842729435136'
|
|
|
- rcsNumber.extra = { orderId }
|
|
|
- rcsNumber.expiryTime = new Date(Date.now() + 5 * 60 * 1000)
|
|
|
- rcsNumber.from = RcsNumberSource.mwze167
|
|
|
- rcsNumber.status = RcsNumberStatus.PENDING
|
|
|
- rcsNumber.deviceId = deviceId
|
|
|
- return await this.rcsNumberRepository.save(rcsNumber)
|
|
|
- }
|
|
|
-
|
|
|
- async sleep(ms: number): Promise<void> {
|
|
|
- return new Promise(resolve => setTimeout(resolve, ms))
|
|
|
- }
|
|
|
-
|
|
|
}
|