-
-
Save joshwand/5402126 to your computer and use it in GitHub Desktop.
require 'tumblr_client' | |
require 'mechanize' | |
require 'date' | |
require 'yaml' | |
require 'uri' | |
Tumblr.configure do |config| | |
config.consumer_key = "consumer_key" | |
config.consumer_secret = "consumer_secret" | |
config.oauth_token = "oath_token" | |
config.oauth_token_secret = "token_secret" | |
end | |
THREADPOOL_SIZE = 4 | |
SEGMENT_SIZE = 25 | |
HISTORY_FILE = File.join(File.dirname(__FILE__), "previous.yml") | |
previous_dled_ids = YAML.load(File.open(HISTORY_FILE)) rescue [] | |
directory = "tumblr-likes" | |
client = Tumblr::Client.new | |
likes = client.likes | |
liked_count = likes["liked_count"] | |
puts liked_count | |
likes = [] | |
(0...liked_count).each do |i| | |
if i==0 or i%SEGMENT_SIZE==0 | |
p "getting #{SEGMENT_SIZE} more likes starting at #{i}: #{likes.count} thus far" | |
client.likes({:limit => SEGMENT_SIZE, :offset => i})["liked_posts"].each do |like| | |
likes << like if like['type'] == 'photo' and !previous_dled_ids.include?(like['id']) | |
end | |
end | |
end | |
if likes.empty? | |
p "no new likes!" | |
exit 0 | |
end | |
puts "#{likes.count} new likes!" | |
# some of this code comes from https://github.com/jamiew/tumblr-photo-downloader | |
already_had = 0 | |
threads = [] | |
likes.each_slice(likes.count / THREADPOOL_SIZE ).each do |group| | |
threads << Thread.new { | |
begin | |
p "launching thread #{threads.size + 1}" | |
group.each do |like| | |
i = 0 | |
like["photos"].each do |photo| | |
url = photo["original_size"]["url"] | |
filename = "#{like["blog_name"]}-#{like["slug"]}-" | |
filename += "#{i}-" if i > 0 | |
filename += File.basename(URI.parse(url).path.split('?')[0]) | |
if File.exists?("#{directory}/#{filename}") | |
puts "Already have #{url}" | |
already_had += 1 | |
else | |
begin | |
puts "Saving photo #{url}" | |
file = Mechanize.new.get(url) | |
file.save_as("#{directory}/#{filename}") | |
rescue Mechanize::ResponseCodeError => e | |
puts "Error #{e.response_code} getting file for #{url}" | |
end | |
end | |
i += 1 | |
previous_dled_ids << like['id'] | |
end | |
end | |
rescue Exception => e | |
puts "unhandled exception:, #{$!}" | |
end | |
p "closing thread" | |
} | |
end | |
threads.each{|t| t.join } | |
YAML.dump(previous_dled_ids, File.open(HISTORY_FILE, "w")) | |
anyone find a solution to the NoMethodError: undefined method
client='? i'm getting the same error when only using the
tumblr_client`, which depends on faraday. it was working for me without issues until very recently, and now all my tests are failing.
Thanks @drchris1502 - that little fix worked. Great!
Maybe it could be checked if there is a ~/.tumblr file and use those credential if there is ? I have no idea on how to do it, just a suggestion.
(or maybe run the tumblr command if no credential is set, then use the ~/.tumblr file, that way, everything is automatized)
When I run this, I get a Faraday::SSLError (Read server certificate B: Certificate verify failed). Does anyone know how to fix this? Thanks!
sorry but how do i get the "require"d scripts?
Works great, it's a shame that you can only get the last 1000 likes from tumblr though.
If you are having SSL connect errors then visit https://github.com/jnunemaker/httparty/wiki/Troubleshooting-on-Windows and follow the instructions.
@d4ni31 type this into the command line:
gem install tumblr_client
gem install mechanize
I don't have any idea at all about anything. i just installed ruby now what do i do to get this working
You can get all your likes (that tumblr still knows about) by using the 'after' request parameter https://www.tumblr.com/docs/en/api/v2#blog-likes, you can store how far you've gone back so far by inspecting the 'liked_timestamp' fields in the return object. I made a working hack as a fork.
I get the error:
tumblr-likes-downloader.rb:32:in `<main>': bad value for range (ArgumentError)
Does anybody know how to solve this?
Hello sir, I get an error.
///
C:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems/specification.rb:2283:in raise_if_conflicts': Unable to activate mechanize-2.7.3, because mime-types-3.0 conflicts with mime-types (~> 2.0) (Gem::ConflictError) from C:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems/specification.rb:1406:in
activate'
from C:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems.rb:195:in rescue in try_activate' from C:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems.rb:192:in
try_activate'
from C:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:124:in rescue in require' from C:/Ruby22/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:39:in
require'
from tumblr-likes-downloader.rb:2:in `
///
Okay, so i deleted mimetypes 3.0 and installed 2.0
Now i get this :
///
C:/Ruby22/lib/ruby/2.2.0/net/http.rb:923:in connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (Faraday::SSLError) from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:923:in
block in connect'
from C:/Ruby22/lib/ruby/2.2.0/timeout.rb:73:in timeout' from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:923:in
connect'
from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:863:in do_start' from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:852:in
start'
from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1375:in request' from C:/Ruby22/lib/ruby/2.2.0/net/http.rb:1133:in
get'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:80:in perform_request' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:40:in
block in call'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:87:in with_net_http_connection' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/adapter/net_http.rb:32:in
call'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday_middleware-0.9.2/lib/faraday_middleware/response_middleware.rb:30:in call' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/request/url_encoded.rb:15:in
call'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/request/multipart.rb:14:in call' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday_middleware-0.9.2/lib/faraday_middleware/request/oauth.rb:42:in
call'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/rack_builder.rb:139:in build_response' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/connection.rb:377:in
run_request'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/faraday-0.9.2/lib/faraday/connection.rb:140:in get' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/tumblr_client-0.8.5/lib/tumblr/request.rb:8:in
get_response'
from C:/Ruby22/lib/ruby/gems/2.2.0/gems/tumblr_client-0.8.5/lib/tumblr/request.rb:26:in get' from C:/Ruby22/lib/ruby/gems/2.2.0/gems/tumblr_client-0.8.5/lib/tumblr/user.rb:16:in
likes'
from tumblr-likes-downloader.rb:25:in `
///
please help, i've been trying to get it to work for the last 3 days.
This is my first experience with ruby and programming,
Not getting much out of it so far.
Kudos for using Ruby
@pfoax as far as I can tell it's because tumblr no longer support SSLv3 (which is normal, since it was definitively dropped and replaced by TLS) and tumblr_client still try to use it.
I created a javascript version of this and it's called tumblr-lks-downldr
.You can use it as an NPM module (https://www.npmjs.com/package/tumblr-lks-downldr) or as a CLI tool (https://www.npmjs.com/package/tumblr-lks-downldr-cli). I would suggest the second one if you just one to download the liked posts without writing any code.
Please let me know if that works.
hello geeks,
i am don't know nothing about ruby and programming in windows. could anybody please help me with step by step instructions to get my liked photos
i have downloaded ruby and notepate++ and saved this above script . as ruby format and run from admin cmd console .. after i get this error message
c:>"Users\xxxxx\Desktop\tumblr-likes-downloader.rb"
C:/Ruby23-x64/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require' : cannot load such file -- tumblr_client (LoadError) from C:/Ruby23-x64/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55 :in
require'
from C:/Users/xxxxxx/Desktop/tumblr-likes-downloader.rb:1:in `
Many thanks ..
Not pretending to have any major knowledge about ruby or programming in general. However, some questions above are pretty basic so i’ll write down the steps i took to make this work on my mac. I used the fork zbas made since i had more than 1000 likes to download.
- Register a tumblr app to get the consumer_key and the consumer_secret.
You can do this here: www.tumblr.com/oauth/apps - Use the in browser tumblr_api console tumblr provides to get the oauth_token and oath_token_secret for my tumblr account.
This can be had here: https://api.tumblr.com/console/ - Paste all of the above in the script fork of zbas.
- install the latest version of ruby using homebrew
Command in terminal in iMac: brew install ruby - Clone the git repository for the required gem tumblr_client to get the before functionality since this is only contained in the master version.
Command in terminal on iMac: git clone https://github.com/tumblr/tumblr_client.git - Build the tumblr_client gem from the cloned repository.
Command in terminal on iMac(in the repository directory): gem build tumblr_client.gemspec - Install both the generated tumblr_client gem and the required mechanize gem.
Commands in terminal on iMac(in the repository directory to pick the correct client):
gem install tumblr_client-0.8.5.gem
gem install mechanize - run the ruby script in terminal using the command:
ruby tumblr-likes-downloader.rb
Many thanks to all who contributed and mbas for his fork.
I am getting this error (Mac OS Sierra):
tumblr-likes-downloader.rb:37:in <main>': undefined method
each' for nil:NilClass (NoMethodError)
Any advice?
If you are not able to run this, here I made one as well:
If any one like node.js, I made one too https://github.com/gonejack/tumblr-likes-downloader
Same error here as with m1lner & nazzeth:
/home/xxx/.gem/ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/options.rb:31:in
'block in update': undefined method
client=' for #Faraday::ConnectionOptions:0x00000001ad5740 (NoMethodError)from /home/xxx/.gem/ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/options.rb:20:in
each' from /home/xx/.gem/ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/options.rb:20:in
update'from /home/xxx/.gem/ruby/2.1.0/gems/faraday-0.9.0/lib/faraday/options.rb:52:in
merge' from /home/xxx/.gem/ruby/2.1.0/gems/faraday-0.9.0/lib/faraday.rb:69:in
new'from /home/xxx/.gem/ruby/2.1.0/gems/tumblr_client-0.8.2/lib/tumblr/connection.rb:19:in
connection' from /home/xxx/.gem/ruby/2.1.0/gems/tumblr_client-0.8.2/lib/tumblr/request.rb:8:in
get_response'from /home/xxx/.gem/ruby/2.1.0/gems/tumblr_client-0.8.2/lib/tumblr/request.rb:26:in
get' from /home/xxx/.gem/ruby/2.1.0/gems/tumblr_client-0.8.2/lib/tumblr/user.rb:16:in
likes'from /home/xxx/bin/tumblr-likes-downloader.rb:26:in `