When I discover delicious it was too late for me since at the time I had too many bookmarks already tagged in Yahoo’s Myweb. But since then I’ve always wanted to move all my bookmarks to delicious but didn’t found how to do it, until now.
Some days ago I found this python script that makes use of myweb and delicious web services to migrate the bookmarks.
Unfortunately the script wasn’t very reliable, it was crashing quite often and, since I have more than 1500 bookmarks, it was quite painful since every time I launched it, it was starting from scratch.
So I decided to build a new script (actually two)… in Ruby.
Step 1 : prerequisites
First of all you must install Ruby and rubygems on your system.
Then you must install rubilicious gem.
Step 2 : export myweb bookmarks
Here’s the first ruby script that you must run:
require 'net/http'
require 'uri'
require 'rexml/document'
# YOU WANT TO MODIFY THIS
yahoo_id = 'pix'
myweb_appid = 'YahooDemo'
myweb_urlsearch = 'http://search.yahooapis.com/MyWebService/V1/urlSearch'
request_start_idx = 1
request_max = 50
while(true)
url = myweb_urlsearch + '?' + {
:appid => myweb_appid,
:yahooid => yahoo_id,
:results => request_max,
:start => request_start_idx
}.to_a.collect {|kv| kv[0].to_s + '=' + kv[1].to_s}.join('&')
retries = 3
while(true)
$stderr.puts(" - Requesting URLs from [#{request_start_idx}] (#{retries} retries left) -> #{url}\n")
http_resp = Net::HTTP.get_response(URI.parse(url))
if(http_resp.code.to_i < 200 || http_resp.code.to_i > 299)
$stderr.puts(" ! request failed [#{http_resp.code}]\n")
retries -= 1
sleep(5) && next if(retries > 0)
$stderr.puts(" ! too many retries, something is broken!\n")
exit
end
break # exit while loop
end
xml_data = http_resp.body
# extract event information
doc = REXML::Document.new(xml_data)
tot_results = doc.root.attributes['totalResultsAvailable'].to_i
break unless tot_results > 0
doc.elements.each('ResultSet/Result') do |r|
puts [
r.elements['Title'].text,
r.elements['Summary'].text,
r.elements['Url'].text,
r.elements['Tags'].collect() {|e| e.text.to_s}.join(','),
].collect {|v| URI.escape(v.to_s) }.join('&') + "\n"
request_start_idx += 1
end
end
Copy this code and paste it to a file (like myweb_export.rb). You also want to set the yahoo_id variable with your myweb ID.
Then you can run the script:
ruby myweb_export.rb > data.txt
Step 3 : import bookmarks into delicious
For the final step you’ll need the script below:
require 'rubilicious'
require 'uri'
r = Rubilicious.new('USER', 'PASSWORD')
$stdin.each_line do |l|
title, description, url, keys = l.split('&').collect { |i| URI.decode(i) }
keys = keys.split(',').collect { |k| k.strip.gsub(/\s+/, '-') }.join(' ')
puts title + "\n" + url + "\n" + keys + "\n---\n"
r.add(url, title, description, keys)
sleep(1)
end
You want to set the proper values for USER and PASSWORD of your delicious account and copy the code to deli_import.rb.
ruby deli_import.rb < data.txt
The script waits 1 second after each URL since this is required by the delicious API.
Limitations: unfortunately since the Myweb web services only allow the search of public bookmarks, you’ll not be able to migrate private bookmarks. You must do this by hand or wait that Yahoo will release a Myweb webservice that supports authentication.
Share and Enjoy:
These icons link to social bookmarking sites where readers can share and discover new web pages.