upbit / pixivpy

Pixiv API for Python
https://pypi.org/project/PixivPy3/#files
The Unlicense
1.79k stars 149 forks source link

请问如何让/users/{UID}/works.json能返回metadata? #28

Closed Mapaler closed 7 years ago

Mapaler commented 7 years ago

我在做网页版下载脚本,以前以为多图只能下载zip,但是用了您研究的api发现可以下载到有透明的原图了,但目前发现多图只在metadata里能获取到帧数,而/users/{UID}/works.json返回的metadata是null,只有/works/{illust_id}.json才返回metadata。 我注意到/users/{UID}/works.json附加include_stats=true参数可以让本来没有的内容返回,如果有什么附加的include参数可以让metadata一并返回,那么就减少了一层ajax获取,程序上会方便很多。请问这样的方法是否存在?

upbit commented 7 years ago

你用的应该是Public-API吧?新的App-API的user_illusts()在多图情况,是有在meta_pages里返回每张图片URL的。

例如:https://app-api.pixiv.net/v1/user/illusts?user_id=660788&filter=for_ios&type=illust&offset=53

"meta_pages": [
    {
        "image_urls": {
            "square_medium": "https://i.pximg.net/c/360x360_70/img-master/img/2016/03/07/00/00/50/55666808_p0_square1200.jpg",
            "medium": "https://i.pximg.net/c/540x540_70/img-master/img/2016/03/07/00/00/50/55666808_p0_master1200.jpg",
            "large": "https://i.pximg.net/c/600x1200_90/img-master/img/2016/03/07/00/00/50/55666808_p0_master1200.jpg",
            "original": "https://i1.pixiv.net/img-original/img/2016/03/07/00/00/50/55666808_p0.jpg"
        }
    }
]

PAPI里的参数是模拟iOS 5.x客户端发出的。至于是否还有其他参数,你可以尝试用include_meta=true这样的参数验证下。如果有结果,欢迎随时通知我增加这些控制值

Mapaler commented 7 years ago

是有两种不同的API吗?Wiki的排版有点看不懂,只能按照自己理解在看。 include_meta=true试过了不起作用。

Mapaler commented 7 years ago

对不起是我发帖的时候忘记审核了,我想表达的应该是动图type:"ugoira",结果习惯性说成多图了。 我看了一下,您给的app-api也不支持显示动图的帧数,就是这种动图。 http://www.pixiv.net/member_illust.php?mode=medium&illust_id=49709638

upbit commented 7 years ago

App-API是Pixiv 6.x客户端的新接口,返回数据更符合新版本客户端的使用场景,并且部分接口不用鉴权。具体接口可以参考这个部分:https://github.com/upbit/pixivpy#app-api-60---app-apipixivnet

Mapaler commented 7 years ago

其实按照这几年的规律来讲,自从P站把单图也加上了p0之后,路径结构就没有变化了,只需要获取任意一个尺寸大小的图片就能够推出原图的路径。压缩包也是的,直接把600x600改成1920x1080就可以了。但是毕竟压缩包都是不透明的zip,我觉得还是要获取png才舒服,所以需要帧数。

upbit commented 7 years ago

嗯,不过这种替换其实还要判断是否老图片,感觉不太通用就没有写在API里。ugoira我关注较少,zip后缀也是最近才发现有这个问题的。

如果客户端没有单帧图片的展示需求,估计模拟客户端的API接口是拿不到的。可以考虑看下web侧是否有类似场景,然后抓包看看

Mapaler commented 7 years ago

哪里需要判断是否老图片?reload的?目前我还没碰到过,不知道会是什么样。网页端获取动图,网络显示是直接分段下载zip,具体实现没看,感觉是js库浏览器内解压,然后画cavans,并不涉及到原图png。虽然不知道为什么papi里会有原图png,但真是帮了大忙。

upbit commented 7 years ago

以前SAPI还能用时,记得有些图片不能增加_p0来获取URL,当时还根据图片所在服务器特殊处理过,现在应该不需要了。

抓了PAPI最后一个版本的ugoira请求,并没有看到返回原图。API接口里只有个600x600的zip url,客户端也是直接下载这个url来进行展示的。

你说的原图应该是点"查看原图"放大显示的第一帧吧? http://i3.pixiv.net/img-original/img/2016/12/24/09/08/39/60518582_ugoira0.jpg 这个图片并不一定是png的(取决于原始图片的类型),并且没有后续帧图片url。

Mapaler commented 7 years ago

最开始是单图没有_p0,后来改版后,新的单图有_p0,老图没有。然后不知道那一天开始所有老图也加上了_p0。

“PAPI最后一个版本”是什么意思?PAPI要被淘汰了?

原图可以通过帧数数量,直接修改数字来得到。确实不是所有的动图都是png,但是有些是png的就行了。

upbit commented 7 years ago

是的,虽然还没有停用。PAPI是iOS 5.x版本使用的,iOS 9以后只能装6.x的客户端,使用的是带推荐和相关作品接口的App-API。新的接口返回更加工整,接口分类也好了很多。

『原图可以通过帧数数量,直接修改数字来得到』: 这个应该可行!帧数可以通过len(illust.metadata.frames)得到

Mapaler commented 7 years ago

因为App-API我没有找到获取frames的地方,所以我今天花了一天把PAPI的编出来了,居然又可能被弃用……

您能不能找一找 App-API 怎么获取动图的帧数?

upbit commented 7 years ago

越狱的机器不在身边,今晚暂时没法抓6.x客户端的https包。我分析下App-API的ugoira返回再回复你

Mapaler commented 7 years ago

我的手机没法root,搞不来。 即便是用 https://app-api.pixiv.net/v1/illust/detail?illust_id=49709638 这个链接也没有返回帧数。连zip的链接都没有给。 没想到安卓不用root也可以,只需要信任证书就行了,就是会一直有个警告。还得加入解析不同tsl版本的设置才能看到。 https://app-api.pixiv.net/v1/ugoira/metadata?illust_id=49709638 screenshot_2017-01-05-12-06-09 image 2 感觉App-Api确实要精确一些(因为没有了页面这一理念),昨天编PAPI的时候,对于某些图多的人,总会有那么一些无法获取,丢失了,然后就返回404,程序就出错,中断后重启继续分析也很不方便。

upbit commented 7 years ago

嗯,刚刚抓了下iOS客户端的情况,也是通过ugoira/metadata接口获取的zip信息,但frames里返回的文件名并没有使用过。推测某个地方存放有zip前的文件,只是不知道有没有对外开放读取。

ugoira_metadata() 我抽空加到API里

Mapaler commented 7 years ago

frames里返回的文件名其实就是zip解压后的帧名。zip存的都是有损压缩过后的文件,原文件是那个ugoira0.png或jpg

upbit commented 7 years ago

新API ugoira_metadata()已加,可以用pip install pixivpy --upgrade到v3.3.0来使用