Twemoji
絵文字の画像の取得方法
手動の場合
自動の場合
例
code:sh
code:test.js
import {codemap} from '../Slack絵文字コードの対応表/codemap.js';
import {throttle} from '../promise-parallel-throttle/script.js';
const emojis = Object.keys(codemap).map(key => codemapkey); let counter = 1;
const notFounds = [];
const json = await throttle(emojis.map(emoji => async () => {
// emojiを構成するUTF-16 surrogate pairsを取得する
/*const list = [];
for(let i = 0;;i++){
const code = emoji.charCodeAt(i);
if (isNaN(code)) break;
list.push(code.toString(16));
}*/
const filename = twemoji.convert.toCodePoint(emoji);
const url = https://cdnjs.cloudflare.com/ajax/libs/twemoji/13.1.0/svg/${filename}.svg;
const index = counter++;
console.log([${index}/${emojis.length}] Fetch ${url});
try {
const res = await fetch(url);
if (!res.ok) throw Error(status: ${res.status});
console.log([${index}/${emojis.length}] ${emoji} is available. code: ${filename});
return {emoji, url, svg: await res.text()};
} catch (e) {
// -fe0fを削って再挑戦
const newFilename = filename.replaceAll('-fe0f', '');
const newURL = url.replaceAll('-fe0f', '');
const res = await fetch(newURL);
if (!res.ok) {
console.error([${index}/${emojis.length}] ${emoji} is not found. code: ${newFilename});
notFounds.push({emoji, filename: newFilename});
return;
}
console.log([${index}/${emojis.length}] ${emoji} is available. code: ${newFilename});
return {emoji, url: newURL, svg: await res.text()};
}
}), {maxInProgress: 10});
console.log(Finished. success: ${emojis.length - notFounds.length}, failed: ${notFounds.length});
console.log('Faild: ', notFounds);
2021-07-08 13:00:51 これでも404になる?
e.g.
2021-07-08 13:27:00 twemojiのversionが古かった
versionを上げてもいっかいチャレンジ
-fe0fを削るとうまくいく
2021-07-08 13:40:28 -fe0fを削ったら1つ以外うまく行った
うまく行かなかったのはⓜ️
\u24c2は存在するが\u24dcは存在しない
じゃあそっちを使えばいいか
うまく行かなかったコード
これだと一部の絵文字のURLを正しく生成できない
twemojiのファイル名の生成方法がわからなかった
code:js
(async () => {
console.log(getURL('0️⃣'));
})();
code:script.js
export function getURL(emoji) {
// emojiを構成するcode pointを取得する
const list = [];
for(let i = 0;;i++){
const code = emoji.codePointAt(i);
if (isNaN(code)) break;
// バリエーションセレクター16を飛ばす
if (code === 65039) continue;
//サロゲートペアを飛ばす
if (55296 <= code && code <= 57344) continue;
list.push(code.toString(16));
}
return https://cdnjs.cloudflare.com/ajax/libs/twemoji/13.0.2/svg/${list.join('-')}.svg;
}