Gutza / FacebookGroupMemberGrapher

A simple tool for creating graphs illustrating who invited whom on Facebook groups.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

What is this?

This is a really simple tool which allows you to generate graphs showing who invited whom on your Facebook groups. You need administrative access to the group you want to graph.

How does it do that?

This is just a parser for "dead" text, and it works offline. There is no online tool that needs access to your group or account, this is 100% DIY on your computer.

What do I need?

Everything you need is open source, or at least free – you don't need to buy any software license. You will need:

  1. Administrative access to a Facebook group
  2. A computer (everything is cross-platform, the OS is irrelevant)
  3. The .NET Core SDK – make sure you install the SDK, so you can build the sources!
  4. Some software to render DOT files; I like Gephi, but there are several options
  5. The sources for this project

What do I get?

You get a DOT file, which you can then render using any number of graph generation tools, such as graphviz. I used Gephi to render this for a group I administer (and yes, you can render the names, too; I chose not to, for privacy reasons):

Sample output using Gephi

Using this app

Using the app is a little cumbersome, but that's the price you pay in order to avoid integration with other tools. Make sure you carefully go through all steps, it's easy to miss some, and it won't work if you miss any:

  1. Open your Facebook group's "Members" section
  2. Above "All Members" there's a dropdown which defaults to "Default" – change it to "Join Date"
  3. Scroll down until you reach the very end. Facebook loads the list in increments, this is tedious and takes time. I use the End key repeatedly, I find it easier than scrolling using the mouse wheel.
  4. The last person you see should be the founder of the group. Even if the founder has left the group, we'll call the last person in the list the founder for the rest of this document.
  5. Click once somewhere in the founder's details, after his name; DO NOT CLICK ANYWHERE AGAIN UNTIL THIS DOCUMENT TELLS YOU OTHERWISE!
  6. Notice that you are a monkey who takes orders from a document; take a couple of moments to contemplate on that
  7. Scroll back up to the top
  8. Holding the Shift key, click once somewhere inside the label "All members"
  9. You should now have the entire list of members selected. Copy it and paste it in a new text document
  10. Make sure the first thing in the text document is the name of the newest member in the group (your clipboard will contain some clutter at the top)
  11. Save the text file, and save its full path separately for future reference
  12. Open a command line console, go to the folder where you saved these sources, and build the project – you should be able to simply execute dotnet build with no parameters
  13. Execute the app using the following syntax: dotnet run --no-build "file", where file is the full path and filename of the text file you saved before
  14. If everything works out, you should get the list of members in the console, and a new file with the same path and filename as your text file, but with extension DOT.
  15. Use a graph rendering tool to render your DOT file.

But does it scale?

Yes, it scales reasonably well. I tested it on a +20K group, and it worked perfectly. The only hard limitation I encountered was Facebook's unwillingness to share data on more than roughly 10K users (see below); apart from that, everything worked out perfectly.

Known limitations

  1. Duplicate people's names in the group are handled poorly, but that's on Facebook (see below)
  2. There's a limit of roughly 10K people you can ever see in the history, but that's also on Facebook(*)
  3. You miss parts of the history when people leave the group and then re-join; this is partly on Facebook, but also partly on this app, because it currently only allows you to process a single snapshot of the history(*)
  4. There is currently no option to anonymize the data; that's on this app
  5. There is currently no option to filter the DOT output, but I'm not sure that should ever be included in this app

(*) I suggest you save multiple versions of your group's history as text files. Perhaps this app will process them, in a future version; perhaps you will – just don't lose that history, because you might not get it back.

How does it handle duplicate names?

Short answer: as best it can.

Facebook shows group additions like so:

Jane Doe
Added by John Doe yesterday

Jane Doe is listed with her full details (image, profile link, short info). If we parsed the HTML content instead of the plain text representation, we could distinguish between two accounts with the name Jane Doe. On the other hand, John Doe is only shown as plain text – even in the HTML source. There is nothing distinguishable between two people named John Doe when they add people to the group.

Since there's no way of knowing who added a certain person to the group, that means we don't really care to ever distinguish between duplicate accounts – it doesn't matter that you can distinguish between incoming nodes if you can't distinguish the outgoing nodes on an edge.

So the solution I implemented was this: all Jane Does are separate nodes, but all outgoing references use the first instance of Jane Doe that was encountered. The names in the labels are Jane Doe, Jane Doe@2, Jane Doe@3, etc. The code is not testing if it generates new duplicates by appending these indices because I was lazy.

About

A simple tool for creating graphs illustrating who invited whom on Facebook groups.

License:MIT License


Languages

Language:C# 100.0%