Skip to content

Instantly share code, notes, and snippets.

@zbone3
Created February 7, 2018 09:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zbone3/e33e7fc26463c51d65c1257f9891f19a to your computer and use it in GitHub Desktop.
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.
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