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,65 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Matomy
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:username, :password]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
require 'mechanize'
|
10
|
+
|
11
|
+
agent = Mechanize.new
|
12
|
+
agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
13
|
+
agent.user_agent_alias = 'Mac Safari'
|
14
|
+
|
15
|
+
agent.post("https://network.adsmarket.com/site/LoginAttempt?rlink=", {
|
16
|
+
:login => "login",
|
17
|
+
:usr_Email => credentials.username,
|
18
|
+
:usr_Pwd => credentials.password})
|
19
|
+
|
20
|
+
page = agent.
|
21
|
+
post("https://network.adsmarket.com/site/MerchantReportsEarnings", {
|
22
|
+
"group1" => "std_Date",
|
23
|
+
"group2" => "std_CampaignId",
|
24
|
+
"group3" => "std_AffiliateId",
|
25
|
+
"program_id" => 0,
|
26
|
+
"campaign_type" => 0,
|
27
|
+
"campaign_status" => 0,
|
28
|
+
"creative_type" => 0,
|
29
|
+
"creative_size" => 0,
|
30
|
+
"product_activity" => -1,
|
31
|
+
"filter_by" => 1,
|
32
|
+
"timeperiod" => 7,
|
33
|
+
"timeperiod_span_start" => from.strftime("%d-%b-%Y"),
|
34
|
+
"timeperiod_span_end" => till.strftime("%d-%b-%Y"),
|
35
|
+
"approved_timeperiod" => 9,
|
36
|
+
"approved_timeperiod_span_start" => "",
|
37
|
+
"approved_timeperiod_span_end" => "",
|
38
|
+
"export_csv" => "export to CSV",
|
39
|
+
})
|
40
|
+
|
41
|
+
# retrieve the CSV content. There seems to be a prefix of
|
42
|
+
# \xEF\xBB\xBF in the csv data, so we replace this if it's
|
43
|
+
# there.
|
44
|
+
bodystr = page.links.select do |a|
|
45
|
+
a.text == "click here to download file "
|
46
|
+
end.first.click.body.sub(/^.?{3}Date/,"Date")
|
47
|
+
|
48
|
+
CSV.new(bodystr, :headers => :first_line, :col_sep => ",",
|
49
|
+
:quote_char => '"').to_a.map do |row|
|
50
|
+
next if row['Campaign'].blank?
|
51
|
+
|
52
|
+
{
|
53
|
+
:network => network,
|
54
|
+
:campaign => row['Campaign'],
|
55
|
+
:adgroup => :banner,
|
56
|
+
:ad => row["Publisher ID"],
|
57
|
+
:impressions => row['Impressions'].to_i,
|
58
|
+
:clicks => row['Clicks'].to_i,
|
59
|
+
:conversions => row['Leads'].to_i,
|
60
|
+
:amount => row['Approved Commissions'].gsub(/,/, '').to_f,
|
61
|
+
:date => Date.parse(row['Date']),
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Mdotm
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:username, :api_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaigns(from, till)
|
9
|
+
uri = Addressable::URI.parse("http://ads.mdotm.com/api/1.0/getCampaigns")
|
10
|
+
uri.query_values = {
|
11
|
+
:email => credentials.username,
|
12
|
+
:secretKey => credentials.api_key,
|
13
|
+
:startDT => from.to_s,
|
14
|
+
:endDT => till.to_s,
|
15
|
+
}
|
16
|
+
|
17
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
18
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
19
|
+
http.request(req)
|
20
|
+
end
|
21
|
+
|
22
|
+
JSON.parse(res.body)['response']['campaigns'].map do |campaign|
|
23
|
+
campaign['adGroups'].map do |adgroup|
|
24
|
+
(adgroup['performance'] || []).map do |performance|
|
25
|
+
filtered = performance.select do |key, _|
|
26
|
+
['impressions', 'clicks','conversions','price', 'logDate'].include? key
|
27
|
+
end
|
28
|
+
filtered['app'] = ""
|
29
|
+
filtered['campaign'] = campaign['campaignName']
|
30
|
+
filtered['adgroup'] = adgroup['adGroupName']
|
31
|
+
filtered
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end.flatten.group_by do |campaign|
|
35
|
+
[campaign['logDate'], campaign['campaign'], campaign['adgroup']]
|
36
|
+
end.map do |key, campaigns|
|
37
|
+
campaigns.inject({}) do |memo, campaign|
|
38
|
+
memo.merge(campaign) do |key, old_v, new_v|
|
39
|
+
if ['campaign', 'app', 'logDate', 'adgroup'].include? key
|
40
|
+
old_v
|
41
|
+
elsif key == 'price'
|
42
|
+
old_v.to_f + new_v.to_f
|
43
|
+
else
|
44
|
+
old_v.to_i + new_v.to_i
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def campaign_costs(from, till)
|
52
|
+
(from..till).step(10).map do |date_step_from|
|
53
|
+
date_step_till = [date_step_from + 9, till].min
|
54
|
+
|
55
|
+
sleep 1.5 # rate limit avoidance
|
56
|
+
campaigns(date_step_from, date_step_till).map do |campaign|
|
57
|
+
{
|
58
|
+
:date => Date.parse(campaign['logDate']),
|
59
|
+
:campaign => campaign['adgroup'],
|
60
|
+
:adgroup => campaign['adgroup'],
|
61
|
+
:impressions => campaign['impressions'],
|
62
|
+
:clicks => campaign['clicks'],
|
63
|
+
:conversions => campaign['conversions'],
|
64
|
+
:amount => campaign['price']
|
65
|
+
}
|
66
|
+
end
|
67
|
+
end.flatten
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Mmg
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:username, :password]
|
6
|
+
end
|
7
|
+
|
8
|
+
def csv_data(date)
|
9
|
+
agent = Mechanize.new
|
10
|
+
agent.user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) '+
|
11
|
+
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 '+
|
12
|
+
'Safari/537.36'
|
13
|
+
|
14
|
+
agent.post( "http://reporting.mobilda.com/adcenter/login.php", {
|
15
|
+
:username => credentials.username,
|
16
|
+
:password => credentials.password,
|
17
|
+
:client_time => (DateTime.now.strftime("%s").to_i +
|
18
|
+
3600).to_s + ".132",
|
19
|
+
:screen_width => 1920 })
|
20
|
+
|
21
|
+
datestr = date.strftime("%Y-%m-%d")
|
22
|
+
bodystr = agent.post( "http://reporting.mobilda.com/adcenter/"+
|
23
|
+
"index.php?mod=reports&act=view", {
|
24
|
+
"breadcrumb_title" => nil,
|
25
|
+
"group_by" => "product_id",
|
26
|
+
"pass_breadcrumbs" => 0,
|
27
|
+
"route_id" => 0,
|
28
|
+
"filter_country" => nil,
|
29
|
+
"filter_product_id" => nil,
|
30
|
+
"dt_range" => "#{datestr}:#{datestr}",
|
31
|
+
"dt_from" => datestr,
|
32
|
+
"dt_to" => datestr,
|
33
|
+
"pagenum" => 1,
|
34
|
+
"perpage" => 1000,
|
35
|
+
"export_to_excel" => 1
|
36
|
+
}).body
|
37
|
+
|
38
|
+
# mmg use a pop-up via Javascript, i.e. you press download as
|
39
|
+
# excel and the page gets submitted, on the new page a Javascript
|
40
|
+
# popup opens that starts the download. So we need to scan the
|
41
|
+
# page for the download hash and then use that.
|
42
|
+
hex = bodystr.match(/downloadCSVLite\('reports','(.*)'\);/)
|
43
|
+
|
44
|
+
agent.get("http://reporting.mobilda.com/adcenter/index.php?"+
|
45
|
+
"mod=reports&act=download_csv&hash=#{hex[1]}&output=file") if hex
|
46
|
+
end
|
47
|
+
|
48
|
+
def campaign_costs(from, till)
|
49
|
+
from.upto(till).map do |date|
|
50
|
+
resp = csv_data(date)
|
51
|
+
next unless resp
|
52
|
+
CSV.new(resp.body, :headers => :first_line, :col_sep => ",",
|
53
|
+
:quote_char => '"').map do |row|
|
54
|
+
campaign_name = row["Campaign"].split('::').last.strip.gsub(' ', '_')
|
55
|
+
next if campaign_name == "Total"
|
56
|
+
next if row['Spent($)'].to_f == 0.0
|
57
|
+
{
|
58
|
+
:date => date,
|
59
|
+
:campaign => campaign_name,
|
60
|
+
:clicks => row['Clicks'].to_i,
|
61
|
+
:conversions => row['Conversions'].to_i,
|
62
|
+
:amount => row['Spent($)'].to_f
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end.flatten
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Mnectar
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
Endpoint = "http://api.mnectar.com/report/v1/advertiser/daily"
|
5
|
+
Stepsize = 30
|
6
|
+
|
7
|
+
define_required_credentials do
|
8
|
+
[:advertiser_id, :secret_key]
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_data(from, till)
|
12
|
+
(from..till).step(Stepsize).map do |start_date|
|
13
|
+
uri = Addressable::URI.parse(Endpoint)
|
14
|
+
uri.query_values = {
|
15
|
+
'advertiser-identifier' => credentials.advertiser_id,
|
16
|
+
'token' => credentials.secret_key,
|
17
|
+
'start-date' => start_date.strftime("%Y-%m-%d"),
|
18
|
+
'end-date' => (start_date + Stepsize - 1).strftime("%Y-%m-%d"),
|
19
|
+
'timezone' => 'GMT',
|
20
|
+
}
|
21
|
+
|
22
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
23
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
24
|
+
http.request(req)
|
25
|
+
end
|
26
|
+
|
27
|
+
JSON.parse(res.body, :symbolize_names => true)
|
28
|
+
end.flatten
|
29
|
+
end
|
30
|
+
|
31
|
+
def campaign_costs(from, till)
|
32
|
+
load_data(from, till).map do |row|
|
33
|
+
next if row[:totalSpend].to_f == 0
|
34
|
+
{
|
35
|
+
:date => Date.parse(row[:intervalDate]),
|
36
|
+
:campaign => row[:campaignName],
|
37
|
+
:adgroup => row[:adName],
|
38
|
+
:impressions => row[:impressions].to_i,
|
39
|
+
:clicks => row[:clicks].to_i,
|
40
|
+
:conversions => row[:conversions].to_i,
|
41
|
+
:amount => row[:totalSpend].to_f
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Moboqo
|
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.parse("http://dashboard.moboqo.com/stats/stats.json")
|
10
|
+
uri.query_values = {
|
11
|
+
:api_key => credentials.api_key,
|
12
|
+
:start_date => from.strftime("%Y-%m-%d"),
|
13
|
+
:end_date => till.strftime("%Y-%m-%d"),
|
14
|
+
"group[0]" => "Stat.date",
|
15
|
+
"group[1]" => "Offer.name",
|
16
|
+
}
|
17
|
+
|
18
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
19
|
+
|
20
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
21
|
+
http.request(req)
|
22
|
+
end
|
23
|
+
|
24
|
+
JSON.parse(res.body)['data'].map do |datapoint|
|
25
|
+
{
|
26
|
+
:date => Date.strptime(datapoint["date"], "%Y-%m-%d"),
|
27
|
+
:campaign => datapoint["offer"],
|
28
|
+
:conversions => datapoint['conversions'].to_i,
|
29
|
+
:amount => datapoint['cost'].gsub(/\$/, '').to_f
|
30
|
+
}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Mobpartner
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
define_required_credentials do
|
5
|
+
[:login, :api_key]
|
6
|
+
end
|
7
|
+
|
8
|
+
def campaign_costs(from, till)
|
9
|
+
uri = Addressable::URI.
|
10
|
+
parse("http://reportapiv2.mobpartner.mobi/report2.php")
|
11
|
+
|
12
|
+
uri.query_values = {
|
13
|
+
:login => credentials.login,
|
14
|
+
:key => credentials.api_key,
|
15
|
+
:date_type => :daily,
|
16
|
+
:date_begin => from.strftime("%Y%m%d"),
|
17
|
+
:date_end => till.strftime("%Y%m%d"),
|
18
|
+
:campaign => :ALL,
|
19
|
+
:clicks => 1,
|
20
|
+
:imps => 1,
|
21
|
+
:nb_trx_notrefused => 1,
|
22
|
+
:default_values => 0,
|
23
|
+
:display_name => 1,
|
24
|
+
:download => 1,
|
25
|
+
:format => :csv,
|
26
|
+
:date_format => 2,
|
27
|
+
:value_trx_notrefused_total => 1,
|
28
|
+
}
|
29
|
+
|
30
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
31
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
32
|
+
http.request(req)
|
33
|
+
end
|
34
|
+
|
35
|
+
CSV.parse(res.body, {:col_sep => ";"}).drop(1).map do |row|
|
36
|
+
{
|
37
|
+
:date => Date.parse(row[0]),
|
38
|
+
:campaign => row[2],
|
39
|
+
:impressions => row[3].to_i,
|
40
|
+
:clicks => row[4].to_i,
|
41
|
+
:conversions => row[5].to_i,
|
42
|
+
:amount => row[6].to_f,
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Nanigans
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
APPLE_SHARE = {
|
5
|
+
:AUD => 0.636,
|
6
|
+
:CHF => 0.648,
|
7
|
+
:DKK => 0.608,
|
8
|
+
:EUR => 0.608,
|
9
|
+
:GBP => 0.608,
|
10
|
+
:NOK => 0.560,
|
11
|
+
:SEK => 0.608,
|
12
|
+
}
|
13
|
+
|
14
|
+
|
15
|
+
REVENUE_UPDATE_DATE = Date.parse('2014-05-26')
|
16
|
+
|
17
|
+
define_required_credentials do
|
18
|
+
[:partner_id, :secret, :username, :password]
|
19
|
+
end
|
20
|
+
|
21
|
+
def booking_days(date)
|
22
|
+
max_days = (Date.today - date).to_i
|
23
|
+
[1, 2, 3, 7, 14, 30, 60, 90, 120].select do |day|
|
24
|
+
day <= max_days
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def day_to_nanigans_field(day)
|
29
|
+
case day.to_i
|
30
|
+
when 1 then :a8val
|
31
|
+
when 2 then :a9val
|
32
|
+
when 3 then :a10val
|
33
|
+
when 7 then :a5val
|
34
|
+
when 14 then :a11val
|
35
|
+
when 30 then :a12val
|
36
|
+
when 60 then :a13val
|
37
|
+
when 90 then :a14val
|
38
|
+
when 120 then :a15val
|
39
|
+
else
|
40
|
+
raise "invalid day"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def campaign_data(from, till, game_type)
|
45
|
+
time_gmt = Time.now().getgm.strftime("%Y%m%d%H%M%S")
|
46
|
+
sig_string = "#{credentials.partner_id}&#{time_gmt}&#{credentials.secret}"
|
47
|
+
sig = Digest::SHA1.base64digest(sig_string)
|
48
|
+
sig = sig.gsub('+','.').gsub('/', '_')
|
49
|
+
|
50
|
+
uri = Addressable::URI.parse("https://wwwapi.nanigans.com/reporting/api/wooga/generateAdLevelReport")
|
51
|
+
http = Net::HTTP.new(uri.hostname, 443)
|
52
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
53
|
+
http.use_ssl = true
|
54
|
+
http.ssl_timeout = 900
|
55
|
+
http.read_timeout = 900
|
56
|
+
|
57
|
+
from.upto(till).map do |date|
|
58
|
+
booking_fields = booking_days(date).map {|day| day_to_nanigans_field(day)}
|
59
|
+
fields = [:site, :budget_pool, :ad_plan, :countries, :user_device]
|
60
|
+
fields = fields.push(:placement_id) if game_type == :flash
|
61
|
+
data = {
|
62
|
+
:method => :generateAdLevelReport,
|
63
|
+
:params => {
|
64
|
+
:partner_id => credentials.partner_id,
|
65
|
+
:tms => time_gmt,
|
66
|
+
:sig => sig,
|
67
|
+
:date => date.to_s,
|
68
|
+
:attribution => :click,
|
69
|
+
:fields => fields,
|
70
|
+
:metrics => [:impressions, :clicks, :a1, :fb_spend_wfees, :purchase_value, :purchase_users, :a5val] + booking_fields
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
request = Net::HTTP::Post.new(uri.request_uri,
|
75
|
+
{"Content-Type" => "application/json"})
|
76
|
+
request.basic_auth credentials.username, credentials.password
|
77
|
+
request.body = data.to_json
|
78
|
+
|
79
|
+
res = http.request(request)
|
80
|
+
JSON.parse(res.body, :symbolize_names => true)[:_data][:data]
|
81
|
+
end.flatten
|
82
|
+
end
|
83
|
+
|
84
|
+
def campaign_costs(from, till)
|
85
|
+
[:mobile, :flash].map do |game_type|
|
86
|
+
campaign_data(from, till, game_type).map do |campaign|
|
87
|
+
next if campaign[:budget_pool] =~ /rtb/i
|
88
|
+
next if campaign[:fb_spend_wfees].to_f == 0.0
|
89
|
+
|
90
|
+
date = Date.parse(campaign[:date])
|
91
|
+
[:impressions, :clicks, :a1, :purchase_users, :purchase_value].each do |key|
|
92
|
+
campaign[key] = nil if campaign[key].to_f == 0.0
|
93
|
+
end
|
94
|
+
|
95
|
+
campaign_name = game_type == :flash ? campaign[:placement_id] : campaign[:ad_plan]
|
96
|
+
country = campaign[:countries].try(:downcase).try(:split, /_|,/).try(:last)
|
97
|
+
device = campaign[:user_device].try(:downcase).try(:split, /_|,/).try(:last)
|
98
|
+
|
99
|
+
{
|
100
|
+
:date => date,
|
101
|
+
:campaign => campaign_name,
|
102
|
+
:adgroup => country,
|
103
|
+
:ad => device,
|
104
|
+
:impressions => campaign[:impressions].try(:to_i),
|
105
|
+
:clicks => campaign[:clicks].try(:to_i),
|
106
|
+
:conversions => campaign[:a1].try(:to_i),
|
107
|
+
:amount => campaign[:fb_spend_wfees].try(:to_f),
|
108
|
+
:target_country => country,
|
109
|
+
:target_device => device,
|
110
|
+
}
|
111
|
+
end.compact
|
112
|
+
end.flatten
|
113
|
+
end
|
114
|
+
end
|