decentralizuj / moriarty
Moriarty - Tool to check social networks for available username
- GIF preview v-0.2.0 - without latest changes'
Gem is still in alpha, many things will be added (like scrapping info from social networks) Breaking changes are highly possible, so I do not suggest use of this gem except for development and test That means, do not use it in production services, otherwise feel free to play with it.
Moriarty
Tool to check social networks for available username.
Idea from python tool - sherlock
What it do
Search multiple social networks for free username.
It's reverse from Sherlock, so not-found username is success.
Argument --hunt
will run search like sherlock would, looking for valid users.
How to install
Clone repo and install dependencies:
# Moriarty use rest-client, nokogiri and colorize gems
git clone https://github.com/decentralizuj/moriarty.git && cd moriarty && bundle install
Or install from rubygems:
DISCLAIMER GitHub repository is updated before Rubygems. Before v-1.0.0 is released, recommended way is to clone repo,…
First code is never good enough, especially in Ruby, where everything could be done in many different ways. I'll start with initializer:
# Set username and site for search request
# exclude 'https', #make_url will add it for you
# To use different protocol, set it as third parameter
#
# @jim = Moriarty.new( :moriarty, 'example.com', :http )
# => @jim.user == 'moriarty'
# => @jim.url == 'http://example.com/'
def initialize( name = '', site = 'github.com', prot = :https )
@user = name.to_s
@url = make_url site, prot
end
Here we added 'make_url(site_name, protocol)'. This method purpose is to construct URL
from string, so we can use dev.to
instead of https://dev.to
.
# create URL from site name, add 'https' if needed
# @jim.make_url 'github.com'
# => 'https://github.com/'
def make_url( link, prot = :https )
prot = nil if link.to_s.start_with? prot.to_s
url = prot.nil? ? link.to_s : prot.to_s + '://' + link.to_s
url += '/' unless url.end_with?('/')
return url
end
Here we can add parameter site: github.com
in Moriarty#go
, without https://
. In first part I said that we'll create setters manually. Now we can use #make_url
in setter to create link from string.
# Set URL from site name and protocol(optional)
# @jim.url = 'github.com'
# => @jim.url == 'https://github.com'
def url=( link, prot = :https )
@url = make_url link, prot
end
# Set username from string or :symbol
# @jim.user = :moriarty
# => @jim.user == 'moriarty'
def user=( name )
@user = name.to_s
end
It's time to edit Moriarty#go
, method in charge to send request.
# execute request (args are optional)
# @jim.go site: 'github.com', user: 'mynickname'
# => true/false
# -> @jim.response (.code, .headers, .body)
# -> @jim.html (page HTML if request success)
def go( opt = {} )
# define username to search, or use default
opt[:user] ||= @user
# if option 'site:' is 'nil', use default
# otherwise construct url with '#make_url'
url = opt[:site].nil? ? @url : make_url(opt[:site])
# create url for request, and send
uri = url + opt[:user]
@response = RestClient.get uri
# try to scrap data from page
@html = Nokogiri::HTML @response
# return true or false
return @success = true
rescue
return @success = false
end
# add alias search, just because of convention
alias search go
There's one more thing that we should add here, to check for response success:
# Check does request succeeded or not
# @jim.success?
# => true/false
def success?
@success == true
end
Create method to execute search request, and output data in terminal. Default method is search for free username, in that case fail requests mean username is free. If we define :hunt
as type parameter, we will search for registered user.
# Find method is responsible to handle all other methods
# and to tell use final results
def find!( user = @user, web = @url, type = :search )
@jim.go user: user, site: site
name = print_name(user).to_s
site = print_url(web).to_s
case
when type.to_sym == :hunt && @jim.success?
puts "#{name} found on #{site}"
when type.to_sym == :hunt && !@jim.success?
puts "#{name} not found #{site}"
when @jim.success?
puts "#{name} is taken on #{site}"
else
puts "#{name} is free on #{site}"
end
end
Methods #print_name
and #print_url
prepare strings for printing in cli. Names are cleaned from signs like @, #, /u/
, and site is stripped of extensions and capitalized.
# Remove extensions from domain name
# Moriarty.print_url('https://www.github.com')
# => 'github'
def print_url( site )
# define site from string
# make name empty string
site, name = site.to_s, ''
# if site start with 'http', try to remove 'https'
# if not, then remove 'http'
if site.start_with?('http')
site.gsub!("https://", '') or site.gsub!("http://", '')
end
# remove 'www.' from sitename, if included
site.gsub!("www.", '') if site.start_with?('www.')
# split domain on '.' to get extension, and remove it
ext = site.to_s.split('.').last
name = site.gsub(".#{ext}", '')
# if ext is longer then 5, routes contain more data
# example: 'rubygems.org/profiles/*'
name = name.split('/').first if ext.size < 5
# first letter uppercase
return name.capitalize
end
# Remove extensions from username
# @jim.print_name('@moriarty')
# => 'moriarty'
def print_name( name )
name.gsub!('@','') if name.to_s.start_with?('@')
name.gsub!('#','') if name.to_s.start_with?('#')
name.gsub!('/u/','') if name.to_s.start_with?('/u/')
return name
end
Now we have class
with all objects needed to do what we want it to do. For sites that need to check html
for success (like twitter), there's variable @html ( getter Moriarty.html ).
Let's run search from terminal. How? We need to define sites to search, and usernames. We'll define sites as array, and accept usernames as arguments. If we add --hunt
, it will run in hunt mode, otherwise in default (search for free name).
# define sites to search
SITES = [ 'github.com', 'dev.to' ].freeze
# run hunt if arg --hunt included, otherwise search
hunt = ARGV.include?('--hunt') ? :hunt : :search
unless ARGV.empty?
@jim = Moriarty.new :jim
ARGV.each do |user|
SITES.each do |site|
next if user == '--hunt'
@jim.find! user, site, hunt
end
end
end
Thanks all for reading this post(s), don't forget to share content...somewhere :) In next article I'll pack and compile this into a gem.
Top comments (0)