Mapaler / PixivUserBatchDownload

P站画师个人作品批量下载工具,UserScript + Aria2。可高度自定义重命名,发送到本地或远程(如路由器)下载。
GNU General Public License v3.0
1.03k stars 72 forks source link

目前有没有能识别分级的掩码? #24

Closed MichaelMai2000 closed 6 years ago

MichaelMai2000 commented 6 years ago

例如R18 R18G的分类,可以通过掩码实现吗?多谢

MichaelMai2000 commented 6 years ago

https://github.com/upbit/pixivpy/wiki/sniffer 在上面,我找到了age_limit这个参数,请问这个参数能获取到吗?

还有就是我手动筛选了一下,发现现有掩码 sanity_level 大于等于6的时候就应该是R的水平了,所以, sanity_level 能用来准确分级吗?

Mapaler commented 6 years ago

这么久没搞我记得不清楚了,sanity_level好像是跟访问权限相关的吧,比如仅好友访问之类的。age_limit我没注意,你可以把掩码写在文本输出模式试试看。 只要你能找出规律,当然就可以用来准确分级,写一个if判断的高级掩码就行。

MichaelMai2000 commented 6 years ago

@Mapaler %{illust.age_limit}在文本输出模式里没有输出,于是age_limit还可能在其他什么位置吗?

另外,我还发现了一个问题,当文本输出模式格式如下时 %{illust.user.id}%{画师名}/%{动图标记gif}%{多于9图分p}%{illust.filename}%{page}%{动图延迟}.%{illust.extention} %{illust.title.replace(/[\/\]/ig, "_")} %{illust.title}

输出如下 7140895 - 極道畫師/40123321_p0.jpg

Kill La Kill-決闘1/4

replace函数似乎并没有起作用。我查了一下JS的语法,如果正则匹配没有匹配上,应该会直接输出,为什么这里会输出为空白呢? 对于其他illust.title里面不含 / \字符的,replace输出仍旧为空,是哪里出现了什么问题吗?多谢

Mapaler commented 6 years ago

我昨天结婚,所以没能回复

我看了P站返回应该就不含age_limit这个属性,你说的不知道是不是其他软件通过某些参数换算的。

你按F12打开开发者工具,在运行栏输入"Kill La Kill-決闘1/4".replace(/[\/\\]/ig,"_")来看看输出呢?右斜杠本身在js里就是转义符,我不知道是不是因为掩码里右斜杠是我后来加入的掩码的转义符,你没有写成转义符。那就要在掩码里写成"Kill La Kill-決闘1/4".replace(/[\\/\\\\]/ig,"_")才行(掩码先转义成js的,js再转义成实际需要的)

MichaelMai2000 commented 6 years ago

@Mapaler 首先祝贺新婚! age_limit参数在upbit/pixivpy的sniffer的返回值里面出现过,不过Sniffer的更新时间24 Jan 2016,可能已经是个历史遗留物品了,我觉得已经没什么意义了。如果大大没什么思路,我还是先放弃了吧orz

Chrome Console转义符测试结果: "Kill La Kill-決闘1/4".replace(/[\/\\]/ig,"_") "Kill La Kill-決闘1_4"

"Kill La Kill-決闘1/4".replace(/[\\/\\\\]/ig,"_") "Kill La Kill-決闘1_4"

文本输出模式结果格式及输出: 格式: %{illust.url_without_page}%{page}.%{illust.extention} %{illust.user.id}%{画师名}/%{动图标记gif}%{多于9图分p}%{illust.filename}%{page}%{动图延迟}.%{illust.extention} %{illust.title.replace(/[\/\\]/ig, "_")} %{illust.title.replace(/[\\/\\\\]/ig,"_")} %{illust.title}

结果: https://i.pximg.net/img-original/img/2013/11/29/08/07/52/39999104_p0.jpg 7140895 - 極道畫師/39999104_p0.jpg

kill la kill-決闘1_5 kill la kill-決闘1/5

从结果看应该是没问题了,多谢! 不过我想补充一些问题和建议:

  1. 对于其他高级掩码所有的转义符右斜杠都要双写吗? 例如 - %{illust.user.name.split(/[:\*\?"<>\|\r\n@@]/ig)[0]} 是否应该改为 - %{illust.user.name.split(/[:\\*\\?"<>\\|\\r\\n@@]/ig)[0]} (这个我也会自己测试一下)
  2. 这种二次转义是与浏览器直接相关吗? 如果不是的话,wiki可能就需要改一下了

以上,再次感谢!

Mapaler commented 6 years ago

sniffer是老版API,现在我的程序已经没用了,现在用的是第二版API,他的那么多页面我其实不是很了解是什么结构。

最开始因为高级掩码是用大括号来括的,所以不能写function和if这些,不然括号就会冲突,于是当初不需要转义,写法和js一样。后来我加入了{}的转义,用右斜杠来表示,不过这样正常的右斜杠接括号就无法表示了,所以右斜杠也得转义。不过老的wiki部分忘记改了。

MichaelMai2000 commented 6 years ago

@Mapaler 大概明白了,也就是说掩码里面的 \ 都需要转义成 双 \ ,原因是支持“\{”→“{”、“\}”→“}”、“\\”→“\”三个转义符 age_limit应该是没什么办法了,sanity_level我再找找有什么硬性规律吧。多谢了。

Mapaler commented 6 years ago

你这么懂的话,其实可以自己改一下程序,把需要处理的图像对象输出到控制台看一下有哪些具体的属性,看看会不会多出来新的信息(不过我觉得多半不会有)

另一个思路是看tag里面有没有r-18和r-18g,我在p站客户端里看限定图似乎是有这个tag的。

MichaelMai2000 commented 6 years ago

@Mapaler 其实没那么懂。如果知道怎么调试,简单debug还是可以的。然而高三寒假比较蛋疼。

  1. 输出到控制台看一下有哪些具体的属性

具体操作是什么呢?是看控制台network里面的js属性吗?(这类调试操作我不是很熟悉。。。) 然后改程序可能也不知道改哪儿,简单读过js,只能大概看出来。

  1. r-18的tag是限定图的必要条件,应该也是充分条件,写高级掩码就够了,比上一个操作简单多了,值得一试。
Mapaler commented 6 years ago

我也没有在电脑旁,用手机简单看了下代码,在2160到2161行之间,插入

console.log(item);

然后你点击生成文本的时候,就会把所有的illust对象输出到控制台。

Mapaler commented 6 years ago

我觉得可以写成自定义掩码,以下是原始js,自己记得加掩码的转义符。

//数组对象的some方法,只要提供的函数有一例返回true就返回true。下面这行就是判断是不是r18-g的条件。
illust.tags.some(function(tag){return tag.name  == "R-18G"})
//等于那里还可以用正则表达式的方式来书写,一次性匹配大小写的r-18和r-18g
/r-18g?/ig.test(tag.name)
MichaelMai2000 commented 6 years ago

@Mapaler

  1. 经查,illust里面确实没有age_limit,推测pixiv改版后直接将原来的age_limit属性换成了R18标签。
  2. 自定义掩码测试成功,但是条件里面的js不用加掩码转义符, 即illust.tags.some(function(tag){return tag.name == "R-18G"})是合法且有效的, 但illust.tags.some(function(tag)\{return tag.name == "R-18G"\})是非法且无效的(死循环了),console中报错“自定义掩码错误”。 illust.tags.some(function(tag){return /r-18g?/ig.test(tag.name)})也是合法的。
  3. 有个小问题:如果想给既带R-18G又带R-18的仅标记R-18G,不标记R-18;对不带R-18G的带R-18的标记R-18。我已经用两个掩码实现了,不过下面这个段%{R18}掩码可以改进(到更简洁)的方法吗?多谢。 illust.tags.some(function(tag){return tag.name == "R-18"})&&!illust.tags.some(function(tag){return tag.name == "R-18G"})
Mapaler commented 6 years ago

我想起来了,因为自定义掩码的判断条件是单纯js,不需要也不能写%{},所以就没有转义。

恐怕没什么化简的或者好理解的。如果要有,都是高级掩码,一种我想到的是写两层三目运算符,我只写思路

如果有r-18?(如果有r-18g?"r-18g":"r-18"):""

高级掩码太长可以写到自定义掩码的内容里面,条件写true或者1就行了。

MichaelMai2000 commented 6 years ago

@Mapaler 新春快乐! 跟我想得差不多,那我就不做什么其他改动了。

Mapaler commented 6 years ago

新春快乐,没问题回复我还有点不习惯了

Mapaler commented 6 years ago

我刚才试了下新的投稿都会自动加上R-18,但是老的投稿还真的不一定有,而且这个TAG是可以被删除的。不过确实R-18的都是sanity_level=6,但R-18G还是6没区别。只有网页版才能看到没有R-18 tag的仍然是R-18。