80 lines
2.8 KiB
Ruby
80 lines
2.8 KiB
Ruby
require 'net/http'
|
|
require 'uri'
|
|
require 'json'
|
|
|
|
class CapiTransmitter
|
|
|
|
def self.send_event(event_name, user, custom_data = {}, event_source_url = nil)
|
|
begin
|
|
pixel_id = APP_CONFIG.facebook_pixel_id
|
|
access_token = APP_CONFIG.facebook_access_token
|
|
|
|
if pixel_id.blank? || access_token.blank?
|
|
Rails.logger.warn("CapiTransmitter: Missing Facebook Pixel ID or Access Token. Skipping event #{event_name}.")
|
|
return
|
|
end
|
|
|
|
# Construct the User Data object
|
|
user_data = {
|
|
# client_ip_address: user.current_sign_in_ip,
|
|
# client_user_agent: user.user_agent # Note: User model might not have user_agent stored directly, might need to pass it or rely on what's available
|
|
}
|
|
|
|
# Enhance user data with hashed PII if available
|
|
# Facebook requires SHA256 hashing for PII
|
|
# For now, we rely on click_id and browser_id as primary keys if available
|
|
user_data[:fbc] = user.facebook_click_id if user.facebook_click_id.present?
|
|
user_data[:fbp] = user.facebook_browser_id if user.facebook_browser_id.present?
|
|
|
|
# If we have email/phone, we should hash them. But for now, let's stick to the IDs.
|
|
# Ideally we should hash email if we have it.
|
|
if user.email.present?
|
|
user_data[:em] = Digest::SHA256.hexdigest(user.email.downcase)
|
|
end
|
|
|
|
payload = {
|
|
data: [
|
|
{
|
|
event_name: event_name,
|
|
event_time: Time.now.to_i,
|
|
action_source: "website",
|
|
user_data: user_data,
|
|
custom_data: custom_data,
|
|
event_source_url: event_source_url
|
|
}
|
|
]
|
|
}
|
|
|
|
url = URI.parse("https://graph.facebook.com/v19.0/#{pixel_id}/events?access_token=#{access_token}")
|
|
|
|
http = Net::HTTP.new(url.host, url.port)
|
|
|
|
if APP_CONFIG.facebook_conversion_api_tls == false
|
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
else
|
|
http.use_ssl = true
|
|
end
|
|
|
|
request = Net::HTTP::Post.new(url.request_uri)
|
|
request['Content-Type'] = 'application/json'
|
|
request.body = payload.to_json
|
|
|
|
response = http.request(request)
|
|
|
|
if response.code.to_i >= 400
|
|
Rails.logger.error("CapiTransmitter Error: #{response.code} - #{response.body}")
|
|
puts("CapiTransmitter Error: #{response.code} - #{response.body}")
|
|
else
|
|
Rails.logger.info("CapiTransmitter Success: #{event_name} sent for User #{user.id}")
|
|
puts("CapiTransmitter Success: #{event_name} sent for User #{user.id}")
|
|
end
|
|
|
|
rescue => e
|
|
Rails.logger.error("CapiTransmitter Exception: #{e.message}")
|
|
puts("CapiTransmitter Exception: #{e.message}")
|
|
Rails.logger.error(e.backtrace.join("\n"))
|
|
puts(e.backtrace.join("\n"))
|
|
end
|
|
end
|
|
end
|