Instagram下载器

Instagram 太小家子气了(注重版权,这方面国内就是狗屎),连个图片、视频的地址都不提供,碰到有趣好玩的,想下载下来,还得借助第三方,第三方基本都有广告多,捆绑多的特点, 但 https://saveig.com 这个网站非常好,pc端可以做到批量下载,但数量大的话容易卡死,而且如果想要下载用户的全部文件很麻烦,于是打算这个周末自己做一个本地版的。

连续两天忙到凌晨2点(不得不说年纪大了真不行,老是犯低级错误,还得找半天。。。) 终于有了成果,最终成果为一个jar包(最基本使用要求,安装JRE8或以上版本,有一个稳定的VPN或者ss,安装JRE8或以上版本,有一个稳定的VPN或者ss,安装JRE8或以上版本,有一个稳定的VPN或者ss),它支持四个命令,分别如下:

java -jar /path/to/downins.jar p 帖子ID|帖子网址

这个命令会下载某一个特定的帖子,并且将帖子的全部文件存储在 ${user.home}/downins/帖子shortcode 文件夹下

java -jar /path/to/downins.jar u 用户名|用户网址

这个命令会下载某个用户的全部帖子文件 并且将下载的文件存储在 ${user.home}/downins/用户名 下,文件名为 帖子的shortcode_文件在帖子中的序号

java -jar /path/to/downins.jar

这个命令会启动一个web服务(这个web服务仅仅是针对于本地的,不能对外提供服务),用于支持选择性的批量下载,选择下载文件后会提交一个任务,截图如下:

QQ截图20180820082041.png

downins.gif 任务会将下载的文件存储在 ${user.home}/downins/用户名 下,文件名为 帖子的shortcode_文件在帖子中的序号

${user.home}/downins是默认的存储文件夹,可以在配置文件中指定其他存储位置

java -jar /path/to/downins.jar s

这个命令会启动一个配置配置文件的面板(如果服务器支持GUI),效果图如下:

QQ截图20180920125740.png

不需要或者需要删除的属性直接留空即可

如果不支持GUI,可以通过在命令行中指定键值的方式修改,例如

java -jar /path/to/downins.jar s threadNum=1

可以将下载线程数更新为1(其他属性不会被更新),键名称如下(忽略大小写):

键名称 说明
threadName 下载线程数
location 下载文件存储文件夹位置
proxyAddr 代理地址
proxyPort 代理端口
sid sessionid

如果需要删除某些属性,直接留空即可,例如

java -jar /path/to/downins.jar s proxyAddr=

将会删除代理地址

配置文件

配置文件位于 ${user.home}/downins/config.properties,请通过命令行修改

关于私密账户的下载

私密账户需要用户关注他们后才可以浏览他们的帖子,比如 https://www.instagram.com/foodys 这样的话就首先需要模拟登录,但由于Instagram会在用户登录时通过一些手段判断是否是人工操作(怪不得Instagram没有验证码),这会导致无法模拟登录,所以退而求其次,手动填写sessionid(同样保存在配置文件中),在pc浏览器下,获取这个cookie应该非常容易。

项目代码

完整的项目代码可以在 gitlab-downins 这里看到,downins项目依赖了一个d.jar,这个jar包是用downinsrun这个项目打成的runnablejar。executable.zip是用来制作可执行war包的,将downins项目打成war包之后,通过解压缩工具打开,然后将executable.zip中的文件全部复制到war包中,即可通过命令行执行war包了。

点击 downins.jar 直接下载 jar包。

测试用户

https://www.instagram.com/1d.legendary.updates/ 一个很有代表性的用户,拥有高达12w+的帖子(截止至2018-08-20),而且帖子内容非常丰富,有图片,有视频,也有相当多的 图片视频集合(Instagram叫做GraphSidecar),由于帖子太多,只下载了2397个帖子,下载总容量3.75GB,下载文件失败一个,最大成功4243个(由于直接关闭了进程,一些文件还在下载中),下载并发线程数15,用的搬瓦工的openvpn,100M宽带。

https://www.instagram.com/snake___pit/ 下载完毕所有文件(共有4053个帖子,截至到2018-08-20),都是图片文件,耗时335秒,下载总容量464M,下载文件4108个 ,并发线程数5,用的ExpressVPN,连的手机4G热点。

https://www.instagram.com/vidz/ 下载完毕所有文件(共有1136个帖子官方标注1138个,截至到2018-08-22),基本都是视频文件,耗时5579秒,下载总容量4.9G,下载文件1188个 ,并发线程数5,用的ExpressVPN,10M带宽。

关于实际帖子数和官网显示的不一致

测试过程中发现,有些用户下载下来的帖子数和官网标注的不一致,例如 vidz,官网标注为1120(截止到2018-08-20)但下载下来只有1118个帖子,后面到app中进行了比对,发现app确实只能显示1118个帖子

关于多个下载进程

应该始终保持一个下载进程,多个下载进程非常容易导致请求返回429状态码(rate limit),一旦检测到429状态码,主进程将会休眠10s后再次发送请求,直到返回200状态码为止。

更新日志

2018-08-22

  1. 支持用户增量下载
  2. 努力确保在进程异常关闭后再次下载时不会丢失文件(仍然会进行查询匹配)

2018-08-23

  1. 修复了web服务下载文件时进度条进度始终为0的bug
  2. 优化了下载GraphSidecar的性能

2018-08-29

  1. posts.txt不再记录帖子的shortcode,而是记录帖子的ID,因为shortcode可能会发生变化(例如账户在私密-非私密之间转化)

2018-09-12

  1. 支持设置代理地址和端口,以支持ss

2018-09-19

  1. 新增配置文件修改命令行