diff --git a/vsco-dl.rb b/vsco-dl.rb index d626fa2..840a3b6 100644 --- a/vsco-dl.rb +++ b/vsco-dl.rb @@ -2,6 +2,7 @@ require 'json' require 'open-uri' require 'fileutils' require 'optparse' +require 'securerandom' options = {} parser = OptionParser.new do |opts| @@ -30,10 +31,16 @@ end print "Loading initial data" -# this is v gross, but they probably do it like this on purpose -initial = open "https://vsco.co/#{user}/images/1" -vs = /vs=(\S*);/.match(initial.meta['set-cookie']).captures[0] -site_id = JSON.parse(/window.VSCOVARS.SiteSettings = ({.*})/.match(initial.read).captures[0])['id'] +# this endpoint requires the referer for some reason +initial = open "https://vsco.co/content/Static/userinfo", + 'Cookie' => "vs_anonymous_id=#{SecureRandom.uuid}", + 'Referer' => "https://vsco.co/#{user}/images/1" +# the ol' jsonp for same origin requests because why not +vs = JSON.parse(initial.read[/{.+}/])['tkn'] + +sites = JSON.load open "https://vsco.co/ajxp/#{vs}/2.0/sites?subdomain=#{user}", 'Cookie' => "vs=#{vs}" +# the ol' return an array when you only queried for one thing +site_id = sites['sites'][0]['id'] # vsco seems to timeout on requests for very large amounts of images # it also doesn't send the actual total amount of images in requests @@ -43,7 +50,7 @@ page = 1 size = 1000 images = [] loop do - response = JSON.load open "https://vsco.co/ajxp/#{vs}/2.0/medias?site_id=#{site_id}&page=#{page}&size=#{size}", 'Cookie' => "vs=#{vs};" + response = JSON.load open "https://vsco.co/ajxp/#{vs}/2.0/medias?site_id=#{site_id}&page=#{page}&size=#{size}", 'Cookie' => "vs=#{vs}" images.concat response['media'] break if response['total'] <= page * size page += 1