Blog

Posts Tagged ‘facebook’

UPDATED: New Facebook Phonebook Script

Posted on:Monday, July 19th, 2010 by Ashish Datta

I realized this morning that Anonymous Coward’s Facebook Phonebook Greasemonkey script broke awhile back so I decided to rewrite it from scratch.

The original instructions for how to install the script are available here.

I updated the original Userscripts page with the new script so you can download it here.

Once again, this probably breaks your Facebook TOS so I can’t vouch for the safety of your account if you do decide to do this.

Use Greasemonkey to extract your Facebook Phonebook

Posted on:Friday, March 6th, 2009 by anonymous

7/19/2010 UPDATE: There is a BRAND NEW version of the script available on Userscripts here.

10/12/2009 UPDATE: Added fixes from Marcel Chastain

UPDATE: It looks like the version that got uploaded was missing a * in the trigger URL! That might be the issue everyone is having.


UPDATE: Video of the process: fbimport

Facebook’s API + FBConnect is great but it has some severe limitations. Notably, it doesn’t expose all the functionality available on the Facebook  site. Tonight in particular, I wanted to be able to copy a dump of my friends’ names and phone numbers off the site to load into a fresh cell phone. Unfortunately, looking at the API this isn’t possible.

Never fear – Greasemonkey provides enough of a hook into Firefox that it would be possible to write a UserScript to accomplish this.

Continuing beyond this point is probably against the Facebook TOS and will probably severely void your warranty.

You have been warned.

The following describes how to use this userscript to extract your Facebook “Phonebook”. It produces of a CSV of your friends’ names and phone numbers. Fair warning – this is a rough prototype and does almost no error handling. Also, since the “Phone” field is a free text field I can’t promise people will have formatted their numbers in any sane fashion. But either way it’s a good start to revering lost numbers.

So here is what you need to do to use the script:

1. Install Greasemonkey – https://addons.mozilla.org/en-US/firefox/addon/748

2. Follow these instructions to install the script – http://userscripts.org/about/installing

Edit: The script is also on Userscripts at http://userscripts.org/scripts/show/43681

3. Navigate over to http://m.facebook.com/friends.php? (You’ll have to login)

4. Answer yes to the prompt and sit back – the script will move through your phonebook and eventually dump you a CSV of the results.

5. Copy/Paste the CSV wherever you want.

6. Un-install the Greasemonkey script.

So that’s it, one less walled garden to worry about. And hopefully one less “I lost my cellphone!” event/group on facebook!

The script:

Facebook Phonebook Exporter

// ==UserScript==
// @name           fb phonebook
// @namespace      setfivefb
// @description    Scrapes your Facebook friend's phone #s and optionally email addresses. Login to http://m.facebook.com/ and navigate to http://m.facebook.com/friends.php?a&rf6e4c397&refid=5
// @include        http://m.facebook.com/*
// ==/UserScript==

var s = document.createElement('script');
s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js';
s.type = 'text/javascript';

document.getElementsByTagName('body')[0].appendChild(s);

s.addEventListener('load', function(){
  jQuery = unsafeWindow['jQuery'];
  jQuery.noConflict();

  var queryString = unsafeWindow["window"].location.search;

  if( queryString.indexOf("sfScraper") > 0 ){

	  var localStorage = unsafeWindow['localStorage'];
	  var scrapeWhat = JSON.parse( localStorage.getItem("sfScrapeWhat") );

	  if( scrapeWhat.emailsDone ){
		  extractEmailandPhones();
		  return false;
	  }

	  if( scrapeWhat.phone ){
		  scrapePhoneContacts();
		  return false;
	  }

	  if( scrapeWhat.email ){
		  scrapeEmailContacts();
		  return false;
	  }

	  return false;
  }

  if( jQuery("b:contains('Everyone')").length ){

	  var localStorage = unsafeWindow['localStorage'];
	  localStorage.removeItem("sfStoredContacts");
	  localStorage.removeItem("sfScrapeWhat");
	  localStorage.removeItem("sfContactLinks");

	  jQuery("#title").after("
" + "What do you want to save?
Phonenumbers Phonenumbers and Emails" + "  
" + "
"); jQuery("#sf-scrapeBtn").click( function(){ var scrapeWhat = { phone: false, email: false, emailsDone: false }; jQuery("#sf-scraperFrm input:checked").each( function(){ if( jQuery(this).val() == "p" ){ scrapeWhat.phone = true; }else if( jQuery(this).val() == "e" ){ scrapeWhat.email = true; } }); localStorage.setItem("sfScrapeWhat", JSON.stringify(scrapeWhat)); if( scrapeWhat.phone ){ scrapePhoneContacts(); } if( scrapeWhat.email ){ scrapeEmailContacts(); } return false; }); }else{ jQuery("#marquee_tabs").after("
You need to switch to the Friends -> 'Everyone' tab for the scrapper to become active.
"); } }, false); function extractEmailandPhones(){ var contacts = localStorage.getItem("sfStoredContacts"); var contactLinks = JSON.parse( localStorage.getItem("sfContactLinks") ); if( contacts == null ){ contacts = [ ]; }else{ contacts = JSON.parse( contacts ); } var name = jQuery(".section_title:first").text(); var email = jQuery("td:contains('Email:')").next("td:first").text(); var phone = jQuery("td:contains('Mobile Number:')").next("td:first").text(); contacts.push( {"n": name, "p": phone, "e": email} ); localStorage.setItem("sfStoredContacts", JSON.stringify(contacts) ); jQuery(".section_title:first").after("
" + "Links left: " + contactLinks.length + "
"); if( contactLinks.length ){ unsafeWindow["window"].location = contactLinks.pop(); localStorage.setItem("sfContactLinks", JSON.stringify(contactLinks) ); return false; } var textArea = "Name,Phone,Email \n"; jQuery.each(contacts, function(i, val){ textArea += val.n + "," + val.p + "," + val.e + "\n"; }); jQuery("body").append(""); jQuery("#sf-fbContacts").val( textArea ); } function scrapeEmailContacts(){ var localStorage = unsafeWindow['localStorage']; var contactLinks = localStorage.getItem("sfContactLinks"); if( contactLinks == null ){ contactLinks = [ ]; }else{ contactLinks = JSON.parse( contacts ); } jQuery("tr[valign='top']").each( function(){ var url = "http://m.facebook.com" + jQuery(this).find("a:first").attr("href") + "&v=info&sfScraper=true"; contactLinks.push( url ); }); jQuery("#title").after("
" + "Saved: " + contactLinks.length + "
"); localStorage.setItem("sfContactLinks", JSON.stringify(contactLinks) ); if( jQuery("a:contains('Next')").length ){ var nextLink = jQuery("a:contains('Next')").attr("href") + "&sfScraper=true"; unsafeWindow["window"].location = "http://m.facebook.com" + nextLink; }else{ var scrapeWhat = JSON.parse( localStorage.getItem("sfScrapeWhat") ); scrapeWhat.emailsDone = true; localStorage.setItem("sfScrapeWhat", JSON.stringify(scrapeWhat) ); unsafeWindow["window"].location = contactLinks.pop(); localStorage.setItem("sfContactLinks", JSON.stringify(contactLinks) ); } return false; } function scrapePhoneContacts(){ var localStorage = unsafeWindow['localStorage']; var contacts = localStorage.getItem("sfStoredContacts"); if( contacts == null ){ contacts = [ ]; }else{ contacts = JSON.parse( contacts ); } jQuery("tr[valign='top']").each( function(){ var name = jQuery(this).find("a:first").text(); if( jQuery(this).find("a:contains('Call')").length ){ var number = jQuery(this).find("a:contains('Call')") .attr("href").replace("tel:", ""); contacts.push( {"n": name, "p": number, "e": ""} ); } }); jQuery("#title").after("
" + "Saved: " + contacts.length + "
"); localStorage.setItem("sfStoredContacts", JSON.stringify(contacts) ); if( jQuery("a:contains('Next')").length ){ var nextLink = jQuery("a:contains('Next')").attr("href") + "&sfScraper=true"; unsafeWindow["window"].location = "http://m.facebook.com" + nextLink; }else{ var textArea = "Name,Phone \n"; jQuery.each(contacts, function(i, val){ textArea += val.n + "," + val.p + "\n"; }); jQuery("body").append(""); jQuery("#sf-fbContacts").val( textArea ); } return false; }