diff --git a/packages/ui/certd-server/src/plugins/plugin-51dns/client.ts b/packages/ui/certd-server/src/plugins/plugin-51dns/client.ts index 4f094135..39cd86a5 100644 --- a/packages/ui/certd-server/src/plugins/plugin-51dns/client.ts +++ b/packages/ui/certd-server/src/plugins/plugin-51dns/client.ts @@ -1,5 +1,5 @@ -import { createAxiosService, HttpClient, ILogger } from "@certd/basic"; -import { Dns51Access } from "./access.js"; +import {createAxiosService, HttpClient, ILogger} from "@certd/basic"; +import {Dns51Access} from "./access.js"; export class Dns51Client { logger: ILogger; @@ -8,6 +8,7 @@ export class Dns51Client { cryptoJs: any; isLogined = false; _token = ""; + _cookie = ""; constructor(options: { logger: ILogger; @@ -56,17 +57,27 @@ export class Dns51Client { url: "https://www.51dns.com/login.html", method: "get", withCredentials: true, - logRes:false, - returnResponse:true + logRes: false, + returnResponse: true, + headers: { + // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36', + 'Origin': 'https://www.51dns.com', + 'Referer': 'https://www.51dns.com', + }, }); + let setCookie = res.headers['set-cookie'] + let cookie = setCookie.map((item: any) => { + return item.split(';')[0] + }).join(';') + //提取 var csrfToken = "ieOfM21eDd9nWJv3OZtMJF6ogDsnPKQHJ17dlMck"; const _token = res.data.match(/var csrfToken = "(.*?)"/)[1]; this.logger.info("_token:", _token); this._token = _token; var obj = { - "email_or_phone": this.aes("18603046467"), - "password": this.aes("JiDian1Zu"), + "email_or_phone": this.aes(this.access.username), + "password": this.aes(this.access.password), "type": this.aes("account"), "redirectTo": "https://www.51dns.com/domain", "_token": _token @@ -78,20 +89,50 @@ export class Dns51Client { ...obj }, withCredentials: true, + logRes: false, + returnResponse: true, headers: { - "Content-Type": "application/x-www-form-urlencoded" - }, - logRes:false, - returnResponse:true, + 'Origin': 'https://www.51dns.com', + 'Referer': 'https://www.51dns.com', + 'Content-Type': 'application/x-www-form-urlencoded', + 'Cookie': cookie, + 'X-Requested-With': 'XMLHttpRequest' + } }); + this.logger.info("return headers:", JSON.stringify(res2.headers)) + if (res2.data.code == 0) { + setCookie = res2.headers['set-cookie'] + this._cookie = setCookie.map((item: any) => { + return item.split(';')[0] + }).join(';') + this.logger.info("cookie:", this._cookie) + this.logger.info("登录成功") + } else { + throw new Error("登录失败:", res2.data) + } - // 提取 182****43522
- // console.log(res2.headers) - // console.log(res2.data) - const username = res2.data.match(/(.*?)<\/span>/)[1]; + const res3 = await this.http.request({ + url: 'https://www.51dns.com/domain', + method: 'get', + withCredentials: true, + logRes: false, + returnResponse: true, + headers: { + // 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.6261.95 Safari/537.36', + 'Origin': 'https://www.51dns.com', + 'Referer': 'https://www.51dns.com/login.html', + 'Cookie': this._cookie, + } + }) + + const success2 = res3.data.includes('DNS解析') + + if (!success2) { + throw new Error("检查登录失败") + } + this.logger.info("检查登录成功") - this.logger.info("登录成功:username:", username); this.isLogined = true; } @@ -102,63 +143,58 @@ export class Dns51Client { url: `https://www.51dns.com/domain?domain=${domain}&status=`, method: "get", withCredentials: true, - logRes:false, - returnResponse:true + logRes: false, + returnResponse: true, + headers: this.getRequestHeaders() }); // 提取 certd.top - const regex = new RegExp(``, "g"); - const matched = res.data.match(regex); - if (!matched || matched.length === 0) { + const regExp = new RegExp(`]*>${domain}<\\/a>`, "i"); + const matched = res.data.match(regExp); + if (!matched || matched.length < 1) { throw new Error(`域名${domain}不存在`); } - return matched[1]; - + const domainId = matched[1]; + this.logger.info(`域名${domain}的id为${domainId}`) + return parseInt(domainId); } - async createRecord(param: { domain: string, data: any; domainId: void; host: string; ttl: number; type: string }) { - const { domain, data, host, type } = param; + private getRequestHeaders() { + return { + 'Origin': 'https://www.51dns.com', + 'Referer': 'https://www.51dns.com', + 'Cookie': this._cookie + }; + } + + async createRecord(param: { domain: string, data: any; domainId: number; host: string; ttl: number; type: string }) { + const {domain, data, host, type} = param; const domainId = await this.getDomainId(domain); const url = "https://www.51dns.com/domain/storenNewRecord"; const req = { _token: this._token, - domain_id: parseInt(domainId), + domain_id: domainId, record: host, type: type, value: data, ttl: 300, + mx:"", view_id: 0 }; + this.logger.info("req:", JSON.stringify(req)) const res = await this.http.request({ url, method: "post", data: req, withCredentials: true, headers: { - "Content-Type": "application/x-www-form-urlencoded" + ...this.getRequestHeaders(), + 'Content-Type': 'application/x-www-form-urlencoded' } }); - /* - { - "status": 200, - "msg": "\u6b63\u786e", - "data": { - "record": "1111", - "type": "TXT", - "value": "2222", - "mx": "-", - "ttl": "300", - "view_id": "0", - "id": 601019779, - "domain_id": "193341603", - "trecord": "1111", - "view_name": "\u9ed8\u8ba4" - } -} - */ - if(res.status !== 200){ + if (res.status !== 200) { throw new Error(`创建域名解析失败:${res.msg}`); } const id = res.data.id; @@ -170,13 +206,13 @@ export class Dns51Client { } async deleteRecord(param: { domainId: number; id: number }) { - const url ="https://www.51dns.com/domain/operateRecord" - /* - type: delete + const url = "https://www.51dns.com/domain/operateRecord" + /* + type: delete ids[0]: 601019779 domain_id: 193341603 _token: ieOfM21eDd9nWJv3OZtMJF6ogDsnPKQHJ17dlMck - */ + */ const body = { type: "delete", ids: [param.id], @@ -189,10 +225,11 @@ _token: ieOfM21eDd9nWJv3OZtMJF6ogDsnPKQHJ17dlMck data: body, withCredentials: true, headers: { - "Content-Type": "application/x-www-form-urlencoded" + ...this.getRequestHeaders(), + 'Content-Type': 'application/x-www-form-urlencoded' } }); - if(res.status !== 200){ + if (res.status !== 200) { throw new Error(`删除域名解析失败:${res.msg}`); } diff --git a/packages/ui/certd-server/src/plugins/plugin-51dns/dns-provider.ts b/packages/ui/certd-server/src/plugins/plugin-51dns/dns-provider.ts index 033524fa..32d57231 100644 --- a/packages/ui/certd-server/src/plugins/plugin-51dns/dns-provider.ts +++ b/packages/ui/certd-server/src/plugins/plugin-51dns/dns-provider.ts @@ -6,7 +6,6 @@ import { Dns51Client } from "./client.js"; export type Dns51Record = { id: number; domainId: number, - client: Dns51Client, }; // 这里通过IsDnsProvider注册一个dnsProvider @@ -21,10 +20,16 @@ export type Dns51Record = { export class Dns51DnsProvider extends AbstractDnsProvider { // 通过Autowire传递context access!: Dns51Access; + + client!:Dns51Client; async onInstance() { //一些初始化的操作 // 也可以通过ctx成员变量传递context, 与Autowire效果一样 this.access = this.ctx.access as Dns51Access; + this.client = new Dns51Client({ + logger: this.logger, + access: this.access, + }); } /** @@ -41,15 +46,12 @@ export class Dns51DnsProvider extends AbstractDnsProvider { this.logger.info('添加域名解析:', fullRecord, value, type, domain); - const dns51Client = new Dns51Client({ - logger: this.logger, - access: this.access, - }); - const domainId = await dns51Client.getDomainId(domain); + + const domainId = await this.client.getDomainId(domain); this.logger.info('获取domainId成功:', domainId); - const res = await dns51Client.createRecord({ + const res = await this.client.createRecord({ domain: domain, domainId: domainId, type: 'TXT', @@ -60,7 +62,6 @@ export class Dns51DnsProvider extends AbstractDnsProvider { return { id: res.id, domainId: domainId, - client: dns51Client, }; } @@ -84,8 +85,8 @@ export class Dns51DnsProvider extends AbstractDnsProvider { * Authorization: Basic {token} * 请求参数 */ - const { client,id,domainId} = record - await client.deleteRecord({ + const {id,domainId} = record + await this.client.deleteRecord({ id, domainId })