jam-cloud/ruby/lib/jam_ruby/lib/capi_transmitter.rb

87 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, test_event_code = nil)
begin
puts("CapiTransmitter: Sending event #{event_name} for User #{user.id}")
pixel_id = APP_CONFIG.facebook_pixel_id
access_token = APP_CONFIG.facebook_access_token
if pixel_id.blank? || access_token.blank?
puts("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
}
if !user.facebook_click_id.present? ||
user.origin_utm_source != APP_CONFIG.facebook_ad_source
return
end
# 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
}
]
}
if test_event_code.present?
payload[:test_event_code] = test_event_code
end
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
puts("CapiTransmitter Error: #{response.code} - #{response.body}")
else
puts("CapiTransmitter Success: #{event_name} sent for User #{user.id}")
end
rescue => e
puts("CapiTransmitter Exception: #{e.message}")
puts(e.backtrace.join("\n"))
end
end
end