From 969bab77a75c8a6e763f0e059584fa319b68345c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E6=BA=90?= Date: Mon, 19 Oct 2026 20:15:39 +0800 Subject: [PATCH] feat: convert pasted Mintegral click links --- README.md | 2 +- assets/data/link-templates.js | 132 ++++++++++++++++----------- assets/link-converter-core.js | 59 ++++++++++++ assets/link-generator.js | 166 ++++++++++++++++------------------ assets/styles.css | 6 +- index.html | 8 +- link-generator.html | 55 ++++++----- 7 files changed, 258 insertions(+), 170 deletions(-) create mode 100644 assets/link-converter-core.js 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,自动将通用参数替换为已确认的平台专属宏。

+ + 转换链接 → 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 01

选择目标平台并粘贴链接

+
+ +
模板状态—
+
识别类型等待链接
+
+ + +
+ + +
-
-
STEP 02

媒体宏参考

+
PLATFORM MACROS

目标平台宏参考

当前平台可用于替换的动态参数

媒体宏说明
-
STEP 03

参数映射与输出

LIVE
-
参数 Key媒体 Value / Macro
-
最终投放链接0 chars
-

-          
+
STEP 02

转换结果

AUTO
+
↳

等待原始链接

转换后将在这里展示参数替换明细与最终链接。

+
@@ -58,6 +66,7 @@
Traffic Intelligence Hub© Media Operations
+