adtekio_adnetworks 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,54 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Fyber
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
define_required_credentials do
|
|
5
|
+
[:username, :password]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def apps
|
|
9
|
+
uri = Addressable::URI.
|
|
10
|
+
parse("https://api.sponsorpay.com/advertiser/v1/application_list")
|
|
11
|
+
|
|
12
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
13
|
+
req.basic_auth credentials.username, credentials.password
|
|
14
|
+
|
|
15
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
|
16
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
|
17
|
+
http.request(req)
|
|
18
|
+
end
|
|
19
|
+
JSON.parse(res.body, :symbolize_names => true)[:data]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def campaign_costs(from, till)
|
|
23
|
+
apps.map do |app_data|
|
|
24
|
+
next if app_data[:bundle_id].nil?
|
|
25
|
+
|
|
26
|
+
uri = Addressable::URI.
|
|
27
|
+
parse("https://api.sponsorpay.com/advertiser/v1/campaign_aggregate")
|
|
28
|
+
|
|
29
|
+
uri.query_values = {
|
|
30
|
+
:app_id => app_data[:app_id],
|
|
31
|
+
:start_day => from.strftime("%Y-%m-%d"),
|
|
32
|
+
:end_day => till.strftime("%Y-%m-%d"),
|
|
33
|
+
}
|
|
34
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
35
|
+
req.basic_auth credentials.username, credentials.password
|
|
36
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
|
37
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
|
38
|
+
http.request(req)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
JSON.parse(res.body, :symbolize_names => true)[:data].map do |campaign|
|
|
42
|
+
next if campaign[:spend].to_f == 0
|
|
43
|
+
{
|
|
44
|
+
:date => Date.parse(campaign[:day]),
|
|
45
|
+
:campaign => campaign[:campaign_name].split(' ').first,
|
|
46
|
+
:impressions => campaign[:impressions].to_i,
|
|
47
|
+
:clicks => campaign[:clicks].to_i,
|
|
48
|
+
:conversions => campaign[:downloads].to_i,
|
|
49
|
+
:amount => campaign[:spend].to_f/100,
|
|
50
|
+
}
|
|
51
|
+
end.compact
|
|
52
|
+
end.flatten
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Gamegenetics
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
define_required_credentials do
|
|
5
|
+
[:username, :password]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def csv_data(from, till)
|
|
9
|
+
agent = Mechanize.new
|
|
10
|
+
agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
|
11
|
+
agent.user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) '+
|
|
12
|
+
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 '+
|
|
13
|
+
'Safari/537.36'
|
|
14
|
+
|
|
15
|
+
agent.post( "https://partner.popmog.com/en/user_session", {
|
|
16
|
+
:"user_session[email]" => credentials.username,
|
|
17
|
+
:"user_session[password]" => credentials.password,
|
|
18
|
+
:"user_session[remember_me]" => 1
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
csv_data = agent.post( "https://partner.popmog.com/en/payment_report/advertiser_new", {
|
|
22
|
+
:"payment_report_filter[begin_date]" => from,
|
|
23
|
+
:"payment_report_filter[end_date]" => till,
|
|
24
|
+
:"payment_report_filter[daily]" => 1,
|
|
25
|
+
:csv => 1
|
|
26
|
+
}).body
|
|
27
|
+
|
|
28
|
+
CSV.new(csv_data, :headers => :first_line, :col_sep => ",", :quote_char => '"')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def campaign_costs(from, till)
|
|
32
|
+
csv_data(from, till).map do |row|
|
|
33
|
+
spends = (row['Cost (currency)'] || "").gsub(' USD','').to_f
|
|
34
|
+
{
|
|
35
|
+
:date => Date.parse(row['Date'][0..9]),
|
|
36
|
+
:campaign => row["Country"],
|
|
37
|
+
:adgroup => row["Campaign Id"],
|
|
38
|
+
:clicks => row['Clicks'].to_i,
|
|
39
|
+
:conversions => row['CPP Conversion'].to_i,
|
|
40
|
+
:amount => spends
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Glispa
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
define_required_credentials do
|
|
5
|
+
[:cid, :token]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def csv_data(from, till)
|
|
9
|
+
uri = Addressable::URI.
|
|
10
|
+
parse("https://www.glispainteractive.com/API/advreport.php")
|
|
11
|
+
|
|
12
|
+
uri.query_values = {
|
|
13
|
+
:cid => credentials.cid,
|
|
14
|
+
:token => credentials.token,
|
|
15
|
+
:bdate => from.strftime("%Y-%m-%d"),
|
|
16
|
+
:edate => till.strftime("%Y-%m-%d"),
|
|
17
|
+
:format => :csv
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
21
|
+
res = 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
|
+
|
|
26
|
+
CSV.new(res.body.rstrip, :headers => :first_line, :col_sep => ";")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parse_glispa_name(glispa_name)
|
|
30
|
+
app_name, platform, adgroup, *ad = glispa_name.downcase.split(' - ')
|
|
31
|
+
|
|
32
|
+
ad.compact!
|
|
33
|
+
country = adgroup.length == 2 ? adgroup : nil
|
|
34
|
+
campaign = if ad.size == 1 && ad.join(" ") != 'gNative'
|
|
35
|
+
ad.first
|
|
36
|
+
else
|
|
37
|
+
"#{country}_#{platform}"
|
|
38
|
+
end
|
|
39
|
+
["", campaign, adgroup, ad.join(" "), country]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def campaign_costs(from, till)
|
|
43
|
+
csv_data(from, till).map do |row|
|
|
44
|
+
glispa_name = row["Campaign Name"]
|
|
45
|
+
_, campaign, adgroup, ad, country = parse_glispa_name(glispa_name)
|
|
46
|
+
|
|
47
|
+
next if row["Payout"].to_f == 0.0
|
|
48
|
+
|
|
49
|
+
{
|
|
50
|
+
:campaign => campaign,
|
|
51
|
+
:adgroup => adgroup,
|
|
52
|
+
:ad => ad,
|
|
53
|
+
:amount => row["Revenue"].to_f,
|
|
54
|
+
:date => Date.parse(row["Date"]),
|
|
55
|
+
:target_country => country,
|
|
56
|
+
}
|
|
57
|
+
end.compact
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Googleadwords
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
API_VERSION = :v201509
|
|
5
|
+
|
|
6
|
+
define_required_credentials do
|
|
7
|
+
[:client_key, :client_secret, :developer_token, :customer_id,
|
|
8
|
+
:access_token, :refresh_token, :issued_at, :expires_in, :id_token,
|
|
9
|
+
:verification_code]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def client
|
|
13
|
+
args = {
|
|
14
|
+
:authentication => {
|
|
15
|
+
:method => 'OAuth2',
|
|
16
|
+
:oauth2_client_id => credentials.client_key,
|
|
17
|
+
:oauth2_client_secret => credentials.client_secret,
|
|
18
|
+
:developer_token => credentials.developer_token,
|
|
19
|
+
:oauth2_access_type => 'offline',
|
|
20
|
+
:client_customer_id => credentials.customer_id,
|
|
21
|
+
:user_agent => 'Mopet',
|
|
22
|
+
},
|
|
23
|
+
:service => {
|
|
24
|
+
:environment => 'PRODUCTION'
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if !credentials.access_token.blank? && !credentials.refresh_token.blank?
|
|
29
|
+
args[:authentication] = args[:authentication].
|
|
30
|
+
merge({:oauth2_token => {
|
|
31
|
+
:access_token => credentials.access_token,
|
|
32
|
+
:refresh_token => credentials.refresh_token,
|
|
33
|
+
:issued_at => DateTime.parse(credentials.issued_at),
|
|
34
|
+
:expires_in => credentials.expires_in.to_i,
|
|
35
|
+
:id_token => credentials.id_token.blank? ? nil : credentials.id_token,
|
|
36
|
+
}})
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@client ||= begin
|
|
40
|
+
AdwordsApi::Api.new(args)
|
|
41
|
+
rescue Exception => e
|
|
42
|
+
puts e.message
|
|
43
|
+
puts e.backtrace
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def load_data(from, till)
|
|
48
|
+
report_util = client.report_utils(API_VERSION)
|
|
49
|
+
report_file_name = Tempfile.new('adword_report').path
|
|
50
|
+
report_definition = {
|
|
51
|
+
:selector => {
|
|
52
|
+
:fields => ['Date', 'CampaignName', 'CampaignId', 'AdGroupName',
|
|
53
|
+
'AdGroupId', 'Impressions', 'Clicks', 'ConvertedClicks',
|
|
54
|
+
'Cost'],
|
|
55
|
+
:date_range => {
|
|
56
|
+
:min => from.strftime('%Y%m%d'),
|
|
57
|
+
:max => till.strftime('%Y%m%d'),
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
:report_name => 'ADGROUP_PERFORMANCE_REPORT',
|
|
61
|
+
:report_type => 'ADGROUP_PERFORMANCE_REPORT',
|
|
62
|
+
:date_range_type => 'CUSTOM_DATE',
|
|
63
|
+
:download_format => 'CSV',
|
|
64
|
+
:include_zero_impressions => false,
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
report_util.download_report_as_file(report_definition, report_file_name)
|
|
68
|
+
content = File.foreach(report_file_name).to_a[1..-2].join()
|
|
69
|
+
CSV.parse(content, :headers => true).map do |row|
|
|
70
|
+
row.to_h
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def campaign_costs(from, till)
|
|
75
|
+
load_data(from, till).map do |campaign|
|
|
76
|
+
amount = campaign["Cost"].to_f/1_000_000
|
|
77
|
+
next if amount == 0
|
|
78
|
+
|
|
79
|
+
{
|
|
80
|
+
:date => Date.parse(campaign["Day"]),
|
|
81
|
+
:campaign => campaign["Campaign ID"].downcase,
|
|
82
|
+
:adgroup => campaign["Ad group ID"].downcase,
|
|
83
|
+
:impressions => campaign["Impressions"].to_i,
|
|
84
|
+
:clicks => campaign["Clicks"].to_i,
|
|
85
|
+
:conversions => campaign["Converted clicks"].to_i,
|
|
86
|
+
:amount => amount,
|
|
87
|
+
}
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def oauth2_token
|
|
92
|
+
client.
|
|
93
|
+
authorize(:oauth2_verification_code => credentials.verification_code)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def generate_link_to_verification_code
|
|
97
|
+
client.authorize() { |auth_url| return auth_url }
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Jampp
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
define_required_credentials do
|
|
5
|
+
[:api_key]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def campaigns(from, till)
|
|
9
|
+
uri = Addressable::URI.parse("http://ruby.jampp.com/api/advertisers.json")
|
|
10
|
+
uri.query_values = {
|
|
11
|
+
"filter[from]" => from.strftime("%Y-%m-%d"),
|
|
12
|
+
"filter[to]" => till.strftime("%Y-%m-%d"),
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
|
16
|
+
req.form_data = {:api_key => credentials.api_key}
|
|
17
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
|
18
|
+
http.request(req)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
JSON.parse(res.body)['data']
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def campaign_details(campaign_id, from, till)
|
|
25
|
+
uri = Addressable::URI.
|
|
26
|
+
parse("http://ruby.jampp.com/api/advertisers/details/#{campaign_id}.json")
|
|
27
|
+
uri.query_values = {
|
|
28
|
+
"filter[from]" => from.strftime("%Y-%m-%d"),
|
|
29
|
+
"filter[to]" => till.strftime("%Y-%m-%d"),
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
|
33
|
+
req.form_data = {:api_key => credentials.api_key}
|
|
34
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
|
35
|
+
http.request(req)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
JSON.parse(res.body)['data']
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def campaign_costs(from, till)
|
|
42
|
+
campaigns(from, till).map do |campaign|
|
|
43
|
+
campaign_details(campaign["Campaign.id"], from, till).map do |metrics|
|
|
44
|
+
campaign_name = campaign["Campaign.name"].gsub(' ','_').downcase
|
|
45
|
+
|
|
46
|
+
{
|
|
47
|
+
:date => Date.parse(metrics['date']),
|
|
48
|
+
:campaign => campaign_name,
|
|
49
|
+
:clicks => metrics['clicks'].to_i,
|
|
50
|
+
:conversions => metrics['installs'].to_i,
|
|
51
|
+
:amount => metrics['cost'].gsub(', ', '').to_f,
|
|
52
|
+
:target_country => campaign["Country.code"].downcase,
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
end.flatten
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Leadbolt
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
define_required_credentials do
|
|
5
|
+
[:advertiser_id, :secret_key]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def load_data(from, till)
|
|
9
|
+
return [] if till < Date.today-7
|
|
10
|
+
from = [Date.today-7, from].max
|
|
11
|
+
uri = Addressable::URI.
|
|
12
|
+
parse("https://www.leadbolt.net/api/advertiser_report")
|
|
13
|
+
|
|
14
|
+
uri.query_values = {
|
|
15
|
+
:advertiser_id => credentials.advertiser_id,
|
|
16
|
+
:secret_key => credentials.secret_key,
|
|
17
|
+
:format => :json,
|
|
18
|
+
:date_from => from.strftime("%Y%m%d"),
|
|
19
|
+
:date_to => till.strftime("%Y%m%d"),
|
|
20
|
+
}
|
|
21
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
22
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
|
23
|
+
http.request(req)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
JSON(res.body, :symbolize_names => true).first[:data]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def campaign_costs(from, till)
|
|
30
|
+
load_data(from, till).reject do |campaign|
|
|
31
|
+
campaign[:spend].to_f == 0.0
|
|
32
|
+
end.map do |campaign|
|
|
33
|
+
{
|
|
34
|
+
:date => Date.parse(campaign[:date]),
|
|
35
|
+
:campaign => campaign[:campaign_name],
|
|
36
|
+
:impressions => campaign[:impressions].to_i,
|
|
37
|
+
:clicks => campaign[:clicks].to_i,
|
|
38
|
+
:conversions => campaign[:conversions].to_i,
|
|
39
|
+
:amount => campaign[:spend].to_f
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Lifestreet
|
|
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://my.lifestreetmedia.com/reporting/run/")
|
|
11
|
+
|
|
12
|
+
req = Net::HTTP::Post.new(uri.request_uri)
|
|
13
|
+
req.form_data = {:data => {
|
|
14
|
+
:measurements => {
|
|
15
|
+
:Impressions => :adImps,
|
|
16
|
+
:Conversions => :adConvs,
|
|
17
|
+
:Cost => :adRevenue,
|
|
18
|
+
:Clicks => :adClicks,
|
|
19
|
+
},
|
|
20
|
+
:dimensions => {
|
|
21
|
+
:Date => :Date,
|
|
22
|
+
:Campaign => "Campaign.name",
|
|
23
|
+
:Country => :Country
|
|
24
|
+
},
|
|
25
|
+
:start_date => from.strftime("%Y-%m-%d"),
|
|
26
|
+
:end_date => till.strftime("%Y-%m-%d"),
|
|
27
|
+
}.to_json}
|
|
28
|
+
|
|
29
|
+
req.basic_auth credentials.username, credentials.password
|
|
30
|
+
|
|
31
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
|
32
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
|
33
|
+
http.request(req)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
JSON.parse(res.body)["data"].map do |values|
|
|
37
|
+
{
|
|
38
|
+
:date => Date.parse(values["Date"]),
|
|
39
|
+
:campaign => values["Campaign.name"],
|
|
40
|
+
:adgroup => values["Country"],
|
|
41
|
+
:impressions => values["adImps"].to_i,
|
|
42
|
+
:clicks => values["adClicks"].to_i,
|
|
43
|
+
:conversions => values["adConvs"].to_i,
|
|
44
|
+
:amount => values["adRevenue"].to_f,
|
|
45
|
+
:target_country => values["Country"]
|
|
46
|
+
}
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
class AdtekioAdnetworks::Cost::Loopme
|
|
2
|
+
include AdtekioAdnetworks::CostImport
|
|
3
|
+
|
|
4
|
+
define_required_credentials do
|
|
5
|
+
[:api_key]
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def load_data(from, till)
|
|
9
|
+
from.upto(till).map do |date|
|
|
10
|
+
uri = Addressable::URI.
|
|
11
|
+
parse("http://reports.loopme.me/api/v1/reports/campaigns")
|
|
12
|
+
|
|
13
|
+
uri.query_values = {
|
|
14
|
+
:group_by => 'line_item',
|
|
15
|
+
:api_auth_token => credentials.api_key,
|
|
16
|
+
:date_range => ("%s:%s" % [date, date].map do |d|
|
|
17
|
+
d.strftime("%Y-%m-%d")
|
|
18
|
+
end),
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
22
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
|
23
|
+
http.request(req)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# follow one redirect.
|
|
27
|
+
body = if res.code =~ /3../
|
|
28
|
+
uri = Addressable::URI.parse(res.header["Location"])
|
|
29
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
|
30
|
+
Net::HTTP.start(uri.host, uri.port) do |http|
|
|
31
|
+
http.request(req)
|
|
32
|
+
end.body
|
|
33
|
+
else
|
|
34
|
+
res.body
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
JSON.parse(body)['series'].map do |serie|
|
|
38
|
+
serie['date'] = date
|
|
39
|
+
serie
|
|
40
|
+
end
|
|
41
|
+
end.compact.flatten
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def campaign_costs(from, till)
|
|
45
|
+
# the campaign names where invalid before this date and on the same time
|
|
46
|
+
# we have correct manual cost before this date
|
|
47
|
+
invalid_before = Date.parse('2014-08-01')
|
|
48
|
+
return [] if till <= invalid_before
|
|
49
|
+
from = [from, invalid_before].max
|
|
50
|
+
|
|
51
|
+
load_data(from, till).map do |campaign|
|
|
52
|
+
puts campaign
|
|
53
|
+
{
|
|
54
|
+
:date => campaign['date'],
|
|
55
|
+
:campaign => campaign['line_item'],
|
|
56
|
+
:impressions => campaign['totals']['Views'].gsub(', ', '').to_i,
|
|
57
|
+
:clicks => campaign['totals']['Clicks'].gsub(', ', '').to_i,
|
|
58
|
+
:conversions => campaign['totals']['Installs'].gsub(', ', '').to_i,
|
|
59
|
+
:amount => campaign['totals']['Spend, $'].gsub(', ', '').to_f
|
|
60
|
+
}
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|