A full thumbnail archive of Nico Nico Shunga is done by yzqzss
at saveweb.org.
The full image archive is also finished, but yet to be published. It should be less than 100GB and will be published to the Internet Archive just like the thumbnail. Saveweb is also saving all the webpages for Nico Nico Shunga.
RainSlide (me) has done a small 例のアレ-related tag archive for Nico Nico Shunga.
Other than images, all the metadata (title, author, description, datetime, tags, comments) are kept.
例のアレ-related tags:
"クッキー☆", "BB素材", "例のアレ", "真夏の夜の淫夢", "野獣先輩", "ガチムチ", "必須アモト酸"
Touhou Project related tags are skipped since:
Nico Nico Shunga - Thumbnails (WARC format, 9.1G) archived by saveweb.org:
https://archive.org/details/CHUNGA-THUMB-20250121180740887-crawling
WARC Viewer: https://replayweb.page/ (GitHub repo: https://github.com/webrecorder/replayweb.page)
クッキー☆春画 (2551p) archived by ホラー淫夢WIKI:
https://45.gigafile.nu/0124-l6270cae2b818eac13722e52da8260727
see: https://x.com/horrorinm_WIKI/status/1880909639187050879
Message him on Twitter to get the password. ホラー淫夢WIKI is working on other archives and he might be busy. Since there was over 1000 password request, if you know some friend who has the password, you might want to ask your friend instead.
gallery-dl has a working support on Nico Nico Seiga:
config Nico Nico account login in gallery-dl.conf
:
{
"extractor": {
"seiga": {
"username": "username",
"password": "password",
"cookies" : {
}
}
}
}
Then download image(s) with:
gallery-dl --proxy <japanese proxy> --write-metadata --sleep 4.1 -f {user['id']!s:R?target=shunga//}-im{image_id}.{extension} -I links.txt
Older code from other project (might not work):
To get a more stable image list, uninterrupted by new image posting, use the post date old to new sorting (投稿の古い順
) or URL with sort=image_created_a
. Sadly deleting image will still interrupt the list, so be prepared for this.
Following source code are JavaScript. As of now, all the URL are accessible via HTTP GET.
https://seiga.nicovideo.jp/shunga/list?page=2&sort=image_created_a
[...document.querySelectorAll(".illust_pict_all > .illust_list_img")]
.map(a => a.href).join("\n");
[...document.querySelectorAll(".illust_pict_all > .illust_list_img")].map(div => {
const link = div.querySelector(":scope .center_img_inner");
if (!link) {
console.error("Element .center_img_inner not found", location.href, div);
return null;
}
const url = link.href;
const image = {
id: url.split("/").at(-1),
url,
};
const info = div.querySelector(":scope .counter_info");
if (!info) {
console.warn("Element .counter_info not found", location.href, div);
image.views_comments_favs = null;
} else {
image.views_comments_favs = info.textContent;
}
return image;
});
https://seiga.nicovideo.jp/tag/東方?target=shunga&sort=image_created_a
[...document.querySelectorAll(".item_list > .list_item > a:only-child")]
.map(a => a.href).join("\n");
[...document.querySelectorAll(".item_list > .list_item > a:only-child")].map(a => {
const url = a.href;
const image = {
id: url.split("/").at(-1),
url,
};
const info = a.querySelector(":scope > .illust_count");
if (!info) {
console.warn("Element .counter_info not found", location.href, div);
image.views_comments_favs_html = null;
} else {
image.views_comments_favs_html = info.innerHTML.replace(/\s{2,}/g, "");
}
return image;
});
https://seiga.nicovideo.jp/search/東方?target=shunga&sort=image_created_a
[...document.querySelectorAll(".illust_pict_all > .illust_list_img")]
.map(a => a.href).join("\n");
[...document.querySelectorAll(".illust_pict_all > .illust_list_img")].map(div => {
const link = div.querySelector(":scope .center_img_inner");
if (!link) {
console.error("Element .center_img_inner not found", location.href, div);
return null;
}
const url = link.href.replace(/\?track=seiga_illust_keyword$/, "");
const image = {
id: url.split("/").at(-1),
url,
};
const info = div.querySelector(":scope .counter_info");
if (!info) {
console.warn("Element .counter_info not found", location.href, div);
image.views_comments_favs = null;
} else {
image.views_comments_favs = info.textContent;
}
return image;
});
Notations:
image id: imXXXX
/ XXXX
; base 16 data (0~f): ffffffff
; number (0~9): 00000000
image webpage URL: https://seiga.nicovideo.jp/seiga/imXXXX
Original image URL: https://seiga.nicovideo.jp/image/source/11552118
will be HTTP 302 redirected to a real URL https://lohas.nicoseiga.jp/o/ffffffffffffffffffffffffffffffffffffffff/0000000000/XXXX
can be accessed by: document.getElementById("illust_link").href
get Original image URL and metadata in image webpage:
// everything other than ID can be undefined!
// datetime is skipped since gallery-dl has a good one,
// and it can be problematic to parse here.
const data = {
id: location.pathname.split("/").at(-1),
title: document.querySelector(".im_head_bar .title")?.textContent,
description: document.querySelector(".im_head_bar .discription")?.innerText,
author: document.getElementById("ko_watchlist_header")?.dataset.id,
view: Number.parseInt(
document.querySelector(".illust_count > .view .count_value")?.textContent
),
comment: Number.parseInt(
document.querySelector(".illust_count > .comment .count_value")?.textContent
),
clip: Number.parseInt(
document.querySelector(".illust_count > .clip .count_value")?.textContent
),
};
get author link if needed:
const authorLink =
data.author.length > 0
? `https://seiga.nicovideo.jp/user/illust/${data.author}`
: null;
other metadata can be sourced from following links:
https://lohas.nicoseiga.jp/heatmap?id=XXXX&${ Date.now() }
https://seiga.nicovideo.jp/ajax/illust/tag/list?id=XXXX&_=${ Date.now() }
{
"result": "true",
"target_id": "728449",
"tag_list": [
{ "id": "number as string...",
"name": "Comment text, where non-ascii chars are encoded as \uffff",
"is_locked":true,"is_lockable":true,"is_category":false},
{"id":"36","name":"\u6771\u65b9","is_locked":true,"is_lockable":true,"is_category":true}
],
"is_owner": false,
"category_tag_id": "0",
"vote_event": [],
"link_target": "shunga"
}
https://seiga.nicovideo.jp/ajax/illust/comment/list?id=XXXX&mode=all&_=${ Date.now() }
{
"result": "true",
"comment_list": [
{
"id": "000000",
"text": "Comment text, where non-ascii chars are encoded as \uffff",
"date": "yy\/MM\/dd hh:mm",
"user": "an anonymous user id for blocking user",
"is_owner": false,
"is_visible": true,
"is_new": false
},
...
]
}