From f486d3454dd936b6d1b9545710c9c990b5e30f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=BA=90?= Date: Tue, 20 Oct 2026 18:39:37 +0800 Subject: [PATCH] feat: add Adsterra link conversion --- README.md | 2 +- assets/data/link-templates.js | 41 +++++++++++++++++++++++++++++++++++ assets/link-converter-core.js | 9 ++++++-- assets/link-generator.js | 2 +- assets/styles.css | 2 ++ index.html | 2 +- link-generator.html | 16 +++++++------- 7 files changed, 61 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c7f45f2..0c6c47a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - `index.html`:工具入口 - `channel-recommendation.html`:包名、品类、国家 → 渠道优先级建议 -- `link-generator.html`:登录后粘贴原始 Click Link,并转换为 Mintegral、TaurusX、LoopMe、NewsBreak 或 Midas 平台宏 +- `link-generator.html`:登录后粘贴原始 Click Link,并转换为 Mintegral、TaurusX、LoopMe、NewsBreak、Midas 或 Adsterra 平台宏 - `login.html`:输入 Shareit ID,本机设置密码并扫码绑定 Google Authenticator - `link-history.html`:按登录用户查看独立的链接记录 diff --git a/assets/data/link-templates.js b/assets/data/link-templates.js index af8b4d9..4eed09c 100644 --- a/assets/data/link-templates.js +++ b/assets/data/link-templates.js @@ -263,5 +263,46 @@ window.LINK_TEMPLATES = [ } } } + }, + { + name: 'Adsterra', + platformCode: 'P_API_Adsterra', + status: 'Click 已确认', + sample: 'https://trident.bigpinggo.com/l/click?advid=30&campid=91513413&platform=P_API_Adsterra&pkg=org.melbet.client&clickid={click_id}&offer_name={offer_name}&creative_id={creative_id}&creative_name={creative_name}&affiliate_id={affiliate_id}&idfa={idfa}&gaid={gaid}&imei={imei}&android_id={android_id}&mac={mac}&oaid={oaid}&uagent={ua}&os_platform={os_platform}&os_version={os_version}&device_model={device_model}&ip={ip}&country_code={country_code}&ext={ext}&rta_token={rta_token}&san_campid=91513413&adset_id=-1&c_cto=0', + macros: [ + ['##SUB_ID_SHORT(action)##', 'Click ID'], + ['##PLACEMENT_ID##', 'Placement / affiliate ID'], + ['##BANNER_ID##', 'Creative ID'], + ['##USERAGENT##', 'User agent'], + ['##USER_OS##', 'Device operating system'], + ['##USER_OS_VER##', 'Operating system version'], + ['##REMOTE_IP##', 'IP address'], + ['##COUNTRY_CODE##', 'Country code'] + ], + links: { + click: { + removeParams: ['rta_token', 'san_campid', 'adset_id', 'c_cto'], + mappings: { + clickid: '##SUB_ID_SHORT(action)##', + offer_name: '', + creative_id: '', + creative_name: '', + affiliate_id: '##PLACEMENT_ID##', + idfa: '', + gaid: '', + imei: '', + android_id: '', + mac: '', + oaid: '', + uagent: '', + os_platform: '##USER_OS##', + os_version: '##USER_OS_VER##', + device_model: '', + ip: '##REMOTE_IP##', + country_code: 'PH', + ext: '' + } + } + } } ]; diff --git a/assets/link-converter-core.js b/assets/link-converter-core.js index ca0b587..a656c9c 100644 --- a/assets/link-converter-core.js +++ b/assets/link-converter-core.js @@ -29,6 +29,7 @@ const base = withoutHash.slice(0, queryIndex); const query = withoutHash.slice(queryIndex + 1); const replacements = { platform: template.platformCode, ...linkTemplate.mappings }; + const removedParams = new Set(linkTemplate.removeParams || []); const changes = []; let parameterCount = 0; @@ -39,12 +40,16 @@ const rawKey = equalIndex >= 0 ? segment.slice(0, equalIndex) : segment; const rawValue = equalIndex >= 0 ? segment.slice(equalIndex + 1) : ''; const key = decodeKey(rawKey); + if (removedParams.has(key)) { + changes.push({ key, from:rawValue, to:'', removed:true }); + return null; + } if (!Object.prototype.hasOwnProperty.call(replacements, key)) return segment; const replacement = String(replacements[key] ?? ''); - if (rawValue !== replacement) changes.push({ key, from: rawValue, to: replacement }); + if (rawValue !== replacement) changes.push({ key, from: rawValue, to: replacement, removed:false }); return `${rawKey}=${replacement}`; - }); + }).filter((segment) => segment !== null); return { url: `${base}?${convertedSegments.join('&')}${hash}`, diff --git a/assets/link-generator.js b/assets/link-generator.js index dbef5fa..965e617 100644 --- a/assets/link-generator.js +++ b/assets/link-generator.js @@ -57,7 +57,7 @@ function renderChanges(changes) { const rows = changes.length ? changes : [{ key:'—', from:'原链接参数无需变化', to:'—' }]; - $('mappingTableBody').innerHTML = rows.map((change) => `${escapeHtml(change.key)}${escapeHtml(change.from || '(空值)')}${change.to ? `${escapeHtml(change.to)}` : '留空'}`).join(''); + $('mappingTableBody').innerHTML = rows.map((change) => `${escapeHtml(change.key)}${escapeHtml(change.from || '(空值)')}${change.removed ? '移除参数' : change.to ? `${escapeHtml(change.to)}` : '留空'}`).join(''); } function showEmpty() { diff --git a/assets/styles.css b/assets/styles.css index 72ac4d3..004c1e0 100644 --- a/assets/styles.css +++ b/assets/styles.css @@ -20,3 +20,5 @@ /* Shareit ID entry and local QR enrollment */ .account-form{margin-top:20px}.confirmed-account{display:flex;align-items:center;gap:10px;margin-top:18px;padding:11px 13px;border:1px solid var(--line);border-radius:10px;background:#f6f6f2}.confirmed-account>span{font:8px var(--mono);color:var(--muted)}.confirmed-account>strong{font:12px var(--mono)}.confirmed-account>button{margin-left:auto;border:0;background:transparent;color:var(--blue-dark);font-size:9px}.qr-setup{display:grid;grid-template-columns:190px 1fr;gap:18px;align-items:center;margin:18px 0 22px;padding:17px;border:1px solid var(--line);border-radius:13px;background:#fafaf7}.qr-code{width:190px;min-height:190px;display:grid;place-items:center;background:#fff;border:1px solid #e8eae6;border-radius:10px;overflow:hidden}.qr-code svg{display:block;width:180px;height:180px}.qr-code>span{padding:15px;text-align:center;font-size:9px;color:var(--muted)}.qr-code .qr-error{color:#b74b39}.qr-instructions>b{display:inline-block;border-radius:99px;background:#e5eaff;color:#2d47b3;padding:4px 8px;font-size:8px}.qr-instructions ol{margin:13px 0 0;padding-left:20px}.qr-instructions li{margin:8px 0;font-size:10px;color:#58635f}.header-user>span{font:10px var(--mono);color:var(--ink)} @media(max-width:620px){.qr-setup{grid-template-columns:1fr}.qr-code{margin:auto}.confirmed-account{flex-wrap:wrap}} + +.removed-param{font-size:8px;color:#a13f33;background:#ffe5e0;border-radius:4px;padding:2px 5px} diff --git a/index.html b/index.html index 9825db1..c845323 100644 --- a/index.html +++ b/index.html @@ -48,7 +48,7 @@

TRACKING BUILDER

自投链接转换器

-

粘贴原始 Click Link,自动将通用参数替换为 Mintegral、TaurusX、LoopMe、NewsBreak、Midas 等平台专属宏。

+

粘贴原始 Click Link,自动将通用参数替换为 Mintegral、TaurusX、LoopMe、NewsBreak、Midas、Adsterra 等平台专属宏。

转换链接 → diff --git a/link-generator.html b/link-generator.html index 73076b6..b5f9c90 100644 --- a/link-generator.html +++ b/link-generator.html @@ -5,7 +5,7 @@ 自投链接转换器 · Traffic Intelligence - +