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,44 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Revmob
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:user_id, :auth_token]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
url = "https://www.revmobmobileadnetwork.com/api/v1/users"+
|
10
|
+
"/#{credentials.user_id}/auth/#{credentials.auth_token}/campaigns"+
|
11
|
+
"/report.json"
|
12
|
+
|
13
|
+
uri = Addressable::URI.parse(url)
|
14
|
+
uri.query_values = {
|
15
|
+
:startDate => from.strftime("%Y-%m-%d"),
|
16
|
+
:endDate => till.strftime("%Y-%m-%d"),
|
17
|
+
}
|
18
|
+
|
19
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
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
|
+
raise 'could not load report' if res.code.to_i != 200
|
25
|
+
|
26
|
+
campaigns = JSON(res.body)["campaigns"]
|
27
|
+
campaigns.reject! do |camp|
|
28
|
+
camp["daily_activities"].detect {|x| x["spend"].to_f > 0}.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
campaigns.map do |camp|
|
32
|
+
camp["daily_activities"].map do |d|
|
33
|
+
{
|
34
|
+
:campaign => camp["name"],
|
35
|
+
:date => Date.parse(d["day"]),
|
36
|
+
:impressions => d["impressions"].to_i,
|
37
|
+
:clicks => d["clicks"].to_i,
|
38
|
+
:conversions => d["installs"].to_i,
|
39
|
+
:amount => d["spend"].to_f
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end.flatten.compact
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Rtbcom
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:advertiser_id, :secret_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def csv_data(from, till)
|
9
|
+
uri = Addressable::URI.parse("https://api.manage.com/1/stats.php")
|
10
|
+
uri.query_values = {
|
11
|
+
:advertiser_id => credentials.advertiser_id,
|
12
|
+
:advertiser_key => credentials.secret_key,
|
13
|
+
:date_from => from.strftime("%Y-%m-%d"),
|
14
|
+
:date_to => till.strftime("%Y-%m-%d"),
|
15
|
+
:type => "campaign",
|
16
|
+
:break_by => "date",
|
17
|
+
}
|
18
|
+
|
19
|
+
http = Net::HTTP::Persistent.new('rtbcom')
|
20
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
21
|
+
|
22
|
+
request = http.request(URI.parse(uri.to_s))
|
23
|
+
if request.code =~ /3../
|
24
|
+
http.request(URI.parse(request.header["Location"])).body
|
25
|
+
else
|
26
|
+
request.body
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def campaign_costs(from, till)
|
31
|
+
csv_options = {
|
32
|
+
:col_sep => ",",
|
33
|
+
:quote_char => '"',
|
34
|
+
:headers => :first_row,
|
35
|
+
}
|
36
|
+
|
37
|
+
CSV.new(csv_data(from,till), csv_options).to_a.map do |row|
|
38
|
+
{
|
39
|
+
:date => Date.strptime(row["date"], "%Y-%m-%d"),
|
40
|
+
:campaign => row['campaign'],
|
41
|
+
:impressions => row['impression'].to_i,
|
42
|
+
:clicks => row['click'].to_i,
|
43
|
+
:conversions => row['install'].to_i,
|
44
|
+
:amount => row["cost"].to_f,
|
45
|
+
}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Startapp
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
ApiEndpoint = "http://api.startapp.com/adv/report/1.0"
|
5
|
+
|
6
|
+
define_required_credentials do
|
7
|
+
[:partner, :token]
|
8
|
+
end
|
9
|
+
|
10
|
+
def load_campaigns(from, till)
|
11
|
+
uri = Addressable::URI.parse(ApiEndpoint)
|
12
|
+
uri.query_values = {
|
13
|
+
:partner => credentials.partner,
|
14
|
+
:token => credentials.token,
|
15
|
+
:startDate => from.strftime("%Y%m%d"),
|
16
|
+
:endDate => till.strftime("%Y%m%d"),
|
17
|
+
:dimension => 'date,campaignId,country'
|
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
|
+
|
25
|
+
JSON.parse(res.body, :symbolize_names => true)[:data]
|
26
|
+
end
|
27
|
+
|
28
|
+
def campaign_costs(from, till)
|
29
|
+
load_campaigns(from, till).map do |campaign|
|
30
|
+
next if campaign[:spent].to_f == 0.0
|
31
|
+
|
32
|
+
country = campaign[:country].try(&:downcase)
|
33
|
+
country = nil if country == 'unknown'
|
34
|
+
|
35
|
+
{
|
36
|
+
:date => Date.strptime(campaign[:date].to_s, "%Y%m%d"),
|
37
|
+
:campaign => campaign[:campaignName],
|
38
|
+
:adgroup => country,
|
39
|
+
:target_country => country == 'unknown' ? nil : country,
|
40
|
+
:impressions => campaign[:impressions].to_i,
|
41
|
+
:clicks => campaign[:clicks].to_i,
|
42
|
+
:conversions => campaign[:installs].to_i,
|
43
|
+
:amount => campaign[:spent].to_f
|
44
|
+
}
|
45
|
+
end.compact
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Supersonic
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:login, :key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def load_data(uri)
|
9
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
10
|
+
req.basic_auth credentials.login, credentials.key
|
11
|
+
|
12
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
13
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
14
|
+
http.request(req)
|
15
|
+
end
|
16
|
+
|
17
|
+
JSON.parse(res.body, :symbolize_names => true)[:data]
|
18
|
+
end
|
19
|
+
|
20
|
+
def campaigns
|
21
|
+
uri = Addressable::URI.
|
22
|
+
parse("https://platform.supersonic.com/partners/advertiser/campaigns")
|
23
|
+
load_data(uri)
|
24
|
+
end
|
25
|
+
|
26
|
+
def stats(campaign_ids, date)
|
27
|
+
uri = Addressable::URI.
|
28
|
+
parse("https://platform.supersonic.com/partners/advertiser/campaigns/stats")
|
29
|
+
uri.query_values = {
|
30
|
+
:start_date => date.strftime("%Y-%m-%d"),
|
31
|
+
:end_date => date.strftime("%Y-%m-%d"),
|
32
|
+
:campaign_id => campaign_ids.join(',')
|
33
|
+
}
|
34
|
+
load_data(uri)
|
35
|
+
end
|
36
|
+
|
37
|
+
def mobile_campaign_costs(from, till)
|
38
|
+
campaign_hsh = campaigns.group_by do |campaign|
|
39
|
+
campaign[:campaign_id].to_i
|
40
|
+
end
|
41
|
+
|
42
|
+
from.upto(till).map do |date|
|
43
|
+
stats(campaign_hsh.keys, date).map do |campaign_stats|
|
44
|
+
|
45
|
+
campaign_id = campaign_stats[:campaign_id].to_i
|
46
|
+
campaign = campaign_hsh[campaign_id].first
|
47
|
+
|
48
|
+
platform = case campaign[:target_platform].first
|
49
|
+
when 'apple_itunes' then 'ios'
|
50
|
+
when 'google_play' then 'android'
|
51
|
+
else nil
|
52
|
+
end
|
53
|
+
|
54
|
+
next if campaign[:bundle_id].nil?
|
55
|
+
|
56
|
+
campaign_stats[:data].map do |stats|
|
57
|
+
country = stats[:country_code].downcase
|
58
|
+
|
59
|
+
{
|
60
|
+
:date => date,
|
61
|
+
:campaign => campaign[:campaign_name],
|
62
|
+
:adgroup => country,
|
63
|
+
:impressions => stats[:impressions].to_i,
|
64
|
+
:clicks => stats[:clicks].to_i,
|
65
|
+
:conversions => stats[:conversions].to_i,
|
66
|
+
:amount => stats[:expense].to_f / 100,
|
67
|
+
:target_country => country,
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end.compact.flatten
|
71
|
+
end.flatten
|
72
|
+
end
|
73
|
+
|
74
|
+
def campaign_costs(from, till)
|
75
|
+
mobile_campaign_costs(from, till)
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Tapjoy
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:api_key, :username]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
from.upto(till).map do |date|
|
10
|
+
|
11
|
+
uri = Addressable::URI.
|
12
|
+
parse("https://api.tapjoy.com/reporting_data.json")
|
13
|
+
|
14
|
+
uri.query_values = {
|
15
|
+
:email => credentials.username,
|
16
|
+
:api_key => credentials.api_key,
|
17
|
+
:date => date.strftime('%Y-%m-%d'),
|
18
|
+
:timezone => 0
|
19
|
+
}
|
20
|
+
|
21
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
22
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
23
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
24
|
+
http.request(req)
|
25
|
+
end
|
26
|
+
|
27
|
+
JSON.parse(res.body, :symbolize_names => true)
|
28
|
+
end.map do |report|
|
29
|
+
report[:Apps].map do |campaign|
|
30
|
+
next if campaign[:Spend].to_f == 0
|
31
|
+
next if campaign[:Name] =~ /free/i
|
32
|
+
{
|
33
|
+
:date => Date.parse(report[:Date]),
|
34
|
+
:campaign => campaign[:Name],
|
35
|
+
:clicks => campaign[:PaidClicks].to_i,
|
36
|
+
:conversions => campaign[:PaidInstalls].to_i,
|
37
|
+
:amount => campaign[:Spend].to_f.abs
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end.flatten
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Tokenads
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:username, :password]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
require 'csv'
|
10
|
+
require 'mechanize'
|
11
|
+
|
12
|
+
agent = Mechanize.new
|
13
|
+
agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
14
|
+
agent.read_timeout = 120
|
15
|
+
agent.user_agent_alias = 'Mac Safari'
|
16
|
+
|
17
|
+
agent.post("https://manage.tokenads.com/AdvLogin", {
|
18
|
+
:submit => "Submit",
|
19
|
+
:adv_ContactEmail => credentials.username,
|
20
|
+
:adv_AccountPwd => credentials.password
|
21
|
+
})
|
22
|
+
|
23
|
+
csv = agent.post("https://manage.tokenads.com/AdvGrid/Report", {
|
24
|
+
"stt_Date_start" => from.strftime("%Y-%m-%d"),
|
25
|
+
"stt_Date_end" => till.strftime("%Y-%m-%d"),
|
26
|
+
"stt_CampaignId" => "",
|
27
|
+
"group_1" => "stt_Date",
|
28
|
+
"group_2" => "stt_CampaignId",
|
29
|
+
"sortby_1" => "stt_Date",
|
30
|
+
"c_rpp" => "5000",
|
31
|
+
"export" => "Export",
|
32
|
+
"searched" => "1"
|
33
|
+
}).body
|
34
|
+
|
35
|
+
CSV.new(csv, :headers => :first_line, :col_sep => ",", :quote_char => '"').
|
36
|
+
to_a.map do |row|
|
37
|
+
{
|
38
|
+
:date => Date.parse(row['Date'], "%Y-%m-%d"),
|
39
|
+
:campaign => row['Campaign'],
|
40
|
+
:clicks => row['Clicks'].to_i,
|
41
|
+
:conversions => row['Actions'].to_i,
|
42
|
+
:amount => row['Advertiser Cost (USD)'].gsub(/,/, '').gsub(/[$]/, '').to_f
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Unilead
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:api_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
uri = Addressable::URI.
|
10
|
+
parse("http://my.unileadnetwork.com/stats/stats.json")
|
11
|
+
|
12
|
+
uri.query_values = {
|
13
|
+
:api_key => credentials.api_key,
|
14
|
+
:start_date => from.to_s,
|
15
|
+
:end_date => till.to_s,
|
16
|
+
:'group[]' => ['Stat.date', 'Offer.name'],
|
17
|
+
:'field[]' => ['Stat.conversions', 'Stat.impressions', 'Stat.clicks', 'Stat.revenue'],
|
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
|
+
|
25
|
+
JSON.parse(res.body)['data'].map do |campaign|
|
26
|
+
costs = campaign['cost'].gsub(/[^\d]/,'').to_f/100
|
27
|
+
next if costs == 0.0
|
28
|
+
|
29
|
+
{
|
30
|
+
:date => Date.strptime(campaign["date"], "%Y-%m-%d"),
|
31
|
+
:campaign => campaign["offer"],
|
32
|
+
:impressions => campaign['impressions'].to_i,
|
33
|
+
:clicks => campaign['clicks'].to_i,
|
34
|
+
:conversions => campaign["conversions"].to_i,
|
35
|
+
:amount => costs,
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Vungle
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:api_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def load_campaign_ids
|
9
|
+
uri = Addressable::URI.parse("https://ssl.vungle.com/api/campaigns")
|
10
|
+
uri.query_values = {
|
11
|
+
:key => credentials.api_key,
|
12
|
+
}
|
13
|
+
|
14
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
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
|
+
|
20
|
+
JSON.parse(res.body, :symbolize_names => true).map do |campaign|
|
21
|
+
campaign[:campaignId]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def campaign_costs(from, till)
|
26
|
+
campaign_ids = load_campaign_ids
|
27
|
+
from.upto(till).map do |date|
|
28
|
+
campaign_ids.map do |id|
|
29
|
+
sleep 0.11 # max 100 requests per 10 seconds are allowed
|
30
|
+
uri = Addressable::URI.
|
31
|
+
parse("https://ssl.vungle.com/api/campaigns/#{id}")
|
32
|
+
|
33
|
+
uri.query_values = {
|
34
|
+
:key => credentials.api_key,
|
35
|
+
:date => date.strftime("%Y-%m-%d"),
|
36
|
+
}
|
37
|
+
|
38
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
39
|
+
res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true,
|
40
|
+
:verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
|
41
|
+
http.request(req)
|
42
|
+
end
|
43
|
+
|
44
|
+
JSON.parse(res.body, :symbolize_names => true).map do |campaign|
|
45
|
+
next if campaign[:dailySpend].to_f == 0
|
46
|
+
{
|
47
|
+
:date => date,
|
48
|
+
:campaign => campaign[:name],
|
49
|
+
:amount => campaign[:dailySpend].to_f,
|
50
|
+
:impressions => campaign[:impressions].to_i,
|
51
|
+
:clicks => campaign[:clicks].to_i,
|
52
|
+
:conversions => campaign[:installs].to_i
|
53
|
+
}
|
54
|
+
end.compact
|
55
|
+
end
|
56
|
+
end.flatten
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class AdtekioAdnetworks::Revenue::Adcolony
|
2
|
+
include AdtekioAdnetworks::RevenueImport
|
3
|
+
|
4
|
+
CsvOptions = {
|
5
|
+
:col_sep => ",",
|
6
|
+
:quote_char => '"',
|
7
|
+
:headers => :first_row,
|
8
|
+
}
|
9
|
+
|
10
|
+
BASE_URL = "https://clients.adcolony.com/api/v2/publisher_summary"
|
11
|
+
|
12
|
+
define_required_credentials do
|
13
|
+
[:api_key]
|
14
|
+
end
|
15
|
+
|
16
|
+
def revenues(from, to)
|
17
|
+
(from..to).map do |day|
|
18
|
+
store = Hash.new {|h,k| h[k] = Hash.new { |h1,k1| h1[k1]=Hash.new(0)}}
|
19
|
+
csv_data = csv_data(day)
|
20
|
+
|
21
|
+
CSV(csv_data, CsvOptions).each do |row|
|
22
|
+
next if zero_row?(row)
|
23
|
+
hsh = store[row["App Name"]][row["Start Date"]]
|
24
|
+
|
25
|
+
["Earnings ($)", "Clicks", "Impressions", "Requests"].
|
26
|
+
each do |colname|
|
27
|
+
hsh[colname] += row[colname].to_f
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
store.map do |title, data|
|
32
|
+
data.map do |date, hsh|
|
33
|
+
{
|
34
|
+
:impressions => hsh["Impressions"].to_i,
|
35
|
+
:requests => hsh["Requests"].to_i,
|
36
|
+
:clicks => hsh["Clicks"].to_i,
|
37
|
+
:amount => hsh["Earnings ($)"].to_f,
|
38
|
+
:date => Date.strptime(date, "%Y-%m-%d"),
|
39
|
+
:appname => title
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end.flatten
|
43
|
+
end.flatten
|
44
|
+
end
|
45
|
+
|
46
|
+
def report(from, to)
|
47
|
+
(from..to).map do |day|
|
48
|
+
csv_data(day)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def zero_row?(csvrow)
|
53
|
+
csvrow["Earnings ($)"] == "0" && csvrow["Impressions"] == "0"
|
54
|
+
end
|
55
|
+
|
56
|
+
def csv_data(date)
|
57
|
+
uri = Addressable::URI.new
|
58
|
+
uri.query_values = {
|
59
|
+
:user_credentials => credentials.api_key,
|
60
|
+
:date => date.strftime("%m%d%Y"),
|
61
|
+
:format => 'csv',
|
62
|
+
}
|
63
|
+
datauri = URI.parse("%s?%s" % [BASE_URL, uri.query])
|
64
|
+
|
65
|
+
Net::HTTP::Persistent.new('adcolony').request(datauri).body
|
66
|
+
end
|
67
|
+
end
|