diff --git a/README.md b/README.md
index 3ccd153..cb6fd83 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
- `index.html`:工具入口
- `channel-recommendation.html`:包名、品类、国家 → 渠道优先级建议
-- `link-generator.html`:自投平台 Click / Impression 链接生成
+- `link-generator.html`:粘贴原始 Mintegral Click Link 并转换为已确认的平台宏
## 可维护数据
diff --git a/assets/data/link-templates.js b/assets/data/link-templates.js
index c9ce885..f0142d8 100644
--- a/assets/data/link-templates.js
+++ b/assets/data/link-templates.js
@@ -1,57 +1,85 @@
window.LINK_TEMPLATES = [
{
- name:'Mintegral', platformCode:'M_API_Self_Mintegral', status:'已配置',
- macros:[['{click_id}','媒体点击 ID'],['{offer_name}','Offer 名称'],['{ad_id}','素材 ID'],['{ad_name}','素材名称'],['{affiliate_id}','子渠道 ID'],['{idfa}','iOS 广告标识'],['{gaid}','Google 广告标识'],['{device_os}','设备系统'],['{country_code}','ISO 国家码'],['{ip}','设备 IP'],['{ua}','User Agent']],
- links:{
- click:{endpoint:'https://trident.bigpinggo.com/click', mappings:{clickid:'{click_id}',offer_name:'{offer_name}',creative_id:'{ad_id}',creative_name:'{ad_name}',affiliate_id:'{affiliate_id}',idfa:'{idfa}',gaid:'{gaid}',uagent:'{ua}',os_platform:'{device_os}',os_version:'{os_version}',device_model:'{device_model}',ip:'{ip}',country_code:'{country_code}',ext:'{uuid}',rta_token:'{rta_token}'}},
- imp:{endpoint:'https://typhoon.bigpinggo.com/imp', mappings:{clickid:'{impression_id}',offer_name:'{offer_name}',creative_id:'{ad_id}',creative_name:'{ad_name}',affiliate_id:'{affiliate_id}',idfa:'{idfa}',gaid:'{gaid}',uagent:'{ua}',os_platform:'{device_os}',device_model:'{device_model}',ip:'{ip}',country_code:'{country_code}',ext:'{uuid}'}}
+ name: 'Mintegral',
+ platformCode: 'M_API_Self_Mintegral',
+ status: 'Click 已确认',
+ macros: [
+ ['{ad_id}', 'Creative ID'],
+ ['{ad_name}', 'Creative name'],
+ ['{ad_type}', 'Ad type'],
+ ['{adv_campaign_id}', 'Campaign unique number ID'],
+ ['{adv_offer_id}', 'Offer unique number ID'],
+ ['{affiliate_id}', 'Sub channel ID on MTG platform'],
+ ['{amazon_id}', 'Amazon device ID'],
+ ['{android_id_md5_low}', 'Android ID MD5 lowercase'],
+ ['{android_id_md5}', 'Android ID MD5 (32-bit lowercase)'],
+ ['{android_id}', 'Android ID for attribution'],
+ ['{billing_type}', 'Billing type'],
+ ['{click_id}', 'Click ID defined by MTG'],
+ ['{cn_event_callback}', 'CN-region event callback URL'],
+ ['{cn_install_callback}', 'CN-region install callback URL'],
+ ['{country_code}', 'ISO 3166-1 alpha-2 country code'],
+ ['{creative_group}', 'Creative group'],
+ ['{creative_id}', 'Creative ID'],
+ ['{creative_name}', 'Creative name'],
+ ['{ctgv_usd}', 'Target goal value USD'],
+ ['{currency}', 'Currency type'],
+ ['{device_brand}', 'Device brand'],
+ ['{device_id}', 'IDFA for iOS or GAID for Android'],
+ ['{device_model}', 'Device model'],
+ ['{device_os}', 'Device OS: iOS or Android'],
+ ['{encode}', 'AppsFlyer encryption parameter'],
+ ['{event_callback}', 'Event callback URL'],
+ ['{event_callback_url}', 'Event callback URL for web'],
+ ['{gaid_md5}', 'GAID MD5 (32-bit lowercase)'],
+ ['{gaid}', 'Google advertising ID'],
+ ['{idfa_md5}', 'IDFA MD5 (32-bit lowercase)'],
+ ['{idfa}', 'iOS identifier for advertising'],
+ ['{idfv}', 'IDFV'],
+ ['{imei_md5}', 'IMEI MD5 (32-bit lowercase)'],
+ ['{imei}', 'IMEI for Android attribution'],
+ ['{impression_id}', 'Impression ID defined by MTG'],
+ ['{install_callback}', 'Install callback URL'],
+ ['{install_callback_url}', 'Install callback URL for web'],
+ ['{ip}', 'IP address for fingerprint attribution'],
+ ['{mac_md5}', 'MAC MD5 (32-bit lowercase)'],
+ ['{mac}', 'Media access control address'],
+ ['{microtime}', 'Microtime'],
+ ['{oaid_md5}', 'OAID MD5'],
+ ['{oaid}', 'OAID'],
+ ['{offer_name}', 'Offer name'],
+ ['{os_platform}', 'OS platform'],
+ ['{os_version}', 'OS version'],
+ ['{package_name}', 'Package name'],
+ ['{price}', 'Price'],
+ ['{timestamp}', 'Timestamp'],
+ ['{ua}', 'User agent'],
+ ['{uuid}', 'Promotion ID defined by MTG']
+ ],
+ links: {
+ click: {
+ mappings: {
+ clickid: '{click_id}',
+ offer_name: '{offer_name}',
+ creative_id: '{ad_id}',
+ creative_name: '{ad_name}',
+ affiliate_id: '{affiliate_id}',
+ idfa: '{idfa}',
+ gaid: '{gaid}',
+ imei: '{imei}',
+ android_id: '{android_id}',
+ mac: '{mac}',
+ oaid: '{oaid}',
+ uagent: '{ua}',
+ os_platform: '{device_os}',
+ os_version: '{os_version}',
+ device_model: '{device_model}',
+ ip: '{ip}',
+ country_code: '{country_code}',
+ ext: '{uuid}',
+ rta_token: '{rta_token}'
+ }
+ }
}
- },
- {
- name:'Bigo', platformCode:'M_API_Self_Bigo', status:'已配置',
- macros:[['__SID__','广告请求 / 点击 ID'],['__APPID__','推广 App ID'],['__CAMPAIGN_ID__','广告系列 ID'],['__CAMPAIGN_NAME__','广告系列名称'],['__AD_ID__','广告 ID'],['__AD_NAME__','广告名称'],['__IDFA__','iOS 广告标识'],['__GAID__','Google 广告标识'],['__IP__','设备 IP'],['__OS__','操作系统'],['__PUBLISHER_ID__','子渠道 ID']],
- links:{
- click:{endpoint:'https://trident.bigpinggo.com/click', mappings:{clickid:'__SID__',offer_name:'__CAMPAIGN_NAME__',creative_id:'__AD_ID__',creative_name:'__AD_NAME__',affiliate_id:'__PUBLISHER_ID__',idfa:'__IDFA__',gaid:'__GAID__',os_platform:'__OS__',device_model:'__DEVICE_MODEL__',ip:'__IP__',country_code:'',ext:'__AD_EXT__',rta_token:'{rta_token}'}},
- imp:{endpoint:'https://typhoon.bigpinggo.com/imp', mappings:{clickid:'imp__SID__',offer_name:'__CAMPAIGN_NAME__',creative_id:'__AD_ID__',creative_name:'__AD_NAME__',affiliate_id:'__PUBLISHER_ID__',idfa:'__IDFA__',gaid:'__GAID__',os_platform:'__OS__',device_model:'__DEVICE_MODEL__',ip:'__IP__',country_code:'',ext:'__AD_EXT__'}}
- }
- },
- {
- name:'Kwai', platformCode:'M_API_Self_Kwai_NB', status:'已配置',
- macros:[['__CALLBACK__','Click ID'],['__GAID1__','Google 广告标识'],['__IDFA__','iOS 广告标识'],['__IP__','设备 IP'],['__UA__','设备 User Agent'],['__CMPNID__','广告计划 ID'],['__ADSETID__','广告组 ID'],['__ADID__','广告 ID']],
- links:{
- click:{endpoint:'https://trident.bigpinggo.com/click', mappings:{clickid:'__CALLBACK__',offer_name:'__CMPNID__',creative_id:'__ADSETID__',creative_name:'__ADID__',affiliate_id:'__ADSETID__',idfa:'__IDFA__',gaid:'__GAID1__',uagent:'__UA__',ip:'__IP__',country_code:'',ext:'',rta_token:'{rta_token}'}},
- imp:{endpoint:'https://typhoon.bigpinggo.com/imp', mappings:{clickid:'__CALLBACK__',offer_name:'__CMPNID__',creative_id:'__ADSETID__',creative_name:'__ADID__',affiliate_id:'__CMPNID__',idfa:'__IDFA__',gaid:'__GAID1__',uagent:'__UA__',ip:'__IP__',country_code:'',ext:''}}
- }
- },
- {
- name:'MediaGO', platformCode:'M_API_Self_Mediago', status:'已配置',
- macros:[['{TRACKING_ID}','完整用户旅程 Tracking ID'],['{CLICK_ID}','点击 ID'],['{ADVERTISING_ID}','通用广告标识'],['{ANDROID_ID}','Android 设备 ID'],['{AD_SET_ID}','广告组 / Affiliate ID']],
- links:{
- click:{endpoint:'https://trident.bigpinggo.com/click', mappings:{clickid:'{TRACKING_ID}',offer_name:'',creative_id:'',creative_name:'{AD_SET_ID}',affiliate_id:'{AD_SET_ID}',idfa:'',gaid:'{ADVERTISING_ID}',android_id:'{ANDROID_ID}',country_code:'',ext:'',rta_token:''}},
- imp:{endpoint:'https://typhoon.bigpinggo.com/imp', mappings:{clickid:'{TRACKING_ID}',affiliate_id:'{AD_SET_ID}',gaid:'{ADVERTISING_ID}',android_id:'{ANDROID_ID}',country_code:'',ext:''}}
- }
- },
- {
- name:'NewsBreak', platformCode:'A_API_SPDragon', status:'待业务复核',
- macros:[['__CALLBACK_PARAM__','平台唯一回调参数'],['__CAMPAIGN_ID__','Campaign ID'],['__CAMPAIGN_NAME__','Campaign 名称'],['__FLIGHT_ID__','Ad Set ID'],['__FLIGHT_NAME__','Ad Set 名称'],['__CREATIVE_ID__','Creative ID'],['__CREATIVE_NAME__','Creative 名称'],['__ADID__','GAID'],['__IDFA__','IDFA'],['__OS__','操作系统']],
- links:{
- click:{endpoint:'https://trident.bigpinggo.com/l/click', mappings:{clickid:'__CALLBACK_PARAM__',offer_name:'__CAMPAIGN_NAME__',creative_id:'__CREATIVE_ID__',creative_name:'__CREATIVE_NAME__',affiliate_id:'__FLIGHT_ID_____FLIGHT_NAME__',idfa:'__IDFA__',gaid:'__ADID__',os_platform:'__OS__',country_code:'',ext:'',rta_token:'{rta_token}'}},
- imp:{endpoint:'https://typhoon.bigpinggo.com/imp', mappings:{clickid:'__CALLBACK_PARAM__',offer_name:'__CAMPAIGN_NAME__',creative_id:'__CREATIVE_ID__',creative_name:'__CREATIVE_NAME__',affiliate_id:'__FLIGHT_ID_____FLIGHT_NAME__',idfa:'__IDFA__',gaid:'__ADID__',os_platform:'__OS__',country_code:'',ext:''}}
- }
- },
- {
- name:'Adsterra', platformCode:'P_API_Adsterra', status:'已配置',
- macros:[['##SUB_ID_SHORT(action)##','Click ID'],['##PLACEMENT_ID##','广告位 / Affiliate ID'],['##BANNER_ID##','素材 ID'],['##USERAGENT##','User Agent'],['##USER_OS##','设备系统'],['##USER_OS_VER##','系统版本'],['##REMOTE_IP##','设备 IP'],['##COUNTRY_CODE##','国家码']],
- links:{click:{endpoint:'https://trident.bigpinggo.com/l/click', mappings:{clickid:'##SUB_ID_SHORT(action)##',offer_name:'',creative_id:'##BANNER_ID##',creative_name:'',affiliate_id:'##PLACEMENT_ID##',uagent:'##USERAGENT##',os_platform:'##USER_OS##',os_version:'##USER_OS_VER##',ip:'##REMOTE_IP##',country_code:'##COUNTRY_CODE##',ext:''}}}
- },
- {
- name:'SmartyAds', platformCode:'M_API_Self_Smartyads', status:'已配置',
- macros:[['[CLICK_ID]','Click ID'],['[TIMESTAMP]','UNIX 时间戳'],['[CAMPAIGN_ID]','Campaign ID'],['[CREATIVE_ID]','素材 ID'],['[CREATIVE_NAME]','素材名称'],['[APP_BUNDLE]','媒体 App Bundle'],['[IFA]','设备广告标识'],['[USER_AGENT]','User Agent'],['[OS]','操作系统'],['[IP]','设备 IP'],['[COUNTRY]','国家码']],
- links:{click:{endpoint:'https://trident.bigpinggo.com/l/click', mappings:{clickid:'[CLICK_ID]_[TIMESTAMP]',offer_name:'[CAMPAIGN_ID]',creative_id:'[CREATIVE_ID]',creative_name:'[CREATIVE_NAME]',affiliate_id:'[APP_BUNDLE]',gaid:'[IFA]',uagent:'[USER_AGENT]',os_platform:'[OS]',os_version:'[OSV]',device_model:'[DEVICE_MAKE]',ip:'[IP]',country_code:'[COUNTRY]',ext:'[CLICK_ID]',rta_token:''}}}
- },
- {
- name:'Traffic Star', platformCode:'A_API_SPDragon', status:'待业务复核',
- macros:[['{click_id}','S2S Click ID'],['{campaign_id}','Campaign ID'],['{creative_id}','素材 ID'],['{site_id}','站点 ID'],['{os}','操作系统'],['{device_type_id}','设备类型 ID'],['{ip}','设备 IP'],['{geo}','两位国家码'],['{format}','素材格式']],
- links:{click:{endpoint:'https://trident.bigpinggo.com/l/click', mappings:{clickid:'{click_id}',offer_name:'{campaign_id}',creative_id:'{creative_id}',creative_name:'{format}',affiliate_id:'{site_id}',os_platform:'{os}',os_version:'{os_id}',device_model:'{device_type_id}',ip:'{ip}',country_code:'{geo}',ext:'',rta_token:''}}}
}
];
diff --git a/assets/link-converter-core.js b/assets/link-converter-core.js
new file mode 100644
index 0000000..ca0b587
--- /dev/null
+++ b/assets/link-converter-core.js
@@ -0,0 +1,59 @@
+((root) => {
+ function decodeKey(value) {
+ try { return decodeURIComponent(value.replace(/\+/g, ' ')); }
+ catch (_) { return value; }
+ }
+
+ function detectLinkType(link) {
+ const pathname = new URL(link).pathname.toLowerCase();
+ return /(?:^|\/)imp(?:\/|$)/.test(pathname) ? 'imp' : 'click';
+ }
+
+ function convertTrackingLink(originalLink, template) {
+ const original = originalLink.trim();
+ const parsed = new URL(original);
+ if (!['http:', 'https:'].includes(parsed.protocol)) throw new Error('仅支持 HTTP 或 HTTPS 链接');
+ if (!parsed.search) throw new Error('链接中没有可转换的查询参数');
+
+ const type = detectLinkType(original);
+ const linkTemplate = template.links[type];
+ if (!linkTemplate) {
+ const typeLabel = type === 'imp' ? 'Impression' : 'Click';
+ throw new Error(`${template.name} 暂未配置 ${typeLabel} 宏模板`);
+ }
+
+ const hashIndex = original.indexOf('#');
+ const hash = hashIndex >= 0 ? original.slice(hashIndex) : '';
+ const withoutHash = hashIndex >= 0 ? original.slice(0, hashIndex) : original;
+ const queryIndex = withoutHash.indexOf('?');
+ const base = withoutHash.slice(0, queryIndex);
+ const query = withoutHash.slice(queryIndex + 1);
+ const replacements = { platform: template.platformCode, ...linkTemplate.mappings };
+ const changes = [];
+ let parameterCount = 0;
+
+ const convertedSegments = query.split('&').map((segment) => {
+ if (!segment) return segment;
+ parameterCount += 1;
+ const equalIndex = segment.indexOf('=');
+ const rawKey = equalIndex >= 0 ? segment.slice(0, equalIndex) : segment;
+ const rawValue = equalIndex >= 0 ? segment.slice(equalIndex + 1) : '';
+ const key = decodeKey(rawKey);
+ if (!Object.prototype.hasOwnProperty.call(replacements, key)) return segment;
+
+ const replacement = String(replacements[key] ?? '');
+ if (rawValue !== replacement) changes.push({ key, from: rawValue, to: replacement });
+ return `${rawKey}=${replacement}`;
+ });
+
+ return {
+ url: `${base}?${convertedSegments.join('&')}${hash}`,
+ type,
+ changes,
+ parameterCount,
+ preservedCount: parameterCount - changes.length
+ };
+ }
+
+ root.TrackingLinkConverter = { detectLinkType, convertTrackingLink };
+})(typeof window === 'undefined' ? globalThis : window);
diff --git a/assets/link-generator.js b/assets/link-generator.js
index eb50235..a7b2b2f 100644
--- a/assets/link-generator.js
+++ b/assets/link-generator.js
@@ -2,36 +2,26 @@
const templates = window.LINK_TEMPLATES;
if (!templates?.length) return;
+ const { convertTrackingLink } = window.TrackingLinkConverter;
+
const $ = (id) => document.getElementById(id);
const platformSelect = $('platformSelect');
- const linkTypeSelect = $('linkTypeSelect');
- const mappingBody = $('mappingTableBody');
const macroBody = $('macroTableBody');
const output = $('urlOutput');
- const businessIds = ['advid','campid','pkg','platformCode','sanCampid','adsetId','countryCode'];
- let state = { platformIndex:0, type:'click', mappings:{} };
+ let activeResult = null;
+ let inputTimer;
$('templateCount').textContent = `${templates.length} 个平台模板`;
templates.forEach((template, index) => platformSelect.add(new Option(template.name, index)));
- const activeTemplate = () => templates[state.platformIndex];
- const activeLink = () => activeTemplate().links[state.type];
+ const activeTemplate = () => templates[Number(platformSelect.value || 0)];
- function loadPlatform() {
+ function renderPlatform() {
const template = activeTemplate();
- linkTypeSelect.innerHTML = '';
- Object.keys(template.links).forEach((type) => linkTypeSelect.add(new Option(type === 'click' ? 'Click Link' : 'Impression Link', type)));
- state.type = Object.keys(template.links)[0];
- $('platformCode').value = template.platformCode;
- $('platformStatus').innerHTML = `${template.status}`;
+ const review = template.status.includes('待');
+ $('platformStatus').innerHTML = `${escapeHtml(template.status)}`;
renderMacros();
- loadLink();
- }
-
- function loadLink() {
- state.mappings = { ...activeLink().mappings };
- renderMappings();
- buildUrl();
+ if ($('originalLink').value.trim()) convertFromInput(false);
}
function renderMacros() {
@@ -42,76 +32,72 @@
: '
| 没有匹配的媒体宏 |
';
}
- function renderMappings() {
- mappingBody.innerHTML = Object.entries(state.mappings).map(([key, value]) => `${escapeHtml(key)} | |
`).join('');
- mappingBody.querySelectorAll('input').forEach((input) => input.addEventListener('input', () => {
- state.mappings[input.dataset.key] = input.value;
- buildUrl();
- }));
+ 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('');
}
- function buildUrl() {
- const link = activeLink();
- const campid = $('campid').value.trim();
- const pkg = $('pkg').value.trim();
- const type = state.type;
- const params = [];
- const addBusiness = (key, value) => params.push(`${key}=${encodeURIComponent(value)}`);
- const addRaw = (key, value) => params.push(`${key}=${value}`);
-
- if (type === 'click') {
- addBusiness('advid', $('advid').value.trim());
- addBusiness('campid', campid);
- addBusiness('platform', $('platformCode').value.trim());
- addBusiness('pkg', pkg);
- } else {
- addBusiness('campid', campid);
- addBusiness('pkg', pkg);
- }
-
- Object.entries(state.mappings).forEach(([key, value]) => {
- const finalValue = key === 'country_code' && $('countryCode').value.trim()
- ? $('countryCode').value.trim().toUpperCase()
- : value;
- addRaw(key, finalValue);
- });
-
- if (type === 'click') {
- if ($('sanCampid').value.trim()) addBusiness('san_campid', $('sanCampid').value.trim());
- if ($('adsetId').value.trim()) addBusiness('adset_id', $('adsetId').value.trim());
- addRaw('c_cto', '0');
- } else {
- addRaw('at_tag', '2');
- }
-
- const url = `${link.endpoint}?${params.join('&')}`;
- output.textContent = url;
- $('urlLength').textContent = `${url.length} chars`;
-
- const missing = [];
- if (!campid) missing.push('Campaign ID');
- if (!pkg) missing.push('Package Name');
- $('generatorMessage').textContent = missing.length ? `待填写:${missing.join('、')}` : '';
+ function showEmpty() {
+ activeResult = null;
+ $('conversionEmpty').classList.remove('hidden');
+ $('conversionResult').classList.add('hidden');
+ $('detectedType').textContent = '等待链接';
+ $('generatorMessage').textContent = '';
+ $('copyStatus').textContent = '';
+ $('copyLink').disabled = true;
}
- function resetGenerator() {
- $('advid').value = '30';
- $('campid').value = '';
- $('pkg').value = '';
- $('platformCode').value = activeTemplate().platformCode;
- $('sanCampid').value = '';
- $('adsetId').value = '-1';
- $('countryCode').value = '';
- loadLink();
+ function showError(message) {
+ activeResult = null;
+ $('generatorMessage').textContent = message;
+ $('conversionEmpty').classList.remove('hidden');
+ $('conversionResult').classList.add('hidden');
+ $('detectedType').textContent = '无法识别';
+ $('copyLink').disabled = true;
+ }
+
+ function convertFromInput(showRequiredMessage = true) {
+ const original = $('originalLink').value.trim();
+ $('copyStatus').textContent = '';
+ if (!original) {
+ showEmpty();
+ if (showRequiredMessage) $('generatorMessage').textContent = '请先粘贴一条完整的 Tracking Link';
+ return;
+ }
+
+ try {
+ const result = convertTrackingLink(original, activeTemplate());
+ activeResult = result;
+ const typeLabel = result.type === 'imp' ? 'Impression' : 'Click';
+ $('detectedType').innerHTML = `${typeLabel}`;
+ $('summaryType').textContent = typeLabel;
+ $('replacementCount').textContent = result.changes.length;
+ $('preservedCount').textContent = result.preservedCount;
+ $('urlLength').textContent = `${result.url.length} chars`;
+ output.textContent = result.url;
+ renderChanges(result.changes);
+ $('generatorMessage').textContent = result.changes.length ? '' : '链接有效,但没有发现需要替换的参数';
+ $('conversionEmpty').classList.add('hidden');
+ $('conversionResult').classList.remove('hidden');
+ $('copyLink').disabled = false;
+ } catch (error) {
+ showError(error.message === 'Invalid URL' ? '链接格式不正确,请粘贴包含 http:// 或 https:// 的完整链接' : error.message);
+ }
+ }
+
+ function loadSample() {
+ $('originalLink').value = 'https://trident.bigpinggo.com/l/click?advid=30&campid=91566789&platform=M_API_Self_Mintegral&pkg=com.salaryse.android&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=91566789&adset_id=-1&c_cto=0';
+ convertFromInput(false);
}
async function copyUrl() {
- if (!$('campid').value.trim() || !$('pkg').value.trim()) {
- $('copyStatus').textContent = '请先补全必填参数';
- return;
- }
+ if (!activeResult) return;
try {
- await navigator.clipboard.writeText(output.textContent);
+ await navigator.clipboard.writeText(activeResult.url);
} catch (_) {
const range = document.createRange();
range.selectNodeContents(output);
@@ -123,7 +109,7 @@
}
$('copyStatus').textContent = '已复制';
const toast = $('toast');
- toast.textContent = '最终链接已复制到剪贴板';
+ toast.textContent = '转换后的平台链接已复制';
toast.classList.add('show');
setTimeout(() => toast.classList.remove('show'), 1800);
}
@@ -132,11 +118,17 @@
return String(value).replace(/[&<>"']/g, (char) => ({ '&':'&', '<':'<', '>':'>', '"':'"', "'":''' })[char]);
}
- platformSelect.addEventListener('change', () => { state.platformIndex = Number(platformSelect.value); loadPlatform(); });
- linkTypeSelect.addEventListener('change', () => { state.type = linkTypeSelect.value; loadLink(); });
+ platformSelect.addEventListener('change', renderPlatform);
$('macroSearch').addEventListener('input', renderMacros);
- businessIds.forEach((id) => $(id).addEventListener('input', buildUrl));
- $('resetGenerator').addEventListener('click', resetGenerator);
+ $('convertLink').addEventListener('click', () => convertFromInput(true));
+ $('sampleLink').addEventListener('click', loadSample);
$('copyLink').addEventListener('click', copyUrl);
- loadPlatform();
+ $('clearConverter').addEventListener('click', () => { $('originalLink').value = ''; showEmpty(); $('originalLink').focus(); });
+ $('originalLink').addEventListener('input', () => {
+ clearTimeout(inputTimer);
+ inputTimer = setTimeout(() => convertFromInput(false), 220);
+ });
+
+ renderPlatform();
+ showEmpty();
})();
diff --git a/assets/styles.css b/assets/styles.css
index 6cde094..2e23abb 100644
--- a/assets/styles.css
+++ b/assets/styles.css
@@ -6,6 +6,6 @@
.hero{min-height:480px;display:grid;grid-template-columns:1.3fr .7fr;align-items:center;padding-block:74px 56px}.eyebrow{font-family:var(--mono);font-size:11px;letter-spacing:.13em;font-weight:500;display:flex;align-items:center;gap:9px;margin:0 0 22px;color:#394641}.eyebrow span{display:inline-block;width:28px;height:2px;background:var(--orange)}.hero h1{font-size:clamp(43px,5vw,68px);line-height:1.08;letter-spacing:-.055em;margin:0;max-width:780px}.hero h1 em{font-style:normal;color:var(--blue-dark)}.hero-lead{color:var(--muted);font-size:16px;max-width:610px;margin:24px 0 32px}.hero-meta{display:flex;align-items:center;gap:15px;color:var(--muted);font-size:11px}.hero-meta span{display:flex;align-items:center;gap:7px}.hero-meta b{font-family:var(--mono);color:var(--ink)}.hero-meta i{height:1px;width:25px;background:var(--line)}.hero-visual{height:330px;position:relative;display:grid;place-items:center}.orbit{position:absolute;border:1px solid rgba(17,35,31,.16);border-radius:50%;transform:rotate(-19deg)}.orbit-one{width:280px;height:160px}.orbit-two{width:210px;height:300px;transform:rotate(42deg)}.visual-core{height:114px;width:114px;border-radius:50%;background:var(--ink);color:#fff;display:grid;place-items:center;position:relative;z-index:2;box-shadow:0 20px 40px rgba(17,35,31,.2)}.visual-core span{font:9px var(--mono);letter-spacing:.12em}.visual-core strong{font-size:24px;line-height:0;color:var(--lime)}.visual-node{position:absolute;background:var(--white);border:1px solid var(--line);border-radius:99px;padding:8px 13px;font:9px var(--mono);box-shadow:var(--shadow)}.node-a{left:8%;top:26%}.node-b{right:4%;top:38%;background:var(--lime)}.node-c{left:22%;bottom:10%;background:#dfe5ff}
.tool-grid{display:grid;grid-template-columns:1fr 1fr;gap:20px}.tool-card{min-height:390px;padding:36px 38px;border-radius:var(--radius);position:relative;overflow:hidden;transition:transform .25s ease,box-shadow .25s ease}.tool-card:hover{transform:translateY(-5px);box-shadow:var(--shadow)}.card-blue{background:#718cfa;color:#0d1b18}.card-lime{background:var(--lime)}.tool-number{font:11px var(--mono);opacity:.65}.tool-icon{position:absolute;right:36px;top:31px;font-size:28px;width:48px;height:48px;border:1px solid rgba(17,35,31,.25);border-radius:50%;display:grid;place-items:center}.tool-kicker{font:10px var(--mono);letter-spacing:.12em;margin:63px 0 8px;opacity:.7}.tool-card h2{font-size:32px;letter-spacing:-.04em;margin:0 0 13px}.tool-card>p:not(.tool-kicker){max-width:430px;margin:0;color:rgba(17,35,31,.75);font-size:14px}.tool-card ul{list-style:none;padding:0;margin:27px 0 45px;display:flex;gap:9px;flex-wrap:wrap}.tool-card li{border:1px solid rgba(17,35,31,.18);border-radius:99px;padding:6px 10px;font-size:10px}.tool-cta{position:absolute;left:38px;bottom:33px;font-weight:700;font-size:13px}.tool-cta b{font-size:17px;margin-left:8px}.status-strip{margin-top:20px;padding:22px 26px;border:1px solid var(--line);border-radius:15px;display:flex;align-items:center;justify-content:space-between;background:rgba(255,255,255,.55)}.status-strip>div,.data-badge{display:flex;align-items:center;gap:12px}.status-strip p,.data-badge p{display:flex;flex-direction:column;margin:0}.status-strip strong,.data-badge strong{font-size:12px}.status-strip small,.data-badge small{font-size:10px;color:var(--muted)}.pulse-dot{width:9px;height:9px;border-radius:50%;background:#71ad31;box-shadow:0 0 0 5px rgba(113,173,49,.12)}.status-note{font:10px var(--mono)!important;color:var(--muted)}
.site-footer{height:90px;display:flex;align-items:center;justify-content:space-between;color:#8b9591;font:10px var(--mono);letter-spacing:.04em}.site-footer b{font-weight:400}.page-main{padding-block:45px 70px}.page-heading{display:flex;align-items:flex-end;justify-content:space-between;margin-bottom:30px}.page-heading .eyebrow{margin-bottom:11px}.page-heading h1{font-size:42px;letter-spacing:-.045em;line-height:1.12;margin:0 0 10px}.page-heading>div>p:last-child{margin:0;color:var(--muted);font-size:13px}.data-badge{border:1px solid var(--line);border-radius:12px;background:rgba(255,255,255,.55);padding:13px 17px;min-width:208px}.panel{background:var(--white);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 9px 30px rgba(17,35,31,.035)}.workspace{display:grid}.recommendation-layout{grid-template-columns:370px 1fr;gap:20px;align-items:start}.form-panel{padding:28px;position:sticky;top:102px}.panel-title span{font:9px var(--mono);color:var(--blue-dark);letter-spacing:.1em}.panel-title h2{font-size:21px;letter-spacing:-.025em;margin:3px 0}.panel-title p{font-size:11px;color:var(--muted);margin:0}.panel-title.compact{padding:25px 26px 15px}.field-label{display:block;font-size:11px;font-weight:700;margin:22px 0 7px}.field-label b{color:#e4513e}.input-wrap{display:flex;border:1px solid var(--line);border-radius:10px;background:#fafaf7;overflow:hidden;transition:border .2s}.input-wrap:focus-within{border-color:var(--blue)}.input-prefix{display:grid;place-items:center;padding:0 11px;border-right:1px solid var(--line);font:9px var(--mono);color:var(--muted)}input,select{width:100%;height:43px;border:1px solid var(--line);border-radius:10px;background:#fafaf7;color:var(--ink);padding:0 12px;outline:none;transition:border-color .2s,box-shadow .2s}input:focus,select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(111,140,255,.1)}.input-wrap input{border:0;border-radius:0;box-shadow:none!important}.field-help{font-size:9px;color:#8c9692;margin:5px 0 0}.segmented{display:grid;grid-template-columns:repeat(3,1fr);gap:5px;padding:4px;border:1px solid var(--line);border-radius:10px;background:#f5f5f1}.segmented input{position:absolute;opacity:0;pointer-events:none}.segmented span{height:31px;display:grid;place-items:center;border-radius:7px;font-size:10px;cursor:pointer}.segmented input:checked+span{background:var(--white);box-shadow:0 2px 8px rgba(17,35,31,.08);font-weight:700}.primary-btn{height:44px;border:0;border-radius:10px;background:var(--ink);color:#fff;padding:0 18px;display:inline-flex;align-items:center;justify-content:center;gap:18px;font-weight:700;font-size:12px}.primary-btn:hover{background:#263a35}.full-btn{width:100%;margin-top:21px;justify-content:space-between}.full-btn b{color:var(--lime);font-size:17px}.text-btn{border:0;background:transparent;color:var(--blue-dark);font-size:10px;width:100%;padding:12px 0 4px}.form-message,.validation-line{color:#c04431;font-size:10px;min-height:16px;margin-top:8px}.form-footnote{display:flex;gap:10px;background:#f6f6f2;border-radius:10px;padding:12px;margin-top:18px}.form-footnote b{min-width:18px;height:18px;border-radius:50%;border:1px solid #9da6a2;display:grid;place-items:center;font:10px var(--mono)}.form-footnote p{font-size:9px;color:var(--muted);margin:0}.result-panel{min-height:604px;padding:29px}.result-head,.config-topline{display:flex;align-items:center}.result-head{justify-content:space-between;padding-bottom:19px;border-bottom:1px solid var(--line)}.result-head h2,.config-topline h2{font-size:21px;margin:2px 0 0;letter-spacing:-.025em}.section-index{display:block;color:var(--blue-dark)}.outline-btn{border:1px solid var(--line);border-radius:9px;background:#fff;height:36px;padding:0 13px;font-size:10px;color:var(--muted)}.outline-btn:hover{border-color:var(--ink);color:var(--ink)}.result-empty{min-height:480px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.empty-graphic{display:flex;align-items:center;gap:8px;margin-bottom:25px}.empty-graphic span{width:54px;height:54px;border-radius:50%;border:1px solid var(--line);display:grid;place-items:center;font:9px var(--mono);background:#f8f8f5}.empty-graphic span:nth-of-type(2){background:#e5eaff}.empty-graphic span:nth-of-type(3){background:#eaf7c9}.empty-graphic i{font-style:normal;color:#a4aca9}.result-empty h3{font-size:16px;margin:0 0 7px}.result-empty p{font-size:11px;color:var(--muted);max-width:390px;margin:0}.query-summary{display:grid;grid-template-columns:1.7fr 1fr .9fr;background:#f5f5f1;border-radius:12px;margin:18px 0 13px;padding:12px 16px;gap:13px}.query-summary div{display:flex;flex-direction:column;min-width:0}.query-summary div+div{border-left:1px solid var(--line);padding-left:15px}.query-summary span{font:8px var(--mono);color:#8b9591;letter-spacing:.07em}.query-summary strong{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}.result-list{display:flex;flex-direction:column;gap:9px}.result-card{display:grid;grid-template-columns:37px 1fr auto;gap:14px;align-items:center;padding:15px 16px;border:1px solid var(--line);border-radius:13px;position:relative}.result-card.top-result{border-color:#98adff;background:#f7f8ff}.result-card.top-result:before{content:'BEST MATCH';position:absolute;right:13px;top:-7px;background:var(--blue);font:7px var(--mono);padding:3px 7px;border-radius:99px}.rank{font:13px var(--mono);color:#a0a9a5}.result-name{display:flex;align-items:center;gap:9px}.result-name h3{font-size:14px;margin:0}.result-name>span{font-size:8px;border:1px solid var(--line);border-radius:99px;padding:2px 6px;color:var(--muted)}.reason-tags{display:flex;gap:5px;flex-wrap:wrap;margin:6px 0 4px}.reason-tags span{font-size:8px;background:#eef1ea;padding:3px 6px;border-radius:4px}.result-main p{font-size:9px;color:var(--muted);margin:0}.score-block{display:flex;align-items:center;gap:11px}.score-ring{--score:50;width:50px;height:50px;border-radius:50%;display:grid;place-content:center;text-align:center;background:radial-gradient(circle closest-side,#fff 78%,transparent 80% 99%),conic-gradient(var(--blue-dark) calc(var(--score)*1%),#e6e9e5 0)}.score-ring strong{font:12px var(--mono);line-height:1}.score-ring small{font:7px var(--mono);color:var(--muted)}.priority{font-size:8px;border-radius:99px;padding:4px 7px;white-space:nowrap}.priority-high{background:#dfe5ff;color:#273fae}.priority-mid{background:#e9f7c5;color:#58790a}.priority-low{background:#eee;color:#6e7774}.method-note{display:flex;align-items:center;gap:8px;margin-top:14px;font-size:8px;color:var(--muted)}.method-note strong{margin-right:auto;color:var(--ink)}.method-note span{border-left:1px solid var(--line);padding-left:8px}
-.generator-stack{display:flex;flex-direction:column;gap:18px}.generator-config{padding:26px}.config-topline{gap:13px}.config-topline .outline-btn{margin-left:auto}.config-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:21px}.config-grid label>span{display:block;font-size:9px;font-weight:700;margin-bottom:5px}.generator-columns{display:grid;grid-template-columns:.74fr 1.26fr;gap:18px;align-items:start}.macro-panel{overflow:hidden}.macro-search{padding:0 25px 14px}.macro-search input{height:38px}.macro-table-wrap{max-height:550px;overflow:auto;border-top:1px solid var(--line)}table{width:100%;border-collapse:collapse}.macro-table th,.macro-table td,.mapping-table th,.mapping-table td{text-align:left;border-bottom:1px solid #eceeea;padding:10px 13px;font-size:9px}.macro-table th,.mapping-table th{position:sticky;top:0;background:#f8f8f5;color:var(--muted);font:8px var(--mono);z-index:1}.macro-table th:first-child{width:42%}.macro-table code,.mapping-table code{font-family:var(--mono);font-size:9px;color:#2e48bc;word-break:break-all}.table-empty{text-align:center!important;color:var(--muted);padding:30px!important}.template-status{display:inline-block;background:#eaf7c9;color:#5b7d0a;border-radius:99px;padding:3px 7px;font-size:8px}.template-status.review{background:#ffecdf;color:#b25329}.output-panel{padding:26px}.output-title{padding-bottom:16px;border-bottom:1px solid var(--line)}.live-chip{font:8px var(--mono);margin-left:auto;color:#4f7320;display:flex;align-items:center;gap:5px}.live-chip i{width:6px;height:6px;border-radius:50%;background:#7ab836}.mapping-table-wrap{max-height:315px;overflow:auto;margin-top:12px;border:1px solid var(--line);border-radius:10px}.mapping-table th:first-child{width:34%}.mapping-table td{padding:6px 10px}.mapping-table input{height:30px;border:0;background:transparent;padding:0;font:9px var(--mono);box-shadow:none!important}.output-label{display:flex;justify-content:space-between;align-items:center;margin:17px 0 7px;font-size:10px;font-weight:700}.output-label small{font:8px var(--mono);color:var(--muted);font-weight:400}.url-output{min-height:128px;max-height:210px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;margin:0;background:var(--ink);color:#dff28d;border-radius:12px;padding:15px;font:10px/1.7 var(--mono);border:1px solid #263b35}.output-actions{display:flex;align-items:center;gap:12px;margin-top:12px}.copy-status{font-size:9px;color:#4d7622}.toast{position:fixed;left:50%;bottom:30px;transform:translate(-50%,20px);opacity:0;pointer-events:none;background:var(--ink);color:#fff;padding:10px 16px;border-radius:99px;font-size:10px;transition:.25s;z-index:100}.toast.show{opacity:1;transform:translate(-50%,0)}
-@media(max-width:900px){.hero{grid-template-columns:1fr}.hero-visual{display:none}.recommendation-layout,.generator-columns{grid-template-columns:1fr}.form-panel{position:static}.config-grid{grid-template-columns:repeat(2,1fr)}.main-nav{gap:18px}.method-note{flex-wrap:wrap}.method-note strong{width:100%}}
-@media(max-width:620px){.shell{width:min(100% - 28px,1180px)}.site-header{height:68px;padding-inline:14px}.brand small,.home-link,.version-chip{display:none}.main-nav{gap:13px}.main-nav a{font-size:11px}.hero{min-height:auto;padding-block:55px 45px}.hero h1{font-size:39px}.hero-meta{display:none}.tool-grid{grid-template-columns:1fr}.tool-card{min-height:365px;padding:28px}.tool-cta{left:28px}.status-strip,.page-heading{align-items:flex-start;gap:17px;flex-direction:column}.status-note{display:none}.page-main{padding-block:32px 50px}.page-heading h1{font-size:34px}.data-badge{width:100%}.recommendation-layout{gap:14px}.form-panel,.result-panel,.generator-config,.output-panel{padding:20px}.result-card{grid-template-columns:30px 1fr}.score-block{grid-column:2;justify-content:flex-start}.query-summary{grid-template-columns:1fr}.query-summary div+div{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:8px}.method-note{display:none}.config-grid{grid-template-columns:1fr}.generator-columns{gap:14px}.site-footer{height:70px}.site-footer span:first-child{display:none}}
+.generator-stack{display:flex;flex-direction:column;gap:18px}.converter-input-panel{padding:26px}.config-topline{gap:13px}.config-topline .outline-btn{margin-left:auto}.converter-toolbar{display:grid;grid-template-columns:1.3fr .7fr .7fr;gap:14px;margin-top:21px}.converter-toolbar label>span,.detect-card>span{display:block;font-size:9px;font-weight:700;margin-bottom:5px}.detect-card{height:65px;border:1px solid var(--line);border-radius:10px;background:#fafaf7;padding:9px 12px}.detect-card strong{display:flex;align-items:center;height:29px;font-size:11px}.textarea-label{display:flex;align-items:center;justify-content:space-between;margin:20px 0 7px}.textarea-label>span{font-size:10px;font-weight:700}.textarea-label small{font-size:9px;color:var(--muted)}.link-textarea{width:100%;min-height:132px;resize:vertical;border:1px solid var(--line);border-radius:12px;background:#fafaf7;padding:13px 14px;outline:none;font:10px/1.65 var(--mono);color:var(--ink)}.link-textarea:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(111,140,255,.1)}.converter-actions{display:flex;align-items:center;gap:14px;margin-top:12px}.converter-actions .validation-line{margin:0 0 0 auto}.text-inline-btn{border:0;background:transparent;color:var(--blue-dark);font-size:10px}.type-chip{display:inline-block;background:#dfe5ff;color:#273fae;border-radius:99px;padding:3px 8px;font-size:9px}.generator-columns{display:grid;grid-template-columns:.72fr 1.28fr;gap:18px;align-items:start}.macro-panel{overflow:hidden}.macro-search{padding:0 25px 14px}.macro-search input{height:38px}.macro-table-wrap{max-height:550px;overflow:auto;border-top:1px solid var(--line)}table{width:100%;border-collapse:collapse}.macro-table th,.macro-table td,.mapping-table th,.mapping-table td{text-align:left;border-bottom:1px solid #eceeea;padding:10px 13px;font-size:9px}.macro-table th,.mapping-table th{position:sticky;top:0;background:#f8f8f5;color:var(--muted);font:8px var(--mono);z-index:1}.macro-table th:first-child{width:42%}.macro-table code,.mapping-table code{font-family:var(--mono);font-size:9px;color:#2e48bc;word-break:break-all}.table-empty{text-align:center!important;color:var(--muted);padding:30px!important}.template-status{display:inline-block;background:#eaf7c9;color:#5b7d0a;border-radius:99px;padding:3px 7px;font-size:8px}.template-status.review{background:#ffecdf;color:#b25329}.output-panel{padding:26px}.output-title{padding-bottom:16px;border-bottom:1px solid var(--line)}.live-chip{font:8px var(--mono);margin-left:auto;color:#4f7320;display:flex;align-items:center;gap:5px}.live-chip i{width:6px;height:6px;border-radius:50%;background:#7ab836}.conversion-empty{min-height:425px;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}.conversion-empty>div{width:58px;height:58px;border:1px solid var(--line);border-radius:50%;display:grid;place-items:center;background:#f7f8ff;color:var(--blue-dark);font-size:24px}.conversion-empty h3{font-size:14px;margin:15px 0 4px}.conversion-empty p{font-size:10px;color:var(--muted);margin:0}.conversion-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:14px}.conversion-summary div{background:#f5f5f1;border-radius:9px;padding:9px 11px;display:flex;flex-direction:column}.conversion-summary span{font:8px var(--mono);color:var(--muted)}.conversion-summary strong{font-size:13px;margin-top:2px}.mapping-table-wrap{max-height:260px;overflow:auto;margin-top:12px;border:1px solid var(--line);border-radius:10px}.conversion-table th:first-child{width:20%}.conversion-table th:nth-child(2){width:38%}.mapping-table td{padding:8px 10px;word-break:break-all}.old-param{font:9px var(--mono);color:#7b8581}.empty-param{font-size:8px;color:#9a4e2e;background:#ffecdf;border-radius:4px;padding:2px 5px}.output-label{display:flex;justify-content:space-between;align-items:center;margin:17px 0 7px;font-size:10px;font-weight:700}.output-label small{font:8px var(--mono);color:var(--muted);font-weight:400}.url-output{min-height:128px;max-height:210px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere;margin:0;background:var(--ink);color:#dff28d;border-radius:12px;padding:15px;font:10px/1.7 var(--mono);border:1px solid #263b35}.output-actions{display:flex;align-items:center;gap:12px;margin-top:12px}.primary-btn:disabled{opacity:.45;cursor:not-allowed}.copy-status{font-size:9px;color:#4d7622}.toast{position:fixed;left:50%;bottom:30px;transform:translate(-50%,20px);opacity:0;pointer-events:none;background:var(--ink);color:#fff;padding:10px 16px;border-radius:99px;font-size:10px;transition:.25s;z-index:100}.toast.show{opacity:1;transform:translate(-50%,0)}
+@media(max-width:900px){.hero{grid-template-columns:1fr}.hero-visual{display:none}.recommendation-layout,.generator-columns{grid-template-columns:1fr}.form-panel{position:static}.converter-toolbar{grid-template-columns:1fr 1fr}.converter-toolbar label{grid-column:1/-1}.main-nav{gap:18px}.method-note{flex-wrap:wrap}.method-note strong{width:100%}}
+@media(max-width:620px){.shell{width:min(100% - 28px,1180px)}.site-header{height:68px;padding-inline:14px}.brand small,.home-link,.version-chip{display:none}.main-nav{gap:13px}.main-nav a{font-size:11px}.hero{min-height:auto;padding-block:55px 45px}.hero h1{font-size:39px}.hero-meta{display:none}.tool-grid{grid-template-columns:1fr}.tool-card{min-height:365px;padding:28px}.tool-cta{left:28px}.status-strip,.page-heading{align-items:flex-start;gap:17px;flex-direction:column}.status-note{display:none}.page-main{padding-block:32px 50px}.page-heading h1{font-size:34px}.data-badge{width:100%}.recommendation-layout{gap:14px}.form-panel,.result-panel,.converter-input-panel,.output-panel{padding:20px}.result-card{grid-template-columns:30px 1fr}.score-block{grid-column:2;justify-content:flex-start}.query-summary{grid-template-columns:1fr}.query-summary div+div{border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:8px}.method-note{display:none}.converter-toolbar{grid-template-columns:1fr}.converter-toolbar label{grid-column:auto}.textarea-label{align-items:flex-start;gap:4px;flex-direction:column}.converter-actions{align-items:flex-start;flex-wrap:wrap}.converter-actions .validation-line{width:100%;margin:0}.conversion-summary{grid-template-columns:1fr}.generator-columns{gap:14px}.site-footer{height:70px}.site-footer span:first-child{display:none}}
diff --git a/index.html b/index.html
index 83692c3..231d977 100644
--- a/index.html
+++ b/index.html
@@ -47,10 +47,10 @@
02
⌁
TRACKING BUILDER
- 自投链接生成器
- 选择自投媒体,填写业务参数,按平台专属宏规则实时生成 Click / Impression 链接。
- - 平台宏模板集中管理
- 业务参数实时替换
- 一键复制最终链接
- 生成链接 →
+ 自投链接转换器
+ 粘贴原始 Mintegral Click Link,自动将通用参数替换为已确认的平台专属宏。
+ - Mintegral Click
- 业务参数原样保留
- 一键复制转换结果
+ 转换链接 →
diff --git a/link-generator.html b/link-generator.html
index 732ef61..248627c 100644
--- a/link-generator.html
+++ b/link-generator.html
@@ -3,8 +3,8 @@
-
- 自投链接生成器 · Traffic Intelligence
+
+ 自投链接转换器 · Traffic Intelligence
@@ -16,40 +16,48 @@
- TRACKING BUILDER / 02
自投平台链接生成器
选择媒体模板,填写订单参数,并实时检查平台宏映射与最终链接。
- — 个平台模板Click / Impression
+ TRACKING CONVERTER / 02
自投平台链接转换器
粘贴一条原始 Tracking Link,自动替换为目标平台要求的宏参数。
+ — 个平台模板Mintegral Click URL 转换
-
- STEP 01
选择模板与业务参数
-
-
-
-
-
-
-
-
-
-
+
- STEP 03
参数映射与输出
LIVE
-
- 最终投放链接0 chars
-
-
+ STEP 02
转换结果
AUTO
+ ↳
等待原始链接
转换后将在这里展示参数替换明细与最终链接。
+
+
+
链接类型—
+
已替换参数0
+
保留参数0
+
+
+
最终平台链接0 chars
+
+
+
@@ -58,6 +66,7 @@
+