-
Notifications
You must be signed in to change notification settings - Fork 74
目前仅有“下载目录”、“保存路径”、“自定义掩码”内才可插入掩码。
掩码的书写方式为“%{掩码内容}”,支持\{
→{
、\}
→}
、\\
→\
三个转义符,以便能在掩码内书写函数。
下载时,程序会自动将掩码替换为该掩码对应的内容。
掩码主要使用user
与illust
两个对象(Object),分别储存的是目标用户的信息和目标作品的信息;
以及page
这个数字,表示当前的多图页数/动图帧数(从 0 开始)。
掩码中使用对象的调用方式来获取信息,支持多层调用与数组。
简单给不懂JS的人介绍一下,下面示例代码中大括号
{}
表示一个对象,中括号[]
表示一个数组。访问子对象使用英文句号.
连接子对象的属性名称,访问数组某个元素使用中括号加数组下标[n]
(从 0 开始),可以用数组名.length
返回数组长度,字符串.length
返回字符串长度。
如%{user.user.name}
返回的就是当前目标用户的昵称,%{user.user.profile_image_urls.medium}
返回的是当前目标用户的头像图片地址。
以默认的下载路径做讲解示例:
%{illust.user.id}/%{illust.filename}%{page}.%{illust.extention}
返回的结果为插画的作者id/插画原文件文件名+页数.插画的扩展名
。软件会自动将中间的那层斜杠转换为一层文件夹,所以就成了作者id是一层文件夹,里面是插画源文件的名字(即id加页数)。
如果希望使用作者的昵称、插画的名称来命名,可以使用
%{illust.user.name}/%{illust.title}_p%{page}.%{illust.extention}
如下图
注:
illust.filename
和illust.extention
等不是P站原生返回的,是我自己从原图地址中截取添加的。
illust.filename
是原始文件名去掉张数的部分。illust.extention
是插画源文件的扩展名,因为P站上传多图的扩展名必须一致,因此不需要每页设置不同的扩展名。
-
user.user
是当前目标用户的基本信息 -
user.profile
是用户的个人资料 -
user.workspace
是用户的操作环境资料
{
"user": {
"id": 3896348,
"name": "枫谷剑仙",
"account": "mapaler",
"profile_image_urls": {
"medium": "https://i2.pixiv.net/user-profile/img/2016/04/22/17/52/13/10835493_0604d937120e2b0f68dd87474d05fe71_170.png"
},
"comment": "东方厨,但并不会画",
"is_followed": false
},
"profile": {
"webpage": "http://www.mapaler.com",
"gender": "male",
"birth": "1991-07-10",
"birth_day": "07-10",
"birth_year": 1991,
"region": "China",
"address_id": 48,
"country_code": "CN",
"job": "技术关联",
"job_id": 3,
"total_follow_users": 81,
"total_follower": 13,
"total_mypixiv_users": 5,
"total_illusts": 11,
"total_manga": 0,
"total_novels": 0,
"total_illust_bookmarks_public": 1244,
"background_image_url": "https://source.pixiv.net/common/images/bg/star02.png",
"twitter_account": "",
"twitter_url": null,
"pawoo_url": "https://pawoo.net/oauth_authentications/3896348?provider=pixiv",
"is_premium": false,
"is_using_custom_profile_image": true
},
"profile_publicity": {
"gender": "public",
"region": "public",
"birth_day": "public",
"birth_year": "public",
"job": "public",
"pawoo": true
},
"workspace": {
"pc": "买的",
"monitor": "带的",
"tool": "下的",
"scanner": "坏的",
"tablet": "没的",
"mouse": "淘的",
"printer": "没的",
"desktop": "键盘鼠标显示器",
"music": "osu!或CM东方集合",
"desk": "木的",
"chair": "布的",
"comment": "中国有句话叫做闷声大发财,因此无可奉告。",
"workspace_image_url": "https://i.pximg.net/workspace/img/2016/04/22/18/48/47/3896348_918334803489f5f2664b3050b44eab23.jpg"
}
}
illust 返回当前目标图片的信息。可使用“下载当前作品”功能,在浏览器开发者控制台查看该作品的illust
对象。
需注意illust.user
返回的是该图片的作者,user.user
返回的是目标用户,如果下载的是该用户的作品,那么它们往往是一致的。而如果下载的是该用户收藏其他用户的作品,那么两者就会不同了。
也就是说如果按照画师分类,就使用illust.user
来命名,如果按照收藏者分类,就使用user.user
来命名。
P站作品有三个类型,插画、漫画、动画,区别如下:
illust.type
的值分别为illust
、manga
、ugoira
动图如果获取帧数,会多一个illust.ugoira_metadata
子对象,非动图没有这个子对象。
单图与动画,illust.page_count
为 1,原图地址在illust.meta_single_page.original_image_url
;
而多图的illust.page_count
大于 1,原图地址在illust.meta_pages[0].image_urls.original
。
插画、漫画都可能是单图或多图。
{
"id": 30592809,
"title": "东娘奔月",
"type": "illust",
"image_urls": {
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2012/10/05/18/44/56/30592809_p0_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2012/10/05/18/44/56/30592809_p0_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2012/10/05/18/44/56/30592809_p0_master1200.jpg"
},
"caption": "“东东秋季绘图大赛 灬qiu灬les't go!~”参赛作品",
"restrict": 0, //0:所有人可见,1:仅好友可见,2:仅自己可见
"user": {
"id": 3896348,
"name": "枫谷剑仙",
"account": "mapaler",
"profile_image_urls": {
"medium": "https://i2.pixiv.net/user-profile/img/2016/04/22/17/52/13/10835493_0604d937120e2b0f68dd87474d05fe71_170.png"
},
"is_followed": false
},
"tags": [
{"name": "动漫东东"}, //访问这里需要使用illust.tags[0].name
{"name": "秋季"},
{"name": "东东娘"},
{"name": "鲸鱼"},
{"name": "鼠绘"}
],
"tools": ["Illustrator"],
"create_date": "2012-10-05T18:44:56+09:00",
"page_count": 1,
"width": 6400,
"height": 4000,
"sanity_level": 2, //大多数普通插画为2,R-18和R-18G的为6
"meta_single_page": {
"original_image_url": "https://i2.pixiv.net/img-original/img/2012/10/05/18/44/56/30592809_p0.jpg"
},
"meta_pages": [],
"filename": "30592809_p",
"extention": "jpg",
"total_view": 185,
"total_bookmarks": 0,
"is_bookmarked": false,
"visible": true,
"is_muted": false,
"total_comments": 0
}
{
"id": 56455565,
"title": "步步高学习机9588绘画(2009)",
"type": "illust",
"image_urls": {
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2016/04/21/13/23/34/56455565_p0_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2016/04/21/13/23/34/56455565_p0_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2016/04/21/13/23/34/56455565_p0_master1200.jpg"
},
"caption": "步步高@ibox9588(BBK@ibox9588, a learning machine released in 2006)上画的,虽然是电容屏,但没有渐变色,无法放大,只有单像素线条和油漆桶,比WinXP的画图还难用。<br />按顺序2009年2010年2011年(未完成)各一张。",
"restrict": 0,
"user": {
"id": 3896348,
"name": "枫谷剑仙",
"account": "mapaler",
"profile_image_urls": {
"medium": "https://i2.pixiv.net/user-profile/img/2016/04/22/17/52/13/10835493_0604d937120e2b0f68dd87474d05fe71_170.png"
},
"is_followed": false
},
"tags": [
{"name": "セーラー服"},
{"name": "手機繪"}
],
"tools": [],
"create_date": "2016-04-21T13:23:34+09:00",
"page_count": 3,
"width": 240,
"height": 247,
"sanity_level": 2,
"meta_single_page": {},
"meta_pages": [ //多图每一页的图像信息都在这里
{
"image_urls": {
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2016/04/21/13/23/34/56455565_p0_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2016/04/21/13/23/34/56455565_p0_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2016/04/21/13/23/34/56455565_p0_master1200.jpg",
"original": "https://i2.pixiv.net/img-original/img/2016/04/21/13/23/34/56455565_p0.png"
}
},
{
"image_urls": {
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2016/04/21/13/23/34/56455565_p1_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2016/04/21/13/23/34/56455565_p1_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2016/04/21/13/23/34/56455565_p1_master1200.jpg",
"original": "https://i2.pixiv.net/img-original/img/2016/04/21/13/23/34/56455565_p1.png"
}
},
{
"image_urls": {
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2016/04/21/13/23/34/56455565_p2_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2016/04/21/13/23/34/56455565_p2_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2016/04/21/13/23/34/56455565_p2_master1200.jpg",
"original": "https://i2.pixiv.net/img-original/img/2016/04/21/13/23/34/56455565_p2.png"
}
}
],
"filename": "56455565_p",
"extention": "png",
"total_view": 124,
"total_bookmarks": 0,
"is_bookmarked": false,
"visible": true,
"is_muted": false,
"total_comments": 1
}
动图是不会反回所有的原图信息的,所以PUBD下载时,通过第一张原图地址修改帧数,来获取后面的图片的原图路径。
{
"id": 49709638,
"title": "东娘厚郁稲 - 动态",
"type": "ugoira",
"image_urls": {
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2015/04/07/03/32/03/49709638_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2015/04/07/03/32/03/49709638_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2015/04/07/03/32/03/49709638_master1200.jpg"
},
"caption": "电波洗脑,视频地址是 <a href=\"http://www.bilibili.tv/video/av936752\" target=\"_blank\">http://www.bilibili.tv/video/av936752</a>",
"restrict": 0,
"user": {
"id": 3896348,
"name": "枫谷剑仙",
"account": "mapaler",
"profile_image_urls": {
"medium": "https://i2.pixiv.net/user-profile/img/2016/04/22/17/52/13/10835493_0604d937120e2b0f68dd87474d05fe71_170.png"
},
"is_followed": false
},
"tags": [
{"name": "うごイラ"},
{"name": "动漫东东"},
{"name": "东东娘"},
{"name": "鼠绘"}
],
"tools": ["Fireworks"],
"create_date": "2015-04-07T03:32:03+09:00",
"page_count": 1,
"width": 1024,
"height": 768,
"sanity_level": 2,
"meta_single_page": {
"original_image_url": "https://i3.pixiv.net/img-original/img/2015/04/07/03/32/03/49709638_ugoira0.png"
},
"meta_pages": [],
"filename": "49709638_ugoira",
"extention": "png",
"total_view": 174,
"total_bookmarks": 2,
"is_bookmarked": false,
"visible": true,
"is_muted": false,
"total_comments": 1,
"ugoira_metadata": { //动画增加的帧信息,如设置为不获取则没有ugoira_metadata
"zip_urls": {
"medium": "https://i3.pixiv.net/img-zip-ugoira/img/2015/04/07/03/32/03/49709638_ugoira600x600.zip"
},
"frames": [ //获取动图的帧数使用 illust.ugoira_metadata.frames.length
{
"file": "000000.jpg",
"delay": 60
},
{
"file": "000001.jpg",
"delay": 60
},
{
"file": "000002.jpg",
"delay": 60
},
{
"file": "000003.jpg",
"delay": 60
},
{
"file": "000004.jpg",
"delay": 60
},
{
"file": "000005.jpg",
"delay": 60
}
]
}
}
该示例为仅自己可见的图片的代码,凡是高权限作品,图片 url 中都会多一段加密的代码。
{
"id": 60738695,
"title": "开发用测试图片",
"type": "manga",
"image_urls": { //凡是高权限作品,图片 url 中都会多一段加密的代码
"square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2017/01/03/12/08/24/60738695-1255fafb31361ff75c26a5944fff105a_p0_square1200.jpg",
"medium": "https://i.pximg.net/c/540x540_70/img-master/img/2017/01/03/12/08/24/60738695-1255fafb31361ff75c26a5944fff105a_p0_master1200.jpg",
"large": "https://i.pximg.net/c/600x1200_90/img-master/img/2017/01/03/12/08/24/60738695-1255fafb31361ff75c26a5944fff105a_p0_master1200.jpg"
},
"caption": "开发脚本时候需要用到的测试图片",
"restrict": 2, //注:0 表示公开,1 表示仅好友可见,2 表示仅自己可见
"user": {
"id": 3896348,
"name": "枫谷剑仙",
"account": "mapaler",
"profile_image_urls": {
"medium": "https://i2.pixiv.net/user-profile/img/2016/04/22/17/52/13/10835493_0604d937120e2b0f68dd87474d05fe71_170.png"
},
"is_followed": false
},
"tags": [{"name": "漫画"}],
"tools": ["Fireworks"],
"create_date": "2017-01-03T12:08:24+09:00",
"page_count": 1,
"width": 604,
"height": 486,
"sanity_level": 2,
"meta_single_page": {
"original_image_url": "https://i4.pixiv.net/img-original/img/2017/01/03/12/08/24/60738695-1255fafb31361ff75c26a5944fff105a_p0.png"
},
"meta_pages": [],
"filename": "60738695-1255fafb31361ff75c26a5944fff105a_p",
"extention": "png",
"total_view": 0,
"total_bookmarks": 0,
"is_bookmarked": false,
"visible": true,
"is_muted": false,
"total_comments": 0
}
警告:此方式需要具有 JavaScript 或相似编程知识才可理解,一般用户请勿使用
PUBD v5 为了增加自定义性,对于掩码不再是固定提供,实际功能的实现是使用 JavaScript 的eval()
函数直接解析掩码名。因此掩码名其实是一段 JavaScript 语句。
所以可以衍生出高级用法,比如%{page+1}
就能得到比%{page}
大1的值。
使用条件运算符完成让多图和动图放到以自己id命名的一个文件夹内。掩码内容为(illust.page_count > 1 || illust.type == "ugoira") ? "/" + illust.id : ""
,意思就是当作品的页数大于一或者是动图时(动图 type 为ugoira
)输出/作品ID
,否则输出空白“”,完整掩码如下
{illust.user.id}%{(illust.page_count>1||illust.type=="ugoira")?"/"+illust.id:""}/%{illust.filename}%{page}.%{illust.extention}
有些人想把作者名称加入到文件夹名称里面去,但是很多作者经常参展,会在名称后面加上展会位置,就导致了下载路径发生变化而重复下载,最稳妥的方法是只使用作者数字 ID,缺点是缺少了辨识度。
还有一个办法,大部分画师都会用“昵称@展会名”的方式来改名,那么我们只需要取@
符号前的即可是固定不变的作者名了。首先通过illust.user.name
获取画师名,然后画师名.split("@")
会得到以@字符分割的字符串数组,然后数组[0]
取第一个对象。全部连起来就是illust.user.name.split("@")[0]
。
例如一个画师名叫“枫谷剑仙@C128 第2天东区-53a”,%{illust.user.name.split("@")[0]}
就会输出“枫谷剑仙”。
如果需要多种字符串分割,split函数是支持正则表达式分割的,可以用正则表达式同时搜索多个分割字符。
例如%{illust.user.name.split(/[@@]/)[0]}
,就可以同时分割半角的“@”字符与全角的“@”字符。
illust.create_date
可以获取作品的首次发布时间(重投稿的仅在作品 URL 有变化)。
该属性为世界时字符串new Date(illust.create_date)
即可创建一个Date对象,new Date(illust.create_date).getFullYear()
即可获取作品发布年份。
掩码%{new Date(illust.create_date).getFullYear()}年-%{new Date(illust.create_date).getMonth()+1}月-%{new Date(illust.create_date).getDate()}日
将会输出如2017年-3月-8日
。
具体的Date对象方法列表请参见Date 对象
2023年8月29日 更新,加入了自实现的Date.prototype.format()
方法,可以使用%{new Date(illust.create_date).format("yyy年MM月dd日 hh时mm分ss秒")}
来格式化时间。
也可以函数表达式的方式简写%{(dt=>dt.getFullYear()+"年-"+(dt.getMonth()+1)+"月-"+dt.getDate()+"日")(new Date(illust.create_date))}
。
学习该写法,你需要了解 立即调用函数表达式 和 箭头函数, 即(function(){})()
和()=>{}
。
使用“\{”→“{”、“\}”→“}”、“\\”→“\”三个转义符,可以在掩码内书写函数了。
示例掩码%{illust.tags.map(t=>t.name).join(",")}
可以将作品的所有tag输出到一行内。
JS代码原理分解:
//先将tag数组格式改编为我们希望的普通字符串数组
var tags= [
{"name": "うごイラ"},
{"name": "动漫东东"},
{"name": "东东娘"},
{"name": "鼠绘"}
];
//tags.map(处理函数); map可以返回处理函数处理过每个对象的一个新数组
var tagArr = tags.map(
function(item){ //输入的参数表示原数组的每个对象
return item.name; //新数组将得到原素组对象的name属性
}
);
//tagArr的内容是这样
//["うごイラ","动漫东东","东东娘","鼠绘"];
var text = tagArr.join(","); //使用字符串数组连接"join()"
//text的内容是"うごイラ,动漫东东,东东娘,鼠绘"
注:tag中可能存在不能用于文件名的字符,建议配合pathSafe()
函数使用,写为%{pathSafe(illust.tags.map(t=>t.name).join(","))}
。
因为本程序默认就已经将输出文件名里的一些特殊字符替换为了空字符,所以很多时候不需要主动添加字符替换函数也能正确下载。但是如果使用了画作标题、作者名称等可能含有特殊字符的作为文件名,还是建议先用本程序内建的pathSafe()
函数替换掉特殊字符。
2023年8月29日 更新,增加 pathSafe 函数。
/**
* 去除不可用的字符,替换为可以使用的安全路径字符串
* @param {string} str 输入路径字符串
* @param {'basic' | 'path' | 'pathWithoutDriver' | 'filename' | 'fn'} type 去除不可用字符串的形式,是路径还是文件名。fn 为 filename 的简写
* @param {string} newChar 被替换为的字符
* @returns {string} 安全路径字符串
*/
pathSafe(原始字符串, 不可用字符类型, [用于替换的字符串]);
//用法示例
pathSafe(illust.title, 'fn', '_')
还可以使用 JavaScript 的 replace() 或 replaceAll() 自行批量替换字符,如何书写正则表达式可参考 正则表达式。
-
str.replace(/[:\*\?"<>\|\r\n]/ig, "_")
可以将 str 中的: * ? " < > | 换行符 回车符
等字符替换为_
。 -
str.replace(/[\/\\]/ig, "_")
可以将 str 中的\ /
等字符替换为_
。
注: 以上代码书写到掩码内时,
\
都需要写成\\
。比如替换掉作品名%{illust.title}
里的左右斜杠,原始 JS 语句写法为illust.title.replace(/[\/\\]/ig, "_")
,掩码需要书写为%{illust.title.replace(/[\\/\\\\]/ig, "_")}
。