// Open Slack in a browser, then copy-paste this into the console (F12) // It will scroll through the emoji picker 4 times (once for each skin tone), // and finally download the full list of emoji shortcodes. // You can parse the actual unicode code points out of the image file names. var emojis={} function selectSkinTone(value) { let skin_tone_toggle = document.querySelector('.p-emoji_picker_skintone__toggle_btn'); skin_tone_toggle.click() simulateMouseClick('[data-qa="emoji_skintone_option_' + value + '"]'); } function simulateMouseClick(selector) { let targetNode = document.querySelector(selector); function triggerMouseEvent(targetNode, eventType) { var clickEvent = document.createEvent('MouseEvents'); clickEvent.initEvent(eventType, true, true); targetNode.dispatchEvent(clickEvent); } ["mouseover", "mousedown", "mouseup", "click"].forEach(function(eventType) { triggerMouseEvent(targetNode, eventType); }); } function isDone () { return (picker_list.offsetHeight + picker_list.scrollTop >= picker_list.scrollHeight); } function collectMore() { document.querySelectorAll('#emoji-picker-list *[data-name]').forEach( function(button) { if (button.children[0]) { emojis[button.getAttribute('data-name')] = button.children[0].getAttribute("src"); } } ) }; function download(filename, text) { var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } var skinTone = 1; simulateMouseClick('[data-qa="texty_emoji_button"]'); var picker_list = document.getElementById('emoji-picker-list'); picker_list.scrollTo(0, 0); selectSkinTone(skinTone); (function myLoop() { collectMore(); if (isDone()) { if (skinTone === 4) { download("emoji.json", JSON.stringify(emojis, Object.keys(emojis).sort(), 2)) } else { skinTone += 1; selectSkinTone(skinTone); picker_list.scrollTo(0, 0); setTimeout(myLoop, 200); } } else { picker_list.scrollBy(0, 60); setTimeout(myLoop, 200); } })();