0
|
1 local Luan = require "luan:Luan.luan"
|
|
2 local error = Luan.error
|
|
3 local ipairs = Luan.ipairs or error()
|
|
4 local to_string = Luan.to_string or error()
|
|
5 local stringify = Luan.stringify or error()
|
|
6 local String = require "luan:String.luan"
|
|
7 local trim = String.trim or error()
|
|
8 local to_lower = String.lower or error()
|
|
9 local digest_message = String.digest_message or error()
|
|
10 local Time = require "luan:Time.luan"
|
|
11 local time_now = Time.now or error()
|
|
12 local Number = require "luan:Number.luan"
|
|
13 local long = Number.long or error()
|
|
14 local Parsers = require "luan:Parsers.luan"
|
|
15 local json_string = Parsers.json_string or error()
|
|
16 local json_parse = Parsers.json_parse or error()
|
|
17 local Io = require "luan:Io.luan"
|
|
18 local uri = Io.uri or error()
|
|
19 local Config = require "site:/private/Config.luan"
|
|
20 local access_token = Config.facebook.access_token or error()
|
|
21 local Shared = require "site:/lib/Shared.luan"
|
|
22 local is_test = not Shared.is_production
|
|
23 local Logging = require "luan:logging/Logging.luan"
|
|
24 local logger = Logging.logger "Facebook"
|
|
25
|
|
26
|
|
27 local pixel_id = "667025338202310"
|
|
28 local url = "https://graph.facebook.com/v17.0/"..pixel_id.."/events"
|
|
29
|
|
30
|
|
31 local Facebook = {}
|
|
32
|
|
33 local function call(events)
|
|
34 local user_data = events[1].user_data -- assume they are all the same
|
|
35 local em = user_data.em
|
|
36 if em ~= nil then
|
|
37 em = to_lower(trim(em))
|
|
38 user_data.em = digest_message("SHA-256",em)
|
|
39 end
|
|
40 local external_id = user_data.external_id
|
|
41 if external_id ~= nil then
|
|
42 external_id = to_string(external_id)
|
|
43 if is_test then
|
|
44 external_id = "test_"..external_id
|
|
45 end
|
|
46 user_data.external_id = digest_message("SHA-256",external_id)
|
|
47 end
|
|
48 if is_test then
|
|
49 for _, event in ipairs(events) do
|
|
50 event.event_name = "test_"..event.event_name
|
|
51 end
|
|
52 end
|
|
53 logger.info(json_string(events))
|
|
54 local parameters = {
|
|
55 access_token = access_token
|
|
56 data = json_string(events)
|
|
57 }
|
|
58 if is_test then
|
|
59 parameters.test_event_code = "TEST"
|
|
60 end
|
|
61 local options = {
|
|
62 method = "POST"
|
|
63 parameters = parameters
|
|
64 }
|
|
65 return uri(url,options).read_text()
|
|
66 end
|
|
67 Facebook.call = call
|
|
68
|
|
69 function Facebook.track_visit(user)
|
|
70 local user_data = {
|
|
71 em = user.email or error()
|
|
72 external_id = user.id or error()
|
|
73 }
|
|
74 local event_time = long( time_now() // 1000 )
|
|
75 local events = {
|
|
76 {
|
|
77 event_name = "Contact"
|
|
78 event_time = event_time
|
|
79 user_data = user_data
|
|
80 action_source = "other"
|
|
81 }
|
|
82 {
|
|
83 event_name = "Purchase"
|
|
84 event_time = event_time
|
|
85 user_data = user_data
|
|
86 action_source = "other"
|
|
87 custom_data = {
|
|
88 value = 1
|
|
89 currency = "USD"
|
|
90 }
|
|
91 }
|
|
92 }
|
|
93 try
|
|
94 local result = call(events)
|
|
95 logger.info(result)
|
|
96 catch e
|
|
97 logger.error(e.."\n"..e.response_content.."\nevents = "..stringify(events))
|
|
98 end
|
|
99 end
|
|
100
|
|
101 return Facebook
|