function loadScript(url) { var el = document.createElement('script'); el.src = url; document.body.appendChild(el); } function xhrGet(url, callback) { var xhr = new XMLHttpRequest; xhr.open('GET', url); xhr.onload = function () { callback(xhr.responseText) }; xhr.send(); } mdui.confirm('' + '
' + '

' + '使用本工具不需要强制关注任何公众号或转发任何内容到朋友圈。如果你发现有公众号存在类似“关注○○,发送○○,转发○○到朋友圈领取○○”的行为,请对此类诱导行为进行投诉。' + '什么是诱导行为?' + '

' + '

本工具生成的截图,仅可用于个人应付各类强制要求转发朋友圈的情形,请勿批量生成截图或将截图用于造谣诽谤、微商宣传等非法或令人反感的用途,请勿用于商业用途,二次部署请勿删除原作者相关信息。

' + '

当你生成截图时,你应该确定你可以接受向他人发送该截图将会带来的后果和影响,否则请不要使用本工具并离开当前页面。

' + '

本工具谢绝肖战粉丝使用。#我是普通人,我讨厌肖战#

' + '
', '在开始使用之前……', function () {}, function () { location.href = 'about:blank' }, { modal: true, closeOnEsc: false, history: false, } ); if (navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1) loadScript('https://cdn.jsdelivr.net/gh/TransparentLC/WechatMomentScreenshot/fuckWechat.min.js'); if (!window.Promise) loadScript('https://cdn.jsdelivr.net/npm/promise-polyfill/dist/polyfill.min.js'); var avatarURL = []; xhrGet('https://cdn.jsdelivr.net/gh/TransparentLC/WechatMomentScreenshot/avatarURL.json', function (result) { avatarURL = JSON.parse(result) }); var emoticon = []; xhrGet('https://cdn.jsdelivr.net/gh/TransparentLC/WechatMomentScreenshot/emoticon.json', function (result) { emoticon = JSON.parse(result) }); // 读取配置 var configDefault = { name: 'A 营销号免费广告姬', text: '很实用的教程[微笑]\n需要收集五个赞 谢谢大家啦~( ^ω^)', location: '', app: '', height: 1920, uiWhite: false, appIcon: false, statusIcon: true, }; var config; var avatarFile; try { config = JSON.parse(localStorage.getItem('config')) || {}; } catch (error) { config = {}; } for (var k in configDefault) { if (config[k] === undefined) config[k] = configDefault[k]; } document.getElementById('configName').value = config.name; document.getElementById('configText').value = config.text; document.getElementById('configLocation').value = config.location; document.getElementById('configApp').value = config.app; document.getElementById('configHeight').value = config.height; document.getElementById('configUIWhite').checked = config.uiWhite; document.getElementById('configTopBarAppIcons').checked = config.appIcon; document.getElementById('configTopBarStatusIcons').checked = config.statusIcon; document.getElementById('avatar').style.backgroundImage = 'url(' + (localStorage.getItem('avatar') || 'https://ae01.alicdn.com/kf/HTB1yE4fMmzqK1RjSZFp761kSXXal.png') + ')'; //输入微信文章的链接,通过后端自动获取文章标题和文章封面 function getArticleInfo() { var requestDialog = new mdui.Dialog('#request'); mdui.prompt('公众号文章链接', function (value) { var xhr = new XMLHttpRequest; xhr.open('GET', 'https://wmsproxy.transparentlc.workers.dev/?url=' + encodeURIComponent(value)); //获取标题和封面的服务器 xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { var result = JSON.parse(xhr.responseText); document.getElementById('requestAction').innerText = 'OK'; if (requestDialog.getState() == 'opening' || requestDialog.getState() == 'opened') { if (typeof(result) != 'undefined' && result.success) { document.getElementById('configArticleTitle').value = result.title; document.getElementById('articleTitle').innerText = result.title; document.getElementById('articleIcon').style.backgroundImage = 'url(\"' + result.cover + '\")'; document.getElementById('requestResult').innerText = '获取成功!(ゝ∀・)'; document.getElementById('requestResultContent').innerHTML = '标题:' + result.title + '
封面:点此查看'; } else { document.getElementById('requestResult').innerText = '获取失败!( ´_っ`)'; document.getElementById('requestResultContent').innerHTML = '输入的链接是否为微信公众号文章?
(链接通常以 https://mp.weixin.qq.com/ 作为开头)'; } } } else { document.getElementById('requestResult').innerText = '获取失败!( ´_っ`)'; document.getElementById('requestResultContent').innerHTML = '无法连接到服务器。'; } requestDialog.handleUpdate(); } xhr.send(); document.getElementById('requestResult').innerText = ''; document.getElementById('requestAction').innerText = 'CANCEL'; document.getElementById('requestResultContent').innerHTML = '
获取中…… (o゚ω゚o)
'; mdui.updateSpinners(); requestDialog.open(); }, function () {}); } //删除所有发表的九宫格图片 function clearMultiImage() { for (var i = 1; i <= 9; i++) { document.getElementById('image' + i).style.backgroundImage = ''; } } //将时间转换为微信中显示的格式 function getTimeString(currentDate, specificDate) { var cd = new Date(currentDate.getTime() - currentDate.getTimezoneOffset() * 60 * 1000 - (currentDate.getTime() - currentDate.getTimezoneOffset() * 60 * 1000) % (60 * 60 * 24 * 1000)); var sd = new Date(specificDate.getTime() - specificDate.getTimezoneOffset() * 60 * 1000 - (specificDate.getTime() - specificDate.getTimezoneOffset() * 60 * 1000) % (60 * 60 * 24 * 1000)); if (cd.getTime() == sd.getTime()) { return ((specificDate.getHours() < 10) ? ('0' + specificDate.getHours()) : specificDate.getHours()) + ':' + ((specificDate.getMinutes() < 10) ? ('0' + specificDate.getMinutes()) : specificDate.getMinutes()); } else if (cd.getTime() - sd.getTime() == 60 * 60 * 24 * 1000) { return '昨天 ' + ((specificDate.getHours() < 10) ? ('0' + specificDate.getHours()) : specificDate.getHours()) + ':' + ((specificDate.getMinutes() < 10) ? ('0' + specificDate.getMinutes()) : specificDate.getMinutes()); } else { return specificDate.getFullYear() + '年' + (specificDate.getMonth() + 1) + '月' + specificDate.getDate() + '日 ' + ((specificDate.getHours() < 10) ? ('0' + specificDate.getHours()) : specificDate.getHours()) + ':' + ((specificDate.getMinutes() < 10) ? ('0' + specificDate.getMinutes()) : specificDate.getMinutes()); } } //复制短链接 function copyGitLink() { document.getElementById('gitLink').style.display = 'block'; var range = document.createRange(); range.selectNodeContents(document.getElementById('gitLink')); var selection = document.getSelection(); selection.removeAllRanges(); selection.addRange(range); document.execCommand('Copy'); selection.removeAllRanges(); mdui.snackbar({ message: '已复制到剪贴板~( っ*\'ω\'*c)' }); document.getElementById('gitLink').style.display = 'none'; } var commentList = []; //添加评论 function addComment(avatar, name, content, date) { commentList.push({ 'avatar': avatar, 'name': name, 'content': content, 'date': date }); var tr = document.createElement('tr'); tr.innerHTML = '' + commentList.length + '' + name + '' + content + '' + date.toLocaleString() + ''; document.getElementById('configCommentList').append(tr); } //删除(最后一条)评论 function removeComment() { if (commentList.length) { commentList.pop(); document.getElementById('configCommentList').removeChild(document.getElementById('configCommentList').lastChild); } } //替换表情文字和换行符为对应的HTML标签 function emoticonReplace(text) { text = text.replace(/\r\n/g, '
').replace(/\n/g, '
'); for (var i = 0; i < emoticon.length; i++) { text = text.replace(new RegExp(emoticon[i].name, 'g'), ''); } return text; } //设置界面显示 document.getElementById('configTypeText').onclick = function () { document.getElementById('configWebsite').style.display = 'none'; document.getElementById('configSingleImage').style.display = 'none'; document.getElementById('configMultiImage').style.display = 'none'; document.getElementById('article').style.display = 'none'; document.getElementById('singleImage').style.display = 'none'; document.getElementById('multiImage').style.display = 'none'; } document.getElementById('configTypeWebsite').onclick = function () { document.getElementById('configWebsite').style.display = 'block'; document.getElementById('configSingleImage').style.display = 'none'; document.getElementById('configMultiImage').style.display = 'none'; document.getElementById('article').style.display = 'flex'; document.getElementById('singleImage').style.display = 'none'; document.getElementById('multiImage').style.display = 'none'; } document.getElementById('configTypeSingleImage').onclick = function () { document.getElementById('configWebsite').style.display = 'none'; document.getElementById('configSingleImage').style.display = 'block'; document.getElementById('configMultiImage').style.display = 'none'; document.getElementById('article').style.display = 'none'; document.getElementById('singleImage').style.display = 'block'; document.getElementById('multiImage').style.display = 'none'; } document.getElementById('configTypeMultiImage').onclick = function () { document.getElementById('configWebsite').style.display = 'none'; document.getElementById('configSingleImage').style.display = 'none'; document.getElementById('configMultiImage').style.display = 'block'; document.getElementById('article').style.display = 'none'; document.getElementById('singleImage').style.display = 'none'; document.getElementById('multiImage').style.display = 'block'; } //设初始值 var date = new Date(); document.getElementById('configScreenshotDate').valueAsDate = date; document.getElementById('configScreenshotTimeHour').value = date.getHours(); document.getElementById('configScreenshotTimeMinute').value = date.getMinutes(); document.getElementById('configPostDate').valueAsDate = date; document.getElementById('configPostTimeHour').value = date.getHours(); document.getElementById('configPostTimeMinute').value = date.getMinutes(); document.getElementById('configCommentDate').valueAsDate = date; document.getElementById('configCommentTimeHour').value = date.getHours(); document.getElementById('configCommentTimeMinute').value = date.getMinutes(); document.getElementById('configLike').value = Math.floor(20 * Math.random()); //检验数值是否合法 document.getElementById('configPostTimeHour').addEventListener('input', function () { if (document.getElementById('configPostTimeHour').value > 23) { document.getElementById('configPostTimeHour').value = 23; } else if (document.getElementById('configPostTimeHour').value < 0) { document.getElementById('configPostTimeHour').value = 0; } }) document.getElementById('configPostTimeMinute').addEventListener('input', function () { if (document.getElementById('configPostTimeMinute').value > 59) { document.getElementById('configPostTimeMinute').value = 59; } else if (document.getElementById('configPostTimeMinute').value < 0) { document.getElementById('configPostTimeMinute').value = 0; } }) document.getElementById('configScreenshotTimeHour').addEventListener('input', function () { if (document.getElementById('configScreenshotTimeHour').value > 23) { document.getElementById('configScreenshotTimeHour').value = 23; } else if (document.getElementById('configScreenshotTimeHour').value < 0) { document.getElementById('configScreenshotTimeHour').value = 0; } }) document.getElementById('configScreenshotTimeMinute').addEventListener('input', function () { if (document.getElementById('configScreenshotTimeMinute').value > 59) { document.getElementById('configScreenshotTimeMinute').value = 59; } else if (document.getElementById('configScreenshotTimeMinute').value < 0) { document.getElementById('configScreenshotTimeMinute').value = 0; } }) document.getElementById('configCommentTimeHour').addEventListener('input', function () { if (document.getElementById('configCommentTimeHour').value > 23) { document.getElementById('configCommentTimeHour').value = 23; } else if (document.getElementById('configCommentTimeHour').value < 0) { document.getElementById('configCommentTimeHour').value = 0; } }) document.getElementById('configCommentTimeMinute').addEventListener('input', function () { if (document.getElementById('configCommentTimeMinute').value > 59) { document.getElementById('configCommentTimeMinute').value = 59; } else if (document.getElementById('configCommentTimeMinute').value < 0) { document.getElementById('configCommentTimeMinute').value = 0; } }) document.getElementById('configLike').addEventListener('input', function () { if (document.getElementById('configLike').value < 0) { document.getElementById('configLike').value = 0; } }) //上传图片 document.getElementById('configAvatar').addEventListener('change', function () { avatarFile = this.files[0]; document.getElementById('avatar').style.backgroundImage = 'url(\"' + URL.createObjectURL(avatarFile) + '\")'; }); document.getElementById('configArticleIcon').addEventListener('change', function () { document.getElementById('articleIcon').style.backgroundImage = 'url(\"' + URL.createObjectURL(this.files[0]) + '\")'; }); document.getElementById('configSetSingleImage').addEventListener('change', function () { document.getElementById('image').src = URL.createObjectURL(this.files[0]); }); for (var i = 1; i <= 9; i++) { !function (i) { document.getElementById('configSetMultiImage' + i).addEventListener('change', function () { document.getElementById('image' + i).style.backgroundImage = 'url(\"' + URL.createObjectURL(this.files[0]) + '\")'; }); }(i); } document.getElementById('generate').addEventListener('click', function () { // 是否使用7.0以上版本白色界面? var useWhiteUI = document.getElementById('configUIWhite').checked; if (useWhiteUI) { document.getElementById('fakeWechatMoment').classList.add('whiteUI'); document.querySelector('#header > img').src = 'mdicons/black_icons/back.svg'; document.querySelector('.content > img').src = 'mdicons/black_icons/comment.svg'; document.querySelector('#footer > img').src = 'mdicons/black_icons/emoticon.svg'; } else { document.getElementById('fakeWechatMoment').classList.remove('whiteUI'); document.querySelector('#header > img').src = 'mdicons/white_icons/back.svg'; document.querySelector('.content > img').src = 'mdicons/white_icons/comment.svg'; document.querySelector('#footer > img').src = 'mdicons/white_icons/emoticon.svg'; } //设置生成的图片上的各种属性 document.getElementById('name').innerText = document.getElementById('configName').value; document.getElementById('text').innerText = document.getElementById('configText').value; document.getElementById('articleTitle').innerText = document.getElementById('configArticleTitle').value; if (document.getElementById('configLocation').value == '') { document.getElementById('location').style.display = 'none'; } else { document.getElementById('location').style.display = 'inline'; document.getElementById('location').innerText = document.getElementById('configLocation').value; } //表情替换 document.getElementById('text').innerHTML = emoticonReplace(document.getElementById('text').innerText); //九宫格模式设定 if (document.getElementById('configTypeMultiImage').checked) { for (var i = 1; i <= 9; i++) { document.getElementById('image' + i).style.display = 'inline-block'; } var multiImageCount = 0; for (multiImageCount = 9; multiImageCount >= 1; multiImageCount--) { if (document.getElementById('image' + multiImageCount).style.backgroundImage != '') { break; } } //四张图的修正 if (multiImageCount == 4) { document.getElementById('image5').style.backgroundImage = document.getElementById('image4').style.backgroundImage; document.getElementById('image4').style.backgroundImage = document.getElementById('image3').style.backgroundImage; document.getElementById('image3').style.backgroundImage = ''; multiImageCount = 5; } for (var i = multiImageCount + 1; i <= 9; i++) { document.getElementById('image' + i).style.display = 'none'; } } //设置顶栏图标 var iconWifi = [4, 4, 4, 4, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 0]; var iconSignal = [4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 0]; var iconBattery = [20, 30, 50, 60, 80, 90, 'full']; if (document.getElementById('configTopBarStatusIcons').checked) { document.getElementById('topBarIconWifi').src = 'mdicons/' + (useWhiteUI ? 'black_icons' : 'white_icons') + '/ic_signal_wifi_' + iconWifi[Math.floor(Math.random() * iconWifi.length)] + '_bar_48px.svg'; document.getElementById('topBarIconSignal').src = 'mdicons/' + (useWhiteUI ? 'black_icons' : 'white_icons') + '/ic_signal_cellular_' + iconWifi[Math.floor(Math.random() * iconSignal.length)] + '_bar_48px.svg'; document.getElementById('topBarIconBattery').src = 'mdicons/' + (useWhiteUI ? 'black_icons' : 'white_icons') + '/ic_battery_' + ((Math.random() > 0.75) ? 'charging_' : '') + iconBattery[Math.floor(Math.random() * iconBattery.length)] + '_48px.svg'; } else { document.getElementById('topBarIconWifi').src = 'mdicons/' + (useWhiteUI ? 'black_icons' : 'white_icons') + '/ic_signal_wifi_4_bar_48px.svg'; document.getElementById('topBarIconSignal').src = 'mdicons/' + (useWhiteUI ? 'black_icons' : 'white_icons') + '/ic_signal_cellular_4_bar_48px.svg'; document.getElementById('topBarIconBattery').src = 'mdicons/' + (useWhiteUI ? 'black_icons' : 'white_icons') + '/ic_battery_full_48px.svg'; } var iconApp = [['qq', .5], ['wechat', .5], ['cloudmusic', .25], ['coolapk', .15], ['tieba', .15], ['acfun', .15]]; iconApp.sort(function () { return (Math.random() > .5) ? 1 : -1 }); document.getElementById('topBarAppIcons').innerHTML = ''; if (document.getElementById('configTopBarAppIcons').checked) { for (var i = 0; i < iconApp.length; i++) { if (Math.random() < iconApp[i][1]) { document.getElementById('topBarAppIcons').innerHTML += ''; } } } //设置时间 var configPostDate = document.getElementById('configPostDate').valueAsDate; configPostDate.setHours(document.getElementById('configPostTimeHour').value); configPostDate.setMinutes(document.getElementById('configPostTimeMinute').value); var configScreenshotDate = document.getElementById('configScreenshotDate').valueAsDate; configScreenshotDate.setHours(document.getElementById('configScreenshotTimeHour').value); configScreenshotDate.setMinutes(document.getElementById('configScreenshotTimeMinute').value); document.getElementById('time').innerText = getTimeString(configScreenshotDate, configPostDate); document.getElementById('topBarTime').innerText = ((document.getElementById('configScreenshotTimeHour').value < 10) ? ('0' + document.getElementById('configScreenshotTimeHour').value) : document.getElementById('configScreenshotTimeHour').value) + ':' + ((document.getElementById('configScreenshotTimeMinute').value < 10) ? ('0' + document.getElementById('configScreenshotTimeMinute').value) : document.getElementById('configScreenshotTimeMinute').value); if (document.getElementById('configApp') != '') { document.getElementById('time').innerText += ' ' + document.getElementById('configApp').value; } //加入点赞头像 var avatar = document.getElementsByClassName('likeAvatar'); var avatarSource = avatarURL.concat(); var avatarUsedIndex = 0; document.getElementById('likeAvatarList').innerHTML = ''; for (var i = 0; i < document.getElementById('configLike').value; i++) { if (avatarSource.length <= 0) { avatarSource = avatarURL.concat(); } avatarUsedIndex = Math.floor(Math.random() * avatarSource.length); var div = document.createElement('div'); div.setAttribute('class', 'likeAvatar squareImage'); div.setAttribute('style', 'background-image:url(\"' + avatarSource[avatarUsedIndex] + '\")'); document.getElementById('likeAvatarList').appendChild(div); avatarSource.splice(avatarUsedIndex, 1); } //加入评论区 document.getElementById('commentList').innerHTML = ''; if (document.getElementById('configShowComment').checked && commentList.length) { document.getElementById('comment').style.display = 'block'; for (var i = 0; i < commentList.length; i++) { document.getElementById('commentList').innerHTML += '' + '
' + '
' + '
' + '' + commentList[i].name + '' + '' + getTimeString(configScreenshotDate, commentList[i].date) + '' + '
' + emoticonReplace(commentList[i].content) + '
' + '
' + '
'; } } else { document.getElementById('comment').style.display = 'none'; } //显示用于生成图片的div var height = Number(document.getElementById('configHeight').value); document.getElementById('fakeWechatMoment').style.display = 'block'; document.getElementById('fakeWechatMoment').style.width = '1080px'; document.getElementById('fakeWechatMoment').style.height = ''; document.getElementById('fakeWechatMoment').style.height = ((window.getComputedStyle(document.getElementById('fakeWechatMoment')).height.replace('px', '') > height) ? window.getComputedStyle(document.getElementById('fakeWechatMoment')).height.replace('px', '') : height) + 'px'; //点赞数为0时隐藏点赞区 if (document.getElementById('configLike').value <= 0) { document.getElementById('triangle').style.display = 'none'; document.getElementById('like').style.display = 'none'; } else { document.getElementById('triangle').style.display = 'block'; document.getElementById('like').style.display = 'block'; } //修正底部位置 var offset = Number(window.getComputedStyle(document.getElementById('topBar')).height.replace('px', '')) + Number(window.getComputedStyle(document.getElementById('header')).height.replace('px', '')) + Number(window.getComputedStyle(document.getElementById('main')).height.replace('px', '')); document.getElementById('footer').style.bottom = ((offset < height - Number(window.getComputedStyle(document.getElementById('footer')).height.replace('px', ''))) ? (-height + Number(window.getComputedStyle(document.getElementById('footer')).height.replace('px', '')) + offset) : 0) + 'px'; //按钮上的提示 document.getElementById('generate').setAttribute('disabled', ''); document.getElementById('generate').innerText = '生成中...'; html2canvas(document.getElementById('fakeWechatMoment'), { useCORS: true, scale: 1, }).then(function (canvas) { var dURL = canvas.toDataURL(); document.getElementById('generated').src = dURL; document.getElementById('save').setAttribute('href', dURL); document.getElementById('save').setAttribute('download', (+new Date) + '.png'); (new mdui.Dialog(document.getElementById('generatedPopup'))).open(); // 保存配置 var config = { name: document.getElementById('configName').value, text: document.getElementById('configText').value, location: document.getElementById('configLocation').value, app: document.getElementById('configApp').value, height: parseInt(document.getElementById('configHeight').value), uiWhite: document.getElementById('configUIWhite').checked, appIcon: document.getElementById('configTopBarAppIcons').checked, statusIcon: document.getElementById('configTopBarStatusIcons').checked, }; localStorage.setItem('config', JSON.stringify(config)); if (avatarFile) { var reader = new FileReader; reader.readAsDataURL(avatarFile); reader.onload = function () { localStorage.setItem('avatar', this.result); }; } }).catch(function (error) { mdui.alert('' + '
' + '

错误信息:

' + '
' + error + '
' + '

你可以通过 Issue 向作者反馈 BUG~

' + '
', '生成失败' ); }).finally(function () { // document.getElementById('fakeWechatMoment').style.display = 'none'; document.getElementById('generate').removeAttribute('disabled'); document.getElementById('generate').innerText = '生成'; }); });