class IgApi::Http

Public Class Methods

__obj() click to toggle source
# File lib/ig_api/http.rb, line 22
def self.__obj
  @@obj
end
__obj=(value) click to toggle source
# File lib/ig_api/http.rb, line 18
def self.__obj=(value)
  @@obj = value
end
compute_hash(data) click to toggle source
# File lib/ig_api/http.rb, line 14
def self.compute_hash(data)
  OpenSSL::HMAC.hexdigest OpenSSL::Digest.new('sha256'), Constants::PRIVATE_KEY[:SIG_KEY], data
end
create_md5(data) click to toggle source
# File lib/ig_api/http.rb, line 40
def self.create_md5(data)
  Digest::MD5.hexdigest(data).to_s
end
generate_device_id() click to toggle source
# File lib/ig_api/http.rb, line 44
def self.generate_device_id
  timestamp = Time.now.to_i.to_s
  'android-' + create_md5(timestamp)[0..16]
end
generate_rank_token(pk) click to toggle source
# File lib/ig_api/http.rb, line 115
def self.generate_rank_token(pk)
  format('%s_%s', pk, IgApi::Http.generate_uuid)
end
generate_signature(data) click to toggle source
# File lib/ig_api/http.rb, line 49
def self.generate_signature(data)
  data = data.to_json
  compute_hash(data) + '.' + data
end
generate_uuid() click to toggle source
# File lib/ig_api/http.rb, line 32
def self.generate_uuid
  'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.gsub(/[xy]/) do |c|
    r = (Random.rand * 16).round | 0
    v = c == 'x' ? r : (r & 0x3 | 0x8)
    c.gsub(c, v.to_s(16))
  end.downcase
end
singleton() click to toggle source
# File lib/ig_api/http.rb, line 26
def self.singleton
  @@obj = Http.new unless defined? @@obj

  @@obj
end

Public Instance Methods

exec() click to toggle source
# File lib/ig_api/http.rb, line 69
def exec
  http @data
end
get(url) click to toggle source
# File lib/ig_api/http.rb, line 73
def get(url)
  @data = {method: 'GET', url: url}
  self
end
http(args) click to toggle source
# File lib/ig_api/http.rb, line 78
def http(args)
  args[:url] = URI.parse(args[:url])
  http = Net::HTTP.new(args[:url].host, args[:url].port,
                       ENV['INSTAGRAM_PROXY_HOST'], ENV['INSTAGRAM_PROXY_PORT'])
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  request = nil
  if args[:method] == 'POST'
    request = Net::HTTP::Post.new(args[:url].path)
  elsif args[:method] == 'GET'
    request = Net::HTTP::Get.new(args[:url].path + (!args[:url].query.nil? ? '?' + args[:url].query : ''))
  elsif args[:method] == 'MULTIPART'
    request = Net::HTTP::Post::Multipart.new args[:url].path, args[:body],
                                             'User-Agent': args[:ua],
                                             Accept: IgApi::Constants::HEADER[:accept],
                                             'Accept-Encoding': IgApi::Constants::HEADER[:encoding],
                                             'Accept-Language': 'en-US',
                                             'X-IG-Capabilities': IgApi::Constants::HEADER[:capabilities],
                                             'X-IG-Connection-Type': IgApi::Constants::HEADER[:type],
                                             Cookie: args[:session] || ''
  end

  unless args[:method] == 'MULTIPART'
    request.initialize_http_header('User-Agent': args[:ua],
                                   Accept: IgApi::Constants::HEADER[:accept],
                                   'Accept-Encoding': IgApi::Constants::HEADER[:encoding],
                                   'Accept-Language': 'en-US',
                                   'X-IG-Capabilities': IgApi::Constants::HEADER[:capabilities],
                                   'X-IG-Connection-Type': IgApi::Constants::HEADER[:type],
                                   Cookie: args[:session] || '')

    request.body = args.key?(:body) ? args[:body] : nil
  end

  http.request(request)
end
multipart(url, body = nil) click to toggle source
# File lib/ig_api/http.rb, line 59
def multipart(url, body = nil)
  @data = { method: 'MULTIPART', url: url, body: body }
  self
end
post(url, body = nil) click to toggle source
# File lib/ig_api/http.rb, line 54
def post(url, body = nil)
  @data = { method: 'POST', url: url, body: body }
  self
end
with(data) click to toggle source
# File lib/ig_api/http.rb, line 64
def with(data)
  data.each { |k, v| @data[k] = v }
  self
end