feat: add Adsterra link conversion
This commit is contained in:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user