generated at
tweet-card-upload
tweet-cardGyazoアップロード版
☣️このUserScriptを利用するにはScrapboxCSPを破壊する必要があります☣️
他のタイプはtweet2imageを埋め込むUserScriptにあります
破壊不要になりました!Tampermonkey等外部UserScriptを導入できる必要があります
2回クリックするの普通に面倒なので、tweet2image-uploadを用いることを強くお勧めします

UserScript: tweet2image-proxy

usage.js
import 'https://scrapbox.io/api/code/ci7lus/tweet-card-upload/script.js';

script.js
scrapbox.PopupMenu.addButton({ title: "tweet-card (upload)", onClick: (text) => { if (!window.get_tweet_card) { alert("UserScript is not installed?") return } if (!window.tweet_card_upload) { window.tweet_card_upload = new Map(); } const gyazoClientId = "e2bd725244baa768eb100126fa2cd85910445778a25ba7ef1328608750b070d5"; const tweetcard = "https://tweet2image.vercel.app"; const m = text.match(/twitter.com\/(.+)\/status\/(\d+)/); if (!m) return text; if (window.tweet_card_upload.has(m[2])) { return window.tweet_card_upload.get(m[2]); } else { (async () => { let imageData; try { const req = await window.get_tweet_card(`${tweetcard}/${m[2]}.jpg?lang=ja&tz=9`); if (req.status !== 200) { alert("Image fetch failed(!=200)"); return; } imageData = await new Promise((res, rej) => { const reader = new FileReader(); reader.onerror = rej; reader.onload = () => { res(reader.result); }; reader.readAsDataURL(req.response); }); } catch (e) { console.error(e); alert("Image fetch failed!") return; } const tweetUrl = `https://twitter.com/${m[1]}/status/${m[2]}` // upload to gyazo try { const formData = new FormData(); formData.append("client_id", gyazoClientId); formData.append("referer_url", tweetUrl); formData.append("image_url", imageData); const easyAuth = await fetch( `https://upload.gyazo.com/api/upload/easy_auth`, { method: "POST", mode: "cors", credentials: "include", body: formData, } ); const uploadResult = await easyAuth.json(); const getImage = await fetch(uploadResult.get_image_url, { mode: "cors", credentials: "include", }); window.tweet_card_upload.set( m[2], `[${getImage.url} ${tweetUrl}]` ); alert(`Upload done: ${getImage.url}`); } catch (e) { console.error(e); return; } })(); return text; } }, });