feat: add Adsterra link conversion
This commit is contained in:
@@ -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`:按登录用户查看独立的链接记录
|
||||
|
||||
|
||||
@@ -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: ''
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
@@ -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}`,
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|
||||
function renderChanges(changes) {
|
||||
const rows = changes.length ? changes : [{ key:'—', from:'原链接参数无需变化', to:'—' }];
|
||||
$('mappingTableBody').innerHTML = rows.map((change) => `<tr><td><code>${escapeHtml(change.key)}</code></td><td><span class="old-param">${escapeHtml(change.from || '(空值)')}</span></td><td>${change.to ? `<code>${escapeHtml(change.to)}</code>` : '<span class="empty-param">留空</span>'}</td></tr>`).join('');
|
||||
$('mappingTableBody').innerHTML = rows.map((change) => `<tr><td><code>${escapeHtml(change.key)}</code></td><td><span class="old-param">${escapeHtml(change.from || '(空值)')}</span></td><td>${change.removed ? '<span class="removed-param">移除参数</span>' : change.to ? `<code>${escapeHtml(change.to)}</code>` : '<span class="empty-param">留空</span>'}</td></tr>`).join('');
|
||||
}
|
||||
|
||||
function showEmpty() {
|
||||
|
||||
@@ -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}
|
||||
|
||||
+1
-1
@@ -48,7 +48,7 @@
|
||||
<div class="tool-icon" aria-hidden="true">⌁</div>
|
||||
<p class="tool-kicker">TRACKING BUILDER</p>
|
||||
<h2>自投链接转换器</h2>
|
||||
<p>粘贴原始 Click Link,自动将通用参数替换为 Mintegral、TaurusX、LoopMe、NewsBreak、Midas 等平台专属宏。</p>
|
||||
<p>粘贴原始 Click Link,自动将通用参数替换为 Mintegral、TaurusX、LoopMe、NewsBreak、Midas、Adsterra 等平台专属宏。</p>
|
||||
<ul><li>多平台 Click</li><li>业务参数原样保留</li><li>一键复制转换结果</li></ul>
|
||||
<span class="tool-cta">转换链接 <b>→</b></span>
|
||||
</a>
|
||||
|
||||
+8
-8
@@ -5,7 +5,7 @@
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="登录后将原始 Tracking Link 转换为目标平台宏">
|
||||
<title>自投链接转换器 · Traffic Intelligence</title>
|
||||
<link rel="stylesheet" href="assets/styles.css?v=platform5">
|
||||
<link rel="stylesheet" href="assets/styles.css?v=platform6">
|
||||
</head>
|
||||
<body>
|
||||
<header class="site-header inner-header">
|
||||
@@ -56,12 +56,12 @@
|
||||
|
||||
<div class="toast" id="toast" role="status"></div>
|
||||
<footer class="site-footer shell"><span>Traffic Intelligence Hub</span><span>© <b data-year></b> Media Operations</span></footer>
|
||||
<script src="assets/data/users.js?v=platform5"></script>
|
||||
<script src="assets/auth.js?v=platform5"></script>
|
||||
<script src="assets/data/link-templates.js?v=platform5"></script>
|
||||
<script src="assets/link-converter-core.js?v=platform5"></script>
|
||||
<script src="assets/link-history-store.js?v=platform5"></script>
|
||||
<script src="assets/common.js?v=platform5"></script>
|
||||
<script src="assets/link-generator.js?v=platform5"></script>
|
||||
<script src="assets/data/users.js?v=platform6"></script>
|
||||
<script src="assets/auth.js?v=platform6"></script>
|
||||
<script src="assets/data/link-templates.js?v=platform6"></script>
|
||||
<script src="assets/link-converter-core.js?v=platform6"></script>
|
||||
<script src="assets/link-history-store.js?v=platform6"></script>
|
||||
<script src="assets/common.js?v=platform6"></script>
|
||||
<script src="assets/link-generator.js?v=platform6"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user