class ShopifyScrape
Public Class Methods
new(domain, username, password)
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 5 def initialize(domain, username, password) @domain = domain @username = username @password = password @cookie = login end
Public Instance Methods
payout_report(date_min=Time.zone.now.beginning_of_month, date_max=Time.zone.now.end_of_month)
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 17 def payout_report(date_min=Time.zone.now.beginning_of_month, date_max=Time.zone.now.end_of_month) url = URI("#{shopify_url}/admin/payments/payouts.json?date_min=#{date_min}&date_max=#{date_max}") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request1 = Net::HTTP::Get.new(url) request1["content-type"] = 'application/x-www-form-urlencoded' request1["cache-control"] = 'no-cache' request1["cookie"] = @cookie response = http.request(request1) raise Exception, parse_error(response.body) if response.code.to_i >= 400 JSON.parse(response.body) end
sales_report(date_min=Time.zone.now.beginning_of_month, date_max=Time.zone.now.end_of_month)
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 35 def sales_report(date_min=Time.zone.now.beginning_of_month, date_max=Time.zone.now.end_of_month) url = URI("https://analytics.shopify.com/query?q=SHOW%20orders%20AS%20%22orders%22%2C%20gross_sales%20AS%20%22gross_sales%22%2C%20discounts%20AS%20%22discounts%22%2C%20returns%20AS%20%22returns%22%2C%20net_sales%20AS%20%22net_sales%22%2C%20shipping%20AS%20%22shipping%22%2C%20taxes%20AS%20%22taxes%22%2C%20total_sales%20AS%20%22total_sales%22%20OVER%20month%20AS%20%22month%22%20FROM%20sales%20SINCE%20-11m%20UNTIL%20today%20ORDER%20BY%20%22month%22%20ASC&format=csv&source=shopify-summary&token=#{get_token}&beta=true&handle=sales_#{date_min}_#{date_max}") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Get.new(url) request["cookie"] = @cookie request["cache-control"] = 'no-cache' response = http.request(request) raise Exception, parse_error(response.body) if response.code.to_i >= 400 csv_arr = CSV.parse(response.read_body) keys = csv_arr.shift arr_of_object = csv_arr.map {|a| Hash[keys.zip(a)]} total_shipping = 0 total_taxes = 0 arr_of_object.each do |obj| total_shipping = total_shipping + obj['shipping'].to_f total_taxes = total_taxes + obj['taxes'].to_f end {shipping: total_shipping, taxes: total_taxes} end
shopify_url()
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 13 def shopify_url "https://#{@domain}.myshopify.com" end
Private Instance Methods
get_token()
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 92 def get_token url = URI("#{shopify_url}/admin/reportify/token.json") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Get.new(url) request["cookie"] = @cookie request["cache-control"] = 'no-cache' response = http.request(request) JSON.parse(response.body)['token'] end
login()
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 66 def login login_url = "#{shopify_url}/admin/auth/login" url = URI(login_url) http = Net::HTTP.new(url.host, url.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE request = Net::HTTP::Post.new(url) request["content-type"] = 'application/x-www-form-urlencoded' request["cache-control"] = 'no-cache' request.body = "login=#{@username}&password=#{@password}" response = http.request(request) # Check for invalid username/password validation_error_message = Nokogiri::HTML(response.body).css('span.validation-error__message') raise validation_error_message.text if validation_error_message.length > 0 raise 'Domain not found' if response.code.to_i == 404 raise CaptchaException, 'Captcha displayed while logging in' unless response.code.to_i == 302 # Return cookie response['set-cookie'] end
parse_error(response_body)
click to toggle source
# File lib/shopify/shopify_scrape.rb, line 107 def parse_error(response_body) begin JSON.parse(response_body)['message'] rescue JSON::ParserError # todo::Use nokogiri to parse error from html page 'Error occurred.' end end