generated at
@基素 2021
from @基素
大きいので切り出した基素

s/現弾/現段階
ありがとうございます基素

s/保王的/法的
ありがとうございます基素

センターの倫理経済しかわかりませんが、全部年号ではなく出来事の順番を答えるよう出題されてますねtakker
問題を作成してる大学教授陣も、多分流れを知っていることを重視しているのだと思います
良さそう基素
中学高校で歴史をやった時に年号を記憶しまくった覚えがあります
from 大学入試センター試験 平成31年度本試験 政治経済 p.89

s/過大/課題
ありがとうございます基素

GM_xmlhttpRequestで突破できることを確認しましたtakker
すごい基素
pixiv開発者はこういう網の目をかいくぐることをされたくないと思うので、余り表に出さないほうがいいのかもしれませんが、ひとまず突破できることを示すコードを載せておきます
pixiv開発者の意図はセキュリティ目的だと思うので、多分保存対策は意図されていないと思います基素
なるほ。保存対策目的じゃなければ問題なさそうですねtakker
右クリックで保存できますもんね基素
そう言えば「名前を付けて画像を保存」は普通にできてたtakker
そもそも保存対策だったらEagleがアウトになる
Gyazoは画像保存時に再リクエストして、それがサーバー側のセキュリティ向けのレスポンスによってブラウザがブロックしてこけてる、みたいな感じでした基素
Chrome拡張が使ってるAPI(upload.gyazo.com/api/upload/easy_auth)がコケているっぽい?ですかねtakker
pixivへのGETがこけていた記憶があります基素
あ、じゃあi.pximg.netへのアクセスでこけてますねtakker
適切なheader@基素#617d63891280f000007fd6be を付けないとi.pximg.netはアクセスできないようです
なるほど基素
pixiv以外もこのheaderをつけるようになったら問題が表面化しそう基素
と書いてたけど、適切なheaderをみると原因はrefererの設定が漏れることだ毛なのかな?
user.js
// ==UserScript== // @name pixiv-proxy // @namespace https://www.pixiv.net // @version 0.1.1 // @description pixivのデータ取得テスト // @author takker // @match https://www.pixiv.net/* // @connect i.pximg.net // @connect upload.gyazo.com // @grant GM_xmlhttpRequest // @license MIT // @copyright Copyright (c) 2021 takker // ==/UserScript== "use strict" function fetchImage(url) { return new Promise((resolve, reject) => GM_xmlhttpRequest({ method: "GET", url, headers: { Referer: "https://www.pixiv.net" }, onload: ({response}) => resolve(response), onerror: (e) => reject(e), withCredentials: true, responseType: 'blob', })); } async function uploadToGyazo(image, { accessToken, title, // optional refererURL, // optional description, // optional created, // optional }) { const formData = new FormData(); formData.append('imagedata', image); formData.append('access_token', accessToken); if (refererURL || location?.href) formData.append('referer_url', refererURL ?? location.href); if (title) formData.append('title', title); if (description) formData.append('desc', description); if (created) formData.append('created_at', created); const json = await new Promise((resolve, reject) => GM_xmlhttpRequest({ method: "POST", url: "https://upload.gyazo.com/api/upload", data: formData, onload: ({response}) => resolve(response), onerror: (e) => reject(e), withCredentials: true, responseType: "json", })); return json; } unsafeWindow.fetchImage = fetchImage; unsafeWindow.uploadToGyazo = uploadToGyazo;
上記のコードをTamperMonkeyにinstallした後、開発コンソールで以下を実行して下さい
IMAGE_URL : pixivから取得したいイラストのURL
i.pximg.net で始まるURL
YOUR_ACCESS_TOKEN : Gyazoのaccess token
ここから取得できます
js
(async () => { const blob = await fetchImage("IMAGE_URL"); const {permalink_url} = await uploadToGyazo(blob, { accessToken: "YOUR_ACCESS_TOKEN", }); window.open(permalink_url); })();
右クリックメニューでGyazoることも、/mactkg-pub/Scrapbox形式でURL情報をコピーするTampermonkeyスクリプトをベースにちゃんとscriptを組めば実現できそうです
TamperMonkeyの右クリックメニューでは無理でした
クリックした画像データを取得する方法が存在しない
web browser拡張機能として別途作るしかなさそうです
ありがとうございます基素
GyazoがGETで取り直してるのは、なにか理由があるのかな?基素
画像保存時の再リクエストのことでしたら、 <img> タグから画像データを取り出す方法がないからでしょうtakker
なるほど。取れないんですね基素
2022-01-22 09:52:48 できちゃったtakker
すごい基素
/motoso/pixiv-to-gyazo使ってみた
YOUR_ACCESS_TOKEN にGyazoのaccess tokenを入れてください
画像を右クリックすると、Gyazoに送信してURLをクリップボードに貼り付けます
どうやらcontextmenuイベントhttps://developer.mozilla.org/ja/docs/Web/API/Element/contextmenu_event だけなら拡張機能なしで取得できたようです
pixiv-to-gyazo.js
// ==UserScript== // @name pixiv-to-gyazo // @namespace https://www.pixiv.net // @version 0.1.0 // @description pixivの画像をGyazoに送る // @author takker // @match https://www.pixiv.net/* // @connect i.pximg.net // @connect upload.gyazo.com // @grant GM_xmlhttpRequest // @license MIT // @copyright Copyright (c) 2022 takker // ==/UserScript== const YOUR_ACCESS_TOKEN = "YOUR_ACCESS_TOKEN"; function fetchImage(url) { return new Promise((resolve, reject) => GM_xmlhttpRequest({ method: "GET", url, headers: { Referer: "https://www.pixiv.net" }, onload: ({ response }) => resolve(response), onerror: (e) => reject(e), withCredentials: true, responseType: "blob", }) ); } async function uploadToGyazo(image, { accessToken, title, // optional refererURL, // optional description, // optional created, // optional }) { const formData = new FormData(); formData.append("imagedata", image); formData.append("access_token", accessToken); if (refererURL || location?.href) { formData.append("referer_url", refererURL ?? location.href); } if (title) formData.append("title", title); if (description) formData.append("desc", description); if (created) formData.append("created_at", created); const json = await new Promise((resolve, reject) => GM_xmlhttpRequest({ method: "POST", url: "https://upload.gyazo.com/api/upload", data: formData, onload: ({ response }) => resolve(response), onerror: (e) => reject(e), withCredentials: true, responseType: "json", }) ); return json; } function makeMesageWindow(gyazoURL) { const div = document.createElement("div"); div.style.display = "block"; div.style.boxSizing = "border-box"; div.style.position = "fixed"; div.style.top = "0"; div.style.right = "0"; div.style.zIndex = "2147483647"; div.style.backgroundColor = "#e8e8e8"; div.style.color = "#4d4d4d"; div.style.border = "1px solid #ccc"; div.style.borderTop = "none"; const text = document.createElement("div"); text.textContent = "Copied to Clipboard."; const img = document.createElement("img"); img.src = `${gyazoURL.toString()}/max_size/1000`; img.style.maxWidth = "20vw"; img.style.padding = "5px"; div.append(text); div.append(img); return div; } addEventListener("contextmenu", async (e) => { const img = e.target; if (!(img instanceof HTMLImageElement)) return; const url = new URL(img.src); if (url.hostname !== "i.pximg.net") return; e.preventDefault(); e.stopPropagation(); const blob = await fetchImage(url.href); try { const { permalink_url } = await uploadToGyazo(blob, { accessToken: YOUR_ACCESS_TOKEN, title: document.title, }); await navigator.clipboard.writeText(permalink_url); const div = makeMesageWindow(permalink_url); document.body.append(div); setTimeout(() => div.remove(), 2000); } catch(e) { console.error(e); alert(`Failed to get the image:\n${e.name} ${e.message}`); } });

アニメ的なデフォルメの話からはズレますが、↓の作例はかなり2Dに馴染んでいるなーと思いましたimo
歪みは無いですがリグ入れ・レンダリングはかなり凝っていると思います
ありがとうございます基素
productionの事例ではないですが多分上のツイートを見てblender使いの方が揺らしてましたw
なんと!wimo

この出典、おそらく数学ガールシリーズからかなと思いました
数学ガール内だと《例示は理解の試金石》となっています
数学ガールでもあるのですが、もっと以前に数学書で見たんですよね。数学者が書いているテキストだったので意外におもったのをおぼえています 基素

夜が多分誤字だと思うのですが、訂正方法がちょっとわからないです
「世」が正解でした基素𝙩𝙝𝙖𝙣𝙠 𝙮𝙤𝙪...
どもです(え、なにこの字体。文字装飾記法じゃない?)takker
Unicodeであるらしいです。Twitterとかでたまにみます基素
へえ〜なるほどtakker

s/焼失/消失
どもども基素

リンク切れです
ありがとうございます!差し替えました基素
https://web.archive.org/ のブラウザ拡張を入れてるのでそっちをみてしまいました
web.archive.orgにもありましたtakker
「見てしまいました」→「わざわざ魚拓リンクをはってもらっていたのに気づかず、自分で見つけて差し替えてしまいました」という意味でした基素
あーなるほどwtakker
「ブラウザ拡張で見つからなかったのでそのままにしていた」と誤読してました


バスピッターというアナログの止水装置があるみたいです
蛇口の形状があわない(と思っている)んですよね基素

ありがとうございます!基素