adtekio_adnetworks 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (212) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +24 -0
  5. data/README.md +333 -0
  6. data/Rakefile +56 -0
  7. data/VERSION +1 -0
  8. data/adtekio_adnetworks.gemspec +297 -0
  9. data/lib/adtekio_adnetworks.rb +6 -0
  10. data/lib/adtekio_adnetworks/api_key_scrapers.rb +59 -0
  11. data/lib/adtekio_adnetworks/api_key_scrapers/adcolony.rb +20 -0
  12. data/lib/adtekio_adnetworks/api_key_scrapers/applift.rb +13 -0
  13. data/lib/adtekio_adnetworks/api_key_scrapers/applovin.rb +13 -0
  14. data/lib/adtekio_adnetworks/api_key_scrapers/chartboost.rb +18 -0
  15. data/lib/adtekio_adnetworks/api_key_scrapers/crossinstall.rb +13 -0
  16. data/lib/adtekio_adnetworks/api_key_scrapers/leadbolt.rb +18 -0
  17. data/lib/adtekio_adnetworks/api_key_scrapers/loopme.rb +12 -0
  18. data/lib/adtekio_adnetworks/api_key_scrapers/mdotm.rb +22 -0
  19. data/lib/adtekio_adnetworks/api_key_scrapers/revmob.rb +22 -0
  20. data/lib/adtekio_adnetworks/api_key_scrapers/tapjoy.rb +19 -0
  21. data/lib/adtekio_adnetworks/api_key_scrapers/unilead.rb +13 -0
  22. data/lib/adtekio_adnetworks/api_key_scrapers/vungle.rb +23 -0
  23. data/lib/adtekio_adnetworks/importers.rb +58 -0
  24. data/lib/adtekio_adnetworks/importers/cost/adcolony.rb +43 -0
  25. data/lib/adtekio_adnetworks/importers/cost/adquant.rb +68 -0
  26. data/lib/adtekio_adnetworks/importers/cost/appia.rb +47 -0
  27. data/lib/adtekio_adnetworks/importers/cost/applifier.rb +64 -0
  28. data/lib/adtekio_adnetworks/importers/cost/applift.rb +41 -0
  29. data/lib/adtekio_adnetworks/importers/cost/applovin.rb +52 -0
  30. data/lib/adtekio_adnetworks/importers/cost/bidmotion.rb +82 -0
  31. data/lib/adtekio_adnetworks/importers/cost/chartboost.rb +40 -0
  32. data/lib/adtekio_adnetworks/importers/cost/crossinstall.rb +34 -0
  33. data/lib/adtekio_adnetworks/importers/cost/facebook.rb +39 -0
  34. data/lib/adtekio_adnetworks/importers/cost/fractionalmedia.rb +104 -0
  35. data/lib/adtekio_adnetworks/importers/cost/fyber.rb +54 -0
  36. data/lib/adtekio_adnetworks/importers/cost/gamegenetics.rb +44 -0
  37. data/lib/adtekio_adnetworks/importers/cost/glispa.rb +59 -0
  38. data/lib/adtekio_adnetworks/importers/cost/googleadwords.rb +99 -0
  39. data/lib/adtekio_adnetworks/importers/cost/jampp.rb +57 -0
  40. data/lib/adtekio_adnetworks/importers/cost/leadbolt.rb +43 -0
  41. data/lib/adtekio_adnetworks/importers/cost/lifestreet.rb +49 -0
  42. data/lib/adtekio_adnetworks/importers/cost/loopme.rb +63 -0
  43. data/lib/adtekio_adnetworks/importers/cost/matomy.rb +65 -0
  44. data/lib/adtekio_adnetworks/importers/cost/mdotm.rb +69 -0
  45. data/lib/adtekio_adnetworks/importers/cost/mmg.rb +67 -0
  46. data/lib/adtekio_adnetworks/importers/cost/mnectar.rb +45 -0
  47. data/lib/adtekio_adnetworks/importers/cost/moboqo.rb +33 -0
  48. data/lib/adtekio_adnetworks/importers/cost/mobpartner.rb +46 -0
  49. data/lib/adtekio_adnetworks/importers/cost/nanigans.rb +114 -0
  50. data/lib/adtekio_adnetworks/importers/cost/revmob.rb +44 -0
  51. data/lib/adtekio_adnetworks/importers/cost/rtbmob.rb +48 -0
  52. data/lib/adtekio_adnetworks/importers/cost/startapp.rb +47 -0
  53. data/lib/adtekio_adnetworks/importers/cost/supersonic.rb +77 -0
  54. data/lib/adtekio_adnetworks/importers/cost/tapjoy.rb +42 -0
  55. data/lib/adtekio_adnetworks/importers/cost/tokenads.rb +46 -0
  56. data/lib/adtekio_adnetworks/importers/cost/unilead.rb +39 -0
  57. data/lib/adtekio_adnetworks/importers/cost/vungle.rb +58 -0
  58. data/lib/adtekio_adnetworks/importers/cost_import.rb +13 -0
  59. data/lib/adtekio_adnetworks/importers/revenue/adcolony.rb +67 -0
  60. data/lib/adtekio_adnetworks/importers/revenue/applifier.rb +55 -0
  61. data/lib/adtekio_adnetworks/importers/revenue/applovin.rb +58 -0
  62. data/lib/adtekio_adnetworks/importers/revenue/chartboost.rb +43 -0
  63. data/lib/adtekio_adnetworks/importers/revenue/flurry.rb +85 -0
  64. data/lib/adtekio_adnetworks/importers/revenue/fyber.rb +61 -0
  65. data/lib/adtekio_adnetworks/importers/revenue/hypr_mx.rb +69 -0
  66. data/lib/adtekio_adnetworks/importers/revenue/lifestreet.rb +59 -0
  67. data/lib/adtekio_adnetworks/importers/revenue/mdotm.rb +38 -0
  68. data/lib/adtekio_adnetworks/importers/revenue/mopub.rb +54 -0
  69. data/lib/adtekio_adnetworks/importers/revenue/nexage.rb +71 -0
  70. data/lib/adtekio_adnetworks/importers/revenue/supersonic.rb +73 -0
  71. data/lib/adtekio_adnetworks/importers/revenue/tapsense.rb +38 -0
  72. data/lib/adtekio_adnetworks/importers/revenue/trialpay.rb +41 -0
  73. data/lib/adtekio_adnetworks/importers/revenue/vungle.rb +75 -0
  74. data/lib/adtekio_adnetworks/importers/revenue_import.rb +27 -0
  75. data/lib/adtekio_adnetworks/postbacks.rb +193 -0
  76. data/lib/adtekio_adnetworks/postbacks/aarki.rb +17 -0
  77. data/lib/adtekio_adnetworks/postbacks/adaction.rb +18 -0
  78. data/lib/adtekio_adnetworks/postbacks/adcash.rb +19 -0
  79. data/lib/adtekio_adnetworks/postbacks/adcolony.rb +90 -0
  80. data/lib/adtekio_adnetworks/postbacks/adgorithms.rb +74 -0
  81. data/lib/adtekio_adnetworks/postbacks/adjapon_nend.rb +39 -0
  82. data/lib/adtekio_adnetworks/postbacks/adknowledge.rb +18 -0
  83. data/lib/adtekio_adnetworks/postbacks/admob.rb +17 -0
  84. data/lib/adtekio_adnetworks/postbacks/adp.rb +18 -0
  85. data/lib/adtekio_adnetworks/postbacks/adperio.rb +19 -0
  86. data/lib/adtekio_adnetworks/postbacks/adquant.rb +39 -0
  87. data/lib/adtekio_adnetworks/postbacks/adstract.rb +15 -0
  88. data/lib/adtekio_adnetworks/postbacks/adxperience.rb +16 -0
  89. data/lib/adtekio_adnetworks/postbacks/airpush.rb +17 -0
  90. data/lib/adtekio_adnetworks/postbacks/app_chocolate.rb +17 -0
  91. data/lib/adtekio_adnetworks/postbacks/appfload.rb +17 -0
  92. data/lib/adtekio_adnetworks/postbacks/appia.rb +18 -0
  93. data/lib/adtekio_adnetworks/postbacks/appintheair.rb +17 -0
  94. data/lib/adtekio_adnetworks/postbacks/applifier.rb +49 -0
  95. data/lib/adtekio_adnetworks/postbacks/applift.rb +88 -0
  96. data/lib/adtekio_adnetworks/postbacks/applovin.rb +127 -0
  97. data/lib/adtekio_adnetworks/postbacks/appnext.rb +17 -0
  98. data/lib/adtekio_adnetworks/postbacks/appredeem.rb +33 -0
  99. data/lib/adtekio_adnetworks/postbacks/appsfire.rb +19 -0
  100. data/lib/adtekio_adnetworks/postbacks/appturbo.rb +18 -0
  101. data/lib/adtekio_adnetworks/postbacks/apsalar.rb +21 -0
  102. data/lib/adtekio_adnetworks/postbacks/bee7.rb +17 -0
  103. data/lib/adtekio_adnetworks/postbacks/bidmotion.rb +80 -0
  104. data/lib/adtekio_adnetworks/postbacks/blindferretmedia.rb +17 -0
  105. data/lib/adtekio_adnetworks/postbacks/chartboost.rb +116 -0
  106. data/lib/adtekio_adnetworks/postbacks/cheetah.rb +32 -0
  107. data/lib/adtekio_adnetworks/postbacks/clickky.rb +30 -0
  108. data/lib/adtekio_adnetworks/postbacks/covus.rb +17 -0
  109. data/lib/adtekio_adnetworks/postbacks/crossinstall.rb +26 -0
  110. data/lib/adtekio_adnetworks/postbacks/cyberagent_ameba.rb +17 -0
  111. data/lib/adtekio_adnetworks/postbacks/cyberagent_amoad.rb +17 -0
  112. data/lib/adtekio_adnetworks/postbacks/cyberagent_imobile.rb +43 -0
  113. data/lib/adtekio_adnetworks/postbacks/cyberagent_kjnw.rb +17 -0
  114. data/lib/adtekio_adnetworks/postbacks/cyberagent_maio.rb +18 -0
  115. data/lib/adtekio_adnetworks/postbacks/cyberagent_nend.rb +40 -0
  116. data/lib/adtekio_adnetworks/postbacks/cyberagent_smartc.rb +17 -0
  117. data/lib/adtekio_adnetworks/postbacks/cyberagent_smartnews.rb +17 -0
  118. data/lib/adtekio_adnetworks/postbacks/cyberz_asta.rb +26 -0
  119. data/lib/adtekio_adnetworks/postbacks/cyberz_bead.rb +26 -0
  120. data/lib/adtekio_adnetworks/postbacks/cyberz_imobile.rb +28 -0
  121. data/lib/adtekio_adnetworks/postbacks/cyberz_nend.rb +30 -0
  122. data/lib/adtekio_adnetworks/postbacks/datalead.rb +17 -0
  123. data/lib/adtekio_adnetworks/postbacks/eccrine.rb +80 -0
  124. data/lib/adtekio_adnetworks/postbacks/eeline.rb +50 -0
  125. data/lib/adtekio_adnetworks/postbacks/f5.rb +30 -0
  126. data/lib/adtekio_adnetworks/postbacks/fiksu.rb +43 -0
  127. data/lib/adtekio_adnetworks/postbacks/fiksu_applift.rb +31 -0
  128. data/lib/adtekio_adnetworks/postbacks/fractionalmedia.rb +78 -0
  129. data/lib/adtekio_adnetworks/postbacks/fyber.rb +36 -0
  130. data/lib/adtekio_adnetworks/postbacks/gamegenetics.rb +17 -0
  131. data/lib/adtekio_adnetworks/postbacks/ginga.rb +26 -0
  132. data/lib/adtekio_adnetworks/postbacks/glispa.rb +96 -0
  133. data/lib/adtekio_adnetworks/postbacks/googleadwords.rb +19 -0
  134. data/lib/adtekio_adnetworks/postbacks/growmobile.rb +36 -0
  135. data/lib/adtekio_adnetworks/postbacks/heyzap.rb +51 -0
  136. data/lib/adtekio_adnetworks/postbacks/inmobi.rb +50 -0
  137. data/lib/adtekio_adnetworks/postbacks/inneractive.rb +17 -0
  138. data/lib/adtekio_adnetworks/postbacks/instal.rb +18 -0
  139. data/lib/adtekio_adnetworks/postbacks/iqu.rb +19 -0
  140. data/lib/adtekio_adnetworks/postbacks/ironsource.rb +19 -0
  141. data/lib/adtekio_adnetworks/postbacks/jampp.rb +48 -0
  142. data/lib/adtekio_adnetworks/postbacks/jestadigital.rb +18 -0
  143. data/lib/adtekio_adnetworks/postbacks/jumpramp.rb +17 -0
  144. data/lib/adtekio_adnetworks/postbacks/jumptap.rb +23 -0
  145. data/lib/adtekio_adnetworks/postbacks/leadbolt.rb +29 -0
  146. data/lib/adtekio_adnetworks/postbacks/lifestreet.rb +97 -0
  147. data/lib/adtekio_adnetworks/postbacks/liftoff.rb +66 -0
  148. data/lib/adtekio_adnetworks/postbacks/loopme.rb +17 -0
  149. data/lib/adtekio_adnetworks/postbacks/magic_solver.rb +18 -0
  150. data/lib/adtekio_adnetworks/postbacks/marimedia.rb +20 -0
  151. data/lib/adtekio_adnetworks/postbacks/matomy.rb +59 -0
  152. data/lib/adtekio_adnetworks/postbacks/mdotm.rb +116 -0
  153. data/lib/adtekio_adnetworks/postbacks/misterbell.rb +18 -0
  154. data/lib/adtekio_adnetworks/postbacks/mmg.rb +20 -0
  155. data/lib/adtekio_adnetworks/postbacks/mnectar.rb +22 -0
  156. data/lib/adtekio_adnetworks/postbacks/moblin.rb +17 -0
  157. data/lib/adtekio_adnetworks/postbacks/moboqo.rb +17 -0
  158. data/lib/adtekio_adnetworks/postbacks/mobpartner.rb +19 -0
  159. data/lib/adtekio_adnetworks/postbacks/mopub.rb +30 -0
  160. data/lib/adtekio_adnetworks/postbacks/motive_interactive.rb +32 -0
  161. data/lib/adtekio_adnetworks/postbacks/mundo.rb +17 -0
  162. data/lib/adtekio_adnetworks/postbacks/nanigans.rb +38 -0
  163. data/lib/adtekio_adnetworks/postbacks/nativex.rb +30 -0
  164. data/lib/adtekio_adnetworks/postbacks/neodau.rb +19 -0
  165. data/lib/adtekio_adnetworks/postbacks/neverblue.rb +19 -0
  166. data/lib/adtekio_adnetworks/postbacks/operamedia.rb +39 -0
  167. data/lib/adtekio_adnetworks/postbacks/pandora.rb +17 -0
  168. data/lib/adtekio_adnetworks/postbacks/phunware.rb +18 -0
  169. data/lib/adtekio_adnetworks/postbacks/pirasin.rb +16 -0
  170. data/lib/adtekio_adnetworks/postbacks/playhaven.rb +31 -0
  171. data/lib/adtekio_adnetworks/postbacks/pocketmath.rb +17 -0
  172. data/lib/adtekio_adnetworks/postbacks/propeller.rb +18 -0
  173. data/lib/adtekio_adnetworks/postbacks/quixey.rb +17 -0
  174. data/lib/adtekio_adnetworks/postbacks/realzeit.rb +60 -0
  175. data/lib/adtekio_adnetworks/postbacks/remerge.rb +66 -0
  176. data/lib/adtekio_adnetworks/postbacks/revmob.rb +17 -0
  177. data/lib/adtekio_adnetworks/postbacks/ripple.rb +18 -0
  178. data/lib/adtekio_adnetworks/postbacks/roostr.rb +17 -0
  179. data/lib/adtekio_adnetworks/postbacks/rtbcom.rb +28 -0
  180. data/lib/adtekio_adnetworks/postbacks/septeni.rb +17 -0
  181. data/lib/adtekio_adnetworks/postbacks/seven_games.rb +51 -0
  182. data/lib/adtekio_adnetworks/postbacks/startapp.rb +48 -0
  183. data/lib/adtekio_adnetworks/postbacks/supersonic.rb +19 -0
  184. data/lib/adtekio_adnetworks/postbacks/tapjoy.rb +36 -0
  185. data/lib/adtekio_adnetworks/postbacks/taptica.rb +21 -0
  186. data/lib/adtekio_adnetworks/postbacks/targetcircle.rb +41 -0
  187. data/lib/adtekio_adnetworks/postbacks/todacell.rb +18 -0
  188. data/lib/adtekio_adnetworks/postbacks/tokenads.rb +18 -0
  189. data/lib/adtekio_adnetworks/postbacks/trademob.rb +48 -0
  190. data/lib/adtekio_adnetworks/postbacks/trademob_magic_solver.rb +22 -0
  191. data/lib/adtekio_adnetworks/postbacks/trialpay.rb +18 -0
  192. data/lib/adtekio_adnetworks/postbacks/unilead.rb +78 -0
  193. data/lib/adtekio_adnetworks/postbacks/uppsmobi.rb +19 -0
  194. data/lib/adtekio_adnetworks/postbacks/vungle.rb +33 -0
  195. data/lib/adtekio_adnetworks/postbacks/w4.rb +17 -0
  196. data/lib/adtekio_adnetworks/postbacks/webmedia.rb +17 -0
  197. data/lib/adtekio_adnetworks/postbacks/yahoo.rb +20 -0
  198. data/lib/adtekio_adnetworks/postbacks/youappi.rb +116 -0
  199. data/lib/adtekio_adnetworks/postbacks/zemail.rb +19 -0
  200. data/test/helper.rb +78 -0
  201. data/test/unit/postbacks/test_chartboost.rb +105 -0
  202. data/test/unit/postbacks/test_mdotm.rb +35 -0
  203. data/test/unit/postbacks/test_playhaven.rb +76 -0
  204. data/test/unit/postbacks/test_trademob_magic_solver.rb +24 -0
  205. data/test/unit/postbacks/test_unilead.rb +67 -0
  206. data/test/unit/test_api_key_scrapers.rb +302 -0
  207. data/test/unit/test_base_postback_class.rb +82 -0
  208. data/test/unit/test_cost_importers.rb +12 -0
  209. data/test/unit/test_postbacks.rb +33 -0
  210. data/test/unit/test_postbacks_definition.rb +111 -0
  211. data/test/unit/test_revenue_importers.rb +12 -0
  212. 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,13 @@
1
+ module AdtekioAdnetworks
2
+ module Cost
3
+ # placeholder
4
+ end
5
+
6
+ module CostImport
7
+ include BaseImporter
8
+ end
9
+ end
10
+
11
+ Dir[File.join(File.dirname(__FILE__), 'cost', '*.rb')].each do |f|
12
+ require f
13
+ 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