adtekio_adnetworks 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/Gemfile +24 -0
- data/README.md +333 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/adtekio_adnetworks.gemspec +297 -0
- data/lib/adtekio_adnetworks.rb +6 -0
- data/lib/adtekio_adnetworks/api_key_scrapers.rb +59 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/adcolony.rb +20 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/applift.rb +13 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/applovin.rb +13 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/chartboost.rb +18 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/crossinstall.rb +13 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/leadbolt.rb +18 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/loopme.rb +12 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/mdotm.rb +22 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/revmob.rb +22 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/tapjoy.rb +19 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/unilead.rb +13 -0
- data/lib/adtekio_adnetworks/api_key_scrapers/vungle.rb +23 -0
- data/lib/adtekio_adnetworks/importers.rb +58 -0
- data/lib/adtekio_adnetworks/importers/cost/adcolony.rb +43 -0
- data/lib/adtekio_adnetworks/importers/cost/adquant.rb +68 -0
- data/lib/adtekio_adnetworks/importers/cost/appia.rb +47 -0
- data/lib/adtekio_adnetworks/importers/cost/applifier.rb +64 -0
- data/lib/adtekio_adnetworks/importers/cost/applift.rb +41 -0
- data/lib/adtekio_adnetworks/importers/cost/applovin.rb +52 -0
- data/lib/adtekio_adnetworks/importers/cost/bidmotion.rb +82 -0
- data/lib/adtekio_adnetworks/importers/cost/chartboost.rb +40 -0
- data/lib/adtekio_adnetworks/importers/cost/crossinstall.rb +34 -0
- data/lib/adtekio_adnetworks/importers/cost/facebook.rb +39 -0
- data/lib/adtekio_adnetworks/importers/cost/fractionalmedia.rb +104 -0
- data/lib/adtekio_adnetworks/importers/cost/fyber.rb +54 -0
- data/lib/adtekio_adnetworks/importers/cost/gamegenetics.rb +44 -0
- data/lib/adtekio_adnetworks/importers/cost/glispa.rb +59 -0
- data/lib/adtekio_adnetworks/importers/cost/googleadwords.rb +99 -0
- data/lib/adtekio_adnetworks/importers/cost/jampp.rb +57 -0
- data/lib/adtekio_adnetworks/importers/cost/leadbolt.rb +43 -0
- data/lib/adtekio_adnetworks/importers/cost/lifestreet.rb +49 -0
- data/lib/adtekio_adnetworks/importers/cost/loopme.rb +63 -0
- data/lib/adtekio_adnetworks/importers/cost/matomy.rb +65 -0
- data/lib/adtekio_adnetworks/importers/cost/mdotm.rb +69 -0
- data/lib/adtekio_adnetworks/importers/cost/mmg.rb +67 -0
- data/lib/adtekio_adnetworks/importers/cost/mnectar.rb +45 -0
- data/lib/adtekio_adnetworks/importers/cost/moboqo.rb +33 -0
- data/lib/adtekio_adnetworks/importers/cost/mobpartner.rb +46 -0
- data/lib/adtekio_adnetworks/importers/cost/nanigans.rb +114 -0
- data/lib/adtekio_adnetworks/importers/cost/revmob.rb +44 -0
- data/lib/adtekio_adnetworks/importers/cost/rtbmob.rb +48 -0
- data/lib/adtekio_adnetworks/importers/cost/startapp.rb +47 -0
- data/lib/adtekio_adnetworks/importers/cost/supersonic.rb +77 -0
- data/lib/adtekio_adnetworks/importers/cost/tapjoy.rb +42 -0
- data/lib/adtekio_adnetworks/importers/cost/tokenads.rb +46 -0
- data/lib/adtekio_adnetworks/importers/cost/unilead.rb +39 -0
- data/lib/adtekio_adnetworks/importers/cost/vungle.rb +58 -0
- data/lib/adtekio_adnetworks/importers/cost_import.rb +13 -0
- data/lib/adtekio_adnetworks/importers/revenue/adcolony.rb +67 -0
- data/lib/adtekio_adnetworks/importers/revenue/applifier.rb +55 -0
- data/lib/adtekio_adnetworks/importers/revenue/applovin.rb +58 -0
- data/lib/adtekio_adnetworks/importers/revenue/chartboost.rb +43 -0
- data/lib/adtekio_adnetworks/importers/revenue/flurry.rb +85 -0
- data/lib/adtekio_adnetworks/importers/revenue/fyber.rb +61 -0
- data/lib/adtekio_adnetworks/importers/revenue/hypr_mx.rb +69 -0
- data/lib/adtekio_adnetworks/importers/revenue/lifestreet.rb +59 -0
- data/lib/adtekio_adnetworks/importers/revenue/mdotm.rb +38 -0
- data/lib/adtekio_adnetworks/importers/revenue/mopub.rb +54 -0
- data/lib/adtekio_adnetworks/importers/revenue/nexage.rb +71 -0
- data/lib/adtekio_adnetworks/importers/revenue/supersonic.rb +73 -0
- data/lib/adtekio_adnetworks/importers/revenue/tapsense.rb +38 -0
- data/lib/adtekio_adnetworks/importers/revenue/trialpay.rb +41 -0
- data/lib/adtekio_adnetworks/importers/revenue/vungle.rb +75 -0
- data/lib/adtekio_adnetworks/importers/revenue_import.rb +27 -0
- data/lib/adtekio_adnetworks/postbacks.rb +193 -0
- data/lib/adtekio_adnetworks/postbacks/aarki.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/adaction.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/adcash.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/adcolony.rb +90 -0
- data/lib/adtekio_adnetworks/postbacks/adgorithms.rb +74 -0
- data/lib/adtekio_adnetworks/postbacks/adjapon_nend.rb +39 -0
- data/lib/adtekio_adnetworks/postbacks/adknowledge.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/admob.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/adp.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/adperio.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/adquant.rb +39 -0
- data/lib/adtekio_adnetworks/postbacks/adstract.rb +15 -0
- data/lib/adtekio_adnetworks/postbacks/adxperience.rb +16 -0
- data/lib/adtekio_adnetworks/postbacks/airpush.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/app_chocolate.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/appfload.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/appia.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/appintheair.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/applifier.rb +49 -0
- data/lib/adtekio_adnetworks/postbacks/applift.rb +88 -0
- data/lib/adtekio_adnetworks/postbacks/applovin.rb +127 -0
- data/lib/adtekio_adnetworks/postbacks/appnext.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/appredeem.rb +33 -0
- data/lib/adtekio_adnetworks/postbacks/appsfire.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/appturbo.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/apsalar.rb +21 -0
- data/lib/adtekio_adnetworks/postbacks/bee7.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/bidmotion.rb +80 -0
- data/lib/adtekio_adnetworks/postbacks/blindferretmedia.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/chartboost.rb +116 -0
- data/lib/adtekio_adnetworks/postbacks/cheetah.rb +32 -0
- data/lib/adtekio_adnetworks/postbacks/clickky.rb +30 -0
- data/lib/adtekio_adnetworks/postbacks/covus.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/crossinstall.rb +26 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_ameba.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_amoad.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_imobile.rb +43 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_kjnw.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_maio.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_nend.rb +40 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_smartc.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/cyberagent_smartnews.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/cyberz_asta.rb +26 -0
- data/lib/adtekio_adnetworks/postbacks/cyberz_bead.rb +26 -0
- data/lib/adtekio_adnetworks/postbacks/cyberz_imobile.rb +28 -0
- data/lib/adtekio_adnetworks/postbacks/cyberz_nend.rb +30 -0
- data/lib/adtekio_adnetworks/postbacks/datalead.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/eccrine.rb +80 -0
- data/lib/adtekio_adnetworks/postbacks/eeline.rb +50 -0
- data/lib/adtekio_adnetworks/postbacks/f5.rb +30 -0
- data/lib/adtekio_adnetworks/postbacks/fiksu.rb +43 -0
- data/lib/adtekio_adnetworks/postbacks/fiksu_applift.rb +31 -0
- data/lib/adtekio_adnetworks/postbacks/fractionalmedia.rb +78 -0
- data/lib/adtekio_adnetworks/postbacks/fyber.rb +36 -0
- data/lib/adtekio_adnetworks/postbacks/gamegenetics.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/ginga.rb +26 -0
- data/lib/adtekio_adnetworks/postbacks/glispa.rb +96 -0
- data/lib/adtekio_adnetworks/postbacks/googleadwords.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/growmobile.rb +36 -0
- data/lib/adtekio_adnetworks/postbacks/heyzap.rb +51 -0
- data/lib/adtekio_adnetworks/postbacks/inmobi.rb +50 -0
- data/lib/adtekio_adnetworks/postbacks/inneractive.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/instal.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/iqu.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/ironsource.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/jampp.rb +48 -0
- data/lib/adtekio_adnetworks/postbacks/jestadigital.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/jumpramp.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/jumptap.rb +23 -0
- data/lib/adtekio_adnetworks/postbacks/leadbolt.rb +29 -0
- data/lib/adtekio_adnetworks/postbacks/lifestreet.rb +97 -0
- data/lib/adtekio_adnetworks/postbacks/liftoff.rb +66 -0
- data/lib/adtekio_adnetworks/postbacks/loopme.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/magic_solver.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/marimedia.rb +20 -0
- data/lib/adtekio_adnetworks/postbacks/matomy.rb +59 -0
- data/lib/adtekio_adnetworks/postbacks/mdotm.rb +116 -0
- data/lib/adtekio_adnetworks/postbacks/misterbell.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/mmg.rb +20 -0
- data/lib/adtekio_adnetworks/postbacks/mnectar.rb +22 -0
- data/lib/adtekio_adnetworks/postbacks/moblin.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/moboqo.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/mobpartner.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/mopub.rb +30 -0
- data/lib/adtekio_adnetworks/postbacks/motive_interactive.rb +32 -0
- data/lib/adtekio_adnetworks/postbacks/mundo.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/nanigans.rb +38 -0
- data/lib/adtekio_adnetworks/postbacks/nativex.rb +30 -0
- data/lib/adtekio_adnetworks/postbacks/neodau.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/neverblue.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/operamedia.rb +39 -0
- data/lib/adtekio_adnetworks/postbacks/pandora.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/phunware.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/pirasin.rb +16 -0
- data/lib/adtekio_adnetworks/postbacks/playhaven.rb +31 -0
- data/lib/adtekio_adnetworks/postbacks/pocketmath.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/propeller.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/quixey.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/realzeit.rb +60 -0
- data/lib/adtekio_adnetworks/postbacks/remerge.rb +66 -0
- data/lib/adtekio_adnetworks/postbacks/revmob.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/ripple.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/roostr.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/rtbcom.rb +28 -0
- data/lib/adtekio_adnetworks/postbacks/septeni.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/seven_games.rb +51 -0
- data/lib/adtekio_adnetworks/postbacks/startapp.rb +48 -0
- data/lib/adtekio_adnetworks/postbacks/supersonic.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/tapjoy.rb +36 -0
- data/lib/adtekio_adnetworks/postbacks/taptica.rb +21 -0
- data/lib/adtekio_adnetworks/postbacks/targetcircle.rb +41 -0
- data/lib/adtekio_adnetworks/postbacks/todacell.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/tokenads.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/trademob.rb +48 -0
- data/lib/adtekio_adnetworks/postbacks/trademob_magic_solver.rb +22 -0
- data/lib/adtekio_adnetworks/postbacks/trialpay.rb +18 -0
- data/lib/adtekio_adnetworks/postbacks/unilead.rb +78 -0
- data/lib/adtekio_adnetworks/postbacks/uppsmobi.rb +19 -0
- data/lib/adtekio_adnetworks/postbacks/vungle.rb +33 -0
- data/lib/adtekio_adnetworks/postbacks/w4.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/webmedia.rb +17 -0
- data/lib/adtekio_adnetworks/postbacks/yahoo.rb +20 -0
- data/lib/adtekio_adnetworks/postbacks/youappi.rb +116 -0
- data/lib/adtekio_adnetworks/postbacks/zemail.rb +19 -0
- data/test/helper.rb +78 -0
- data/test/unit/postbacks/test_chartboost.rb +105 -0
- data/test/unit/postbacks/test_mdotm.rb +35 -0
- data/test/unit/postbacks/test_playhaven.rb +76 -0
- data/test/unit/postbacks/test_trademob_magic_solver.rb +24 -0
- data/test/unit/postbacks/test_unilead.rb +67 -0
- data/test/unit/test_api_key_scrapers.rb +302 -0
- data/test/unit/test_base_postback_class.rb +82 -0
- data/test/unit/test_cost_importers.rb +12 -0
- data/test/unit/test_postbacks.rb +33 -0
- data/test/unit/test_postbacks_definition.rb +111 -0
- data/test/unit/test_revenue_importers.rb +12 -0
- metadata +500 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Appia
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:username, :password]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
uri = Addressable::URI.
|
10
|
+
parse("https://via.appia.com/pss/api/report/advertiser/performance.json")
|
11
|
+
|
12
|
+
uri.query_values = {
|
13
|
+
:startDate => from.strftime("%Y-%m-%d"),
|
14
|
+
:endDate => till.strftime("%Y-%m-%d"),
|
15
|
+
}
|
16
|
+
|
17
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
18
|
+
req.basic_auth credentials.username, credentials.password
|
19
|
+
|
20
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
21
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
22
|
+
http.request(req)
|
23
|
+
end
|
24
|
+
|
25
|
+
results = JSON.parse(res.body, :symbolize_names => true)
|
26
|
+
results[:performance][:campaigns].map do |campaign|
|
27
|
+
campaign[:days].map do |metrics|
|
28
|
+
|
29
|
+
clicks =
|
30
|
+
metrics[:tiers].map {|tier| tier[:clickCount].to_i}.inject(:+)
|
31
|
+
installs =
|
32
|
+
metrics[:tiers].map {|tier| tier[:installCount].to_i}.inject(:+)
|
33
|
+
spends = metrics[:tiers].map {|tier| tier[:spend].to_f}.inject(:+)
|
34
|
+
|
35
|
+
next if spends.to_f == 0
|
36
|
+
|
37
|
+
{
|
38
|
+
:date => Date.parse(metrics[:date]),
|
39
|
+
:campaign => campaign[:campaignName],
|
40
|
+
:clicks => clicks,
|
41
|
+
:conversions => installs,
|
42
|
+
:amount => spends,
|
43
|
+
}
|
44
|
+
end.compact
|
45
|
+
end.flatten
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Applifier
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
DateSteps = 5
|
5
|
+
|
6
|
+
define_required_credentials do
|
7
|
+
[:api_key]
|
8
|
+
end
|
9
|
+
|
10
|
+
def csv_data(from, till)
|
11
|
+
uri = Addressable::URI.
|
12
|
+
parse("https://gameads-admin.applifier.com/stats/acquisition-api")
|
13
|
+
|
14
|
+
uri.query_values = {
|
15
|
+
:apikey => credentials.api_key,
|
16
|
+
:scale => "day",
|
17
|
+
:start => from.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
|
18
|
+
:end => till.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
|
19
|
+
:fields => "views,clicks,installs,spend",
|
20
|
+
:splitBy => "campaign,country",
|
21
|
+
}
|
22
|
+
|
23
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
24
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
25
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
26
|
+
http.request(req)
|
27
|
+
end
|
28
|
+
|
29
|
+
if res.code =~ /3../
|
30
|
+
uri = Addressable::URI.parse(res.header["Location"])
|
31
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
32
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
33
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
34
|
+
http.request(req)
|
35
|
+
end.body
|
36
|
+
else
|
37
|
+
res.body
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def campaign_costs(from,till)
|
42
|
+
csv_options = {
|
43
|
+
:col_sep => ",",
|
44
|
+
:quote_char => '"',
|
45
|
+
:headers => :first_row,
|
46
|
+
}
|
47
|
+
|
48
|
+
from.step(till, DateSteps).map do |start_date|
|
49
|
+
end_date = [start_date + DateSteps, till].min
|
50
|
+
CSV.new(csv_data(start_date, end_date), csv_options).to_a.map do |row|
|
51
|
+
country = row["Country code"].try(:downcase)
|
52
|
+
{
|
53
|
+
:date => Date.strptime(row["Date"], '%Y-%m-%d'),
|
54
|
+
:campaign => row["Target name"],
|
55
|
+
:impressions => row["views"].to_i,
|
56
|
+
:clicks => row['clicks'].to_i,
|
57
|
+
:conversions => row['installs'].to_i,
|
58
|
+
:amount => row['spend'].to_f,
|
59
|
+
:target_country => country[0..1],
|
60
|
+
}
|
61
|
+
end.compact
|
62
|
+
end.flatten
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Applift
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
DateSteps = 5
|
5
|
+
|
6
|
+
define_required_credentials do
|
7
|
+
[:api_key]
|
8
|
+
end
|
9
|
+
|
10
|
+
def campaign_costs(from, till)
|
11
|
+
from.step(till, DateSteps).map do |start_date|
|
12
|
+
end_date = [start_date + DateSteps - 1, till].min
|
13
|
+
uri = Addressable::URI.
|
14
|
+
parse("https://partner.applift.com/stats/stats.json")
|
15
|
+
|
16
|
+
uri.query_values = {
|
17
|
+
:api_key => credentials.api_key,
|
18
|
+
:start_date => start_date.strftime("%Y-%m-%d"),
|
19
|
+
:end_date => end_date.strftime("%Y-%m-%d"),
|
20
|
+
'group[]' => ["Offer.name", "Stat.date"]
|
21
|
+
}
|
22
|
+
|
23
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
24
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
25
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
26
|
+
http.request(req)
|
27
|
+
end
|
28
|
+
|
29
|
+
JSON.parse(res.body)['data'].reject do |campaign|
|
30
|
+
campaign["cost"] == "$0.00" || campaign["offer"].blank?
|
31
|
+
end.map do |campaign|
|
32
|
+
{
|
33
|
+
:date => Date.parse(campaign['date']),
|
34
|
+
:campaign => campaign['offer'].gsub(/(, private)/i,'').gsub(/( private)/i,'').gsub(/(, rtl2 private)/i,''),
|
35
|
+
:conversions => campaign['conversions'].to_i,
|
36
|
+
:amount => campaign['cost'].tr(',$','').to_f
|
37
|
+
}
|
38
|
+
end
|
39
|
+
end.flatten
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Applovin
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:api_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_name(country, device, date, campaign_name)
|
9
|
+
name_parts = [country, device]
|
10
|
+
|
11
|
+
/\{(.*)\}/i.match(campaign_name) do |m|
|
12
|
+
name_parts.push($1)
|
13
|
+
end
|
14
|
+
|
15
|
+
name_parts.join('_').downcase
|
16
|
+
end
|
17
|
+
|
18
|
+
def campaign_costs(from, till)
|
19
|
+
uri = Addressable::URI.parse("https://r.applovin.com/report")
|
20
|
+
uri.query_values = {
|
21
|
+
:api_key => credentials.api_key,
|
22
|
+
:start => from.to_s,
|
23
|
+
:end => till.to_s,
|
24
|
+
:columns => "day,campaign,device_type,country,impressions,clicks,conversions,cost",
|
25
|
+
:report_type => "advertiser",
|
26
|
+
:format => :json,
|
27
|
+
}
|
28
|
+
|
29
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
30
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
31
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
32
|
+
http.request(req)
|
33
|
+
end
|
34
|
+
|
35
|
+
JSON.parse(res.body)['results'].reject do |campaign|
|
36
|
+
campaign["cost"].to_i == 0
|
37
|
+
end.map do |campaign|
|
38
|
+
date = Date.parse(campaign['day'])
|
39
|
+
|
40
|
+
{
|
41
|
+
:date => date,
|
42
|
+
:campaign => campaign_name(campaign['country'], campaign['device_type'], date, campaign['campaign']),
|
43
|
+
:impressions => campaign['impressions'].to_i,
|
44
|
+
:clicks => campaign['clicks'].to_i,
|
45
|
+
:conversions => campaign['conversions'].to_i,
|
46
|
+
:amount => campaign['cost'].to_f,
|
47
|
+
:target_country => campaign['country'],
|
48
|
+
:target_device => campaign['device_type'],
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Bidmotion
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
API_ENDPOINT = 'http://api.mobdone.com/api/v1/'
|
5
|
+
AUTH_ROUTE = 'session'
|
6
|
+
DATA_ROUTE = 'reports'
|
7
|
+
|
8
|
+
EXPECTED_ARRAY_ORDER = ["click_date", "offer_numeric_id", "country_code",
|
9
|
+
"device_type", "clicks", "conversions",
|
10
|
+
"conversion_rate", "revenue"]
|
11
|
+
|
12
|
+
define_required_credentials do
|
13
|
+
[:username, :password, :platform]
|
14
|
+
end
|
15
|
+
|
16
|
+
def campaign_costs(from, till)
|
17
|
+
load_data(from, till).reject do |campaign_data|
|
18
|
+
campaign_data[7].to_f == 0
|
19
|
+
end.map do |campaign_data|
|
20
|
+
country_code = campaign_data[2].downcase
|
21
|
+
device = campaign_data[3].downcase
|
22
|
+
campaign_name = "#{country_code}_#{device}"
|
23
|
+
|
24
|
+
{
|
25
|
+
:date => Date.parse(campaign_data[0]),
|
26
|
+
:campaign => campaign_name,
|
27
|
+
:clicks => campaign_data[4].to_i,
|
28
|
+
:conversions => campaign_data[5].to_i,
|
29
|
+
:amount => campaign_data[7].to_f,
|
30
|
+
:target_country => country_code,
|
31
|
+
:target_device => device
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def session_id
|
39
|
+
@session_id ||= begin
|
40
|
+
uri = URI("#{API_ENDPOINT}#{AUTH_ROUTE}")
|
41
|
+
params = {
|
42
|
+
:user_username => credentials.username,
|
43
|
+
:user_password => credentials.password,
|
44
|
+
:platform_name => credentials.platform
|
45
|
+
}
|
46
|
+
|
47
|
+
response = Net::HTTP.post_form(uri, params) do |http|
|
48
|
+
http.request(req)
|
49
|
+
end
|
50
|
+
|
51
|
+
response_json =
|
52
|
+
JSON.parse(response.body, :symbolize_names => true)
|
53
|
+
response_json[:session_id]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def load_data(from, till)
|
58
|
+
uri = Addressable::URI.parse("#{API_ENDPOINT}#{DATA_ROUTE}")
|
59
|
+
uri.query_values = {
|
60
|
+
:group_by => "click_date,offer_numeric_id,country_code,device_type,",
|
61
|
+
:click_date_init => from.to_s,
|
62
|
+
:click_date_end => till.to_s
|
63
|
+
}
|
64
|
+
|
65
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
66
|
+
request["X-Session-Id"] = session_id
|
67
|
+
|
68
|
+
response = Net::HTTP.start(uri.host, uri.port) do |http|
|
69
|
+
http.request(request)
|
70
|
+
end
|
71
|
+
|
72
|
+
response_json = JSON.parse(response.body, :symbolize_names => true)
|
73
|
+
|
74
|
+
raise "wrong field order: #{response_json[:fields]}" unless valid_field_order?(response_json[:fields])
|
75
|
+
|
76
|
+
response_json[:rows]
|
77
|
+
end
|
78
|
+
|
79
|
+
def valid_field_order?(response_fields)
|
80
|
+
response_fields == EXPECTED_ARRAY_ORDER
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Chartboost
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:user_id, :signature]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
|
10
|
+
uri = Addressable::URI.
|
11
|
+
parse("https://analytics.chartboost.com/v3/metrics/campaign")
|
12
|
+
|
13
|
+
uri.query_values = {
|
14
|
+
:userId => credentials.user_id,
|
15
|
+
:userSignature => credentials.signature,
|
16
|
+
:dateMin => from.strftime("%Y-%m-%d"),
|
17
|
+
:dateMax => till.strftime("%Y-%m-%d"),
|
18
|
+
}
|
19
|
+
|
20
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
21
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
22
|
+
http.request(req)
|
23
|
+
end
|
24
|
+
raise 'could not load report' if res.code.to_i != 200
|
25
|
+
|
26
|
+
JSON(res.body).reject do |a|
|
27
|
+
a["moneySpent"].to_f == 0.00
|
28
|
+
end.map do |campaign|
|
29
|
+
{
|
30
|
+
:date => Date.parse(campaign['dt']),
|
31
|
+
:campaign => campaign["campaign"],
|
32
|
+
:adgroup => :banner,
|
33
|
+
:impressions => campaign['impressionsReceived'].to_i,
|
34
|
+
:clicks => campaign['clicksReceived'].to_i,
|
35
|
+
:conversions => campaign['installReceived'].to_i,
|
36
|
+
:amount => campaign['moneySpent'].to_f
|
37
|
+
}
|
38
|
+
end.compact
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Crossinstall
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:username, :api_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
uri = Addressable::URI.parse("http://api.crossinstall.com/api/revenue")
|
10
|
+
uri.query_values = {
|
11
|
+
:email => credentials.username,
|
12
|
+
:api_key => credentials.api_key,
|
13
|
+
:start_date => from.strftime("%Y-%m-%d"),
|
14
|
+
:end_day => till.strftime("%Y-%m-%d")
|
15
|
+
}
|
16
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
17
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
18
|
+
http.request(req)
|
19
|
+
end
|
20
|
+
|
21
|
+
ad_data = JSON.parse(res.body)["response"]["ads"].map do |ad_data|
|
22
|
+
ad_data["stats"].map do |stat|
|
23
|
+
next if stat["cost"].to_f == 0
|
24
|
+
{
|
25
|
+
:date => Date.strptime(stat["day"], "%Y-%m-%d"),
|
26
|
+
:campaign => ad_data["name"],
|
27
|
+
:clicks => stat["clicks"].to_i,
|
28
|
+
:conversions => stat["conversions"].to_i,
|
29
|
+
:amount => stat["cost"].to_f
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end.flatten
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Facebook
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:access_token]
|
6
|
+
end
|
7
|
+
|
8
|
+
def curlobj(urlstr)
|
9
|
+
Curl::Easy.new.tap do |w|
|
10
|
+
w.url = urlstr
|
11
|
+
w.follow_location = false
|
12
|
+
w.timeout = 10
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def campaign_costs(from, till)
|
17
|
+
from.upto(till).map do |date|
|
18
|
+
uri = Addressable::URI.
|
19
|
+
parse("https://graph.facebook.com/act_#{credentials.account_id}/stats")
|
20
|
+
uri.query_values = {
|
21
|
+
:access_token => credentials.access_token,
|
22
|
+
:start_time => date.strftime("%s"),
|
23
|
+
:end_time => (date + 1).strftime("%s"),
|
24
|
+
}
|
25
|
+
(w = curlobj(uri.to_s)).perform
|
26
|
+
JSON(w.body_str).merge(:date => date)
|
27
|
+
end.flatten.group_by do |reports|
|
28
|
+
reports[:date]
|
29
|
+
end.map do |date, reports|
|
30
|
+
{
|
31
|
+
:date => date,
|
32
|
+
:impressions => reports.map{|v|v[:impressions]}.reduce(:+),
|
33
|
+
:clicks => reports.map{|v|v[:clicks]}.reduce(:+),
|
34
|
+
:conversions => reports.map{|v|v[:conversions]}.reduce(:+),
|
35
|
+
:amount => reports.map{|v|v[:spent]}.reduce(:+)
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Fractionalmedia
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
API_ENDPOINT = 'https://ws.fractionalmedia.com/ws'
|
5
|
+
|
6
|
+
define_required_credentials do
|
7
|
+
[:username, :password]
|
8
|
+
end
|
9
|
+
|
10
|
+
def http_call(method, login_required=false, params={})
|
11
|
+
uri = Addressable::URI.parse("#{API_ENDPOINT}/#{method}.js")
|
12
|
+
uri.query_values = params
|
13
|
+
|
14
|
+
if login_required
|
15
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
16
|
+
req['Cookie'] = cookies.map(&:to_s).join('; ') if login_required
|
17
|
+
else
|
18
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
22
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
23
|
+
http.request(req)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def cookies
|
28
|
+
@cookie ||=
|
29
|
+
begin
|
30
|
+
http_call(:login, false,
|
31
|
+
:user => credentials.username,
|
32
|
+
:pw => credentials.password
|
33
|
+
).get_fields('Set-Cookie').map do |cookie_string|
|
34
|
+
cookie = CGI::Cookie.parse(cookie_string)
|
35
|
+
CGI::Cookie.new('name' => cookie.first.first,
|
36
|
+
'value' => cookie.first.last,
|
37
|
+
'path' => cookie['Path'])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def load_compaign_metrics(from, till, id)
|
43
|
+
response = http_call(:get_perf_hist, true, {
|
44
|
+
campid: id,
|
45
|
+
days: (Date.today - from).to_i
|
46
|
+
})
|
47
|
+
|
48
|
+
json_data = JSON(response.body, :symbolize_names => true).try(:[], :data) || []
|
49
|
+
json_data.map do |metric|
|
50
|
+
metric[:date] = Date.parse(metric[:date])
|
51
|
+
metric
|
52
|
+
end.select do |metric|
|
53
|
+
metric[:date] >= from and metric[:date] <= till
|
54
|
+
end.reject do |metric|
|
55
|
+
metric[:revenue] == 0
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_campaigns(from, till, id=25092)
|
60
|
+
response = http_call(:get_all_camps, true, current: id)
|
61
|
+
campaigns = JSON(response.body, :symbolize_names => true)[:camps]
|
62
|
+
campaigns.map do |campaign_data|
|
63
|
+
info = URI.unescape(campaign_data[:title]);
|
64
|
+
|
65
|
+
name, country, platform, dump =
|
66
|
+
info.split('~').map(&:strip).map(&:downcase)
|
67
|
+
app, campaign, ad = parse_name(name, country, platform)
|
68
|
+
|
69
|
+
{
|
70
|
+
:id => campaign_data[:id],
|
71
|
+
:app => app,
|
72
|
+
:campaign => campaign,
|
73
|
+
:ad => ad,
|
74
|
+
:country => country,
|
75
|
+
:platform => platform
|
76
|
+
}
|
77
|
+
end.compact.map do |campaign_data|
|
78
|
+
campaign_data[:metrics] = load_compaign_metrics(from, till, campaign_data[:id])
|
79
|
+
campaign_data
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def parse_name(name, country, platform)
|
84
|
+
app, ad = name.split('=')
|
85
|
+
[app, "#{app}_#{country}_#{platform}", ad]
|
86
|
+
end
|
87
|
+
|
88
|
+
def campaign_costs(from, till)
|
89
|
+
load_campaigns(from, till).map do |campaign|
|
90
|
+
campaign[:metrics].map do |campaign_metric|
|
91
|
+
{
|
92
|
+
:campaign => campaign[:campaign],
|
93
|
+
:adgroup => :banner,
|
94
|
+
:ad => campaign[:ad],
|
95
|
+
:date => campaign_metric[:date],
|
96
|
+
:conversions => campaign_metric[:convs],
|
97
|
+
:amount => campaign_metric[:revenue],
|
98
|
+
:target_country => campaign[:country],
|
99
|
+
:target_device => campaign[:platform]
|
100
|
+
}
|
101
|
+
end
|
102
|
+
end.flatten
|
103
|
+
end
|
104
|
+
end
|