Created
February 7, 2018 09:22
-
-
Save zbone3/e33e7fc26463c51d65c1257f9891f19a to your computer and use it in GitHub Desktop.
Simple ruby class that allows to login to Facebook via HTTP client. This is for educational purposes only, you should always use the official API.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'rest_client' | |
require 'nokogiri' | |
class FacebookLogin | |
def initialize(username, password) | |
@cookies = {} | |
@payload = {email: username, pass: password} | |
@headers = {'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'} | |
# Define login flow | |
@login_steps = [ | |
{ | |
url: 'https://mbasic.facebook.com/', | |
method: 'GET', | |
collect: [ | |
{xpath: 'input[@name="lsd"]', target: 'value', name: 'lsd'}, | |
{xpath: 'input[@name="m_ts"]', target: 'value', name: 'm_ts'}, | |
{xpath: 'input[@name="li"]', target: 'value', name: 'li'} | |
] | |
}, | |
{ | |
url: 'https://mbasic.facebook.com/login.php?refsrc=https%3A%2F%2Fmbasic.facebook.com%2F&lwv=100&login_try_number=1&refid=8', | |
method: 'POST' | |
} | |
] | |
end | |
# Global request sender for POST/GET requests | |
def send_request(url, method, headers = {}, cookies = {}, payload = {}) | |
begin | |
response = '' | |
RestClient::Request.execute( | |
url: url, | |
method: method, | |
timeout: 20, | |
headers: headers, | |
cookies: cookies, | |
payload: payload | |
) do |resp, req, result, &block| | |
# Handle redirection after login | |
if [301, 302, 307].include? resp.code | |
redirect_url = resp.headers[:location] | |
@cookies = resp.cookies || @cookies | |
response = send_request(redirect_url, 'GET', headers, @cookies) | |
else | |
response = resp | |
end | |
end | |
@cookies = response.cookies || @cookies | |
rescue Exception => e | |
puts e | |
response = nil | |
end | |
return response | |
end | |
# Collect relevant request payload data from page HTML | |
def collect_data_from_page(html, rules) | |
doc = Nokogiri::HTML(html) | |
rules.each do |collection_rule| | |
xpath = collection_rule[:xpath] | |
name = collection_rule[:name] | |
target_element = doc.at(xpath) | |
value = target_element.attr(collection_rule[:target]) | |
@payload[name] = value | |
end | |
@payload | |
end | |
# Get Facebook URLs when logged in | |
def get(url) | |
send_request(url, 'GET', @headers, @cookies) | |
end | |
def login | |
# Iterate through all login flow steps | |
result = '' | |
@login_steps.each do |step| | |
url = step[:url] | |
method = step[:method] | |
collection_rules = step[:collect] | |
# Add payload if needed | |
payload = method == 'POST' ? @payload : {} | |
result = send_request(url, method, @headers, @cookies, payload) | |
if collection_rules | |
# Collect rules present in current step, collect data from page | |
collect_data_from_page(result, collection_rules) | |
end | |
end | |
result.match('logout.php') ? true : false | |
end | |
end | |
# Usage example (be sure to change user and pass) | |
fb = FacebookLogin.new('mymailbox@lazyinbox.us', 'qwertyasdf') | |
if fb.login | |
# Login success, do your thing | |
puts fb.get('https://www.facebook.com/JimiHendrix/') | |
else | |
puts 'Login Failed' | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment