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.
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,55 @@
1
+ class AdtekioAdnetworks::Revenue::Applifier
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ CsvOptions = {
5
+ :col_sep => ",",
6
+ :quote_char => '"',
7
+ :headers => :first_row,
8
+ }
9
+
10
+ BASE_URL = "https://gameads-admin.applifier.com/stats/monetization-api"
11
+
12
+ define_required_credentials do
13
+ [:api_key]
14
+ end
15
+
16
+ def revenues(from, to)
17
+ report(from,to).map do |csv_data|
18
+ CSV(csv_data, CsvOptions).map do |row|
19
+ {
20
+ :impressions => row["views"].to_i,
21
+ :amount => row["revenue"].to_f,
22
+ :date => Date.strptime(row["Date"], "%Y-%m-%d"),
23
+ :appname => row["Source game name"]
24
+ }
25
+ end
26
+ end.flatten
27
+ end
28
+
29
+ def report(from,to)
30
+ (from..to).map do |day|
31
+ csv_data(day)
32
+ end
33
+ end
34
+
35
+ def csv_data(date)
36
+ uri = Addressable::URI.new
37
+ uri.query_values = {
38
+ :apikey => credentials.api_key,
39
+ :start => date.strftime("%Y-%m-%d"),
40
+ :end => (date+1).strftime("%Y-%m-%d"),
41
+ :fields => 'views,revenue',
42
+ :splitBy => 'source'
43
+ }
44
+ datauri = URI.parse("%s?%s" % [BASE_URL, uri.query])
45
+
46
+ # follow one redirect.
47
+ request = Net::HTTP::Persistent.new('applifier').request(datauri)
48
+ if request.code =~ /3../
49
+ Net::HTTP::Persistent.new('applifier').
50
+ request(URI.parse(request.header["Location"])).body
51
+ else
52
+ request.body
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,58 @@
1
+ class AdtekioAdnetworks::Revenue::Applovin
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ BaseUrl = "https://r.applovin.com/report"
5
+ ReportColumns = "application,platform,package_name,revenue,day,impressions,clicks,ad_type"
6
+
7
+ define_required_credentials do
8
+ [:api_key]
9
+ end
10
+
11
+ def revenues(from, to)
12
+ report(from, to).map do |(package, ad_type, date), values|
13
+ osv = values.map{ |a| OpenStruct.new(a) }
14
+
15
+ {
16
+ :impressions => osv.map(&:impressions).map(&:to_i).sum,
17
+ :clicks => osv.map(&:clicks).map(&:to_i).sum,
18
+ :amount => osv.map(&:revenue).map(&:to_f).sum,
19
+ :date => date,
20
+ :appname => package,
21
+ :not_matched => not_matched(:ad_type => ad_type,
22
+ :platform => osv.map(&:platform).join(","))
23
+ }
24
+ end
25
+ end
26
+
27
+ def report(from, to)
28
+ @report ||= data({ :api_key => credentials.api_key,
29
+ :start => from.strftime("%Y-%m-%d"),
30
+ :end => to.strftime("%Y-%m-%d"),
31
+ :format => :json,
32
+ :columns => ReportColumns,
33
+ :report_type => :publisher,
34
+ }).group_by do |row|
35
+ [row[:package_name], row[:ad_type], Date.parse(row[:day])]
36
+ end
37
+ end
38
+
39
+ def data(params)
40
+ cipher_suit_backup = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers]
41
+
42
+ uri = Addressable::URI.parse(BaseUrl)
43
+ uri.query_values = params
44
+
45
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] =
46
+ 'HIGH:MEDIUM:!ADH:!EDH:!DHE'
47
+
48
+ http = Net::HTTP.new(uri.hostname, 443)
49
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
50
+ http.use_ssl = true
51
+
52
+ request = Net::HTTP::Get.new uri.request_uri
53
+ response = http.request(request)
54
+ JSON.parse(response.body, :symbolize_names => true)[:results]
55
+ ensure
56
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] = cipher_suit_backup
57
+ end
58
+ end
@@ -0,0 +1,43 @@
1
+ class AdtekioAdnetworks::Revenue::Chartboost
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ BASE_URL = "https://analytics.chartboost.com/queue/app"
5
+
6
+ define_required_credentials do
7
+ [:user_id, :signature]
8
+ end
9
+
10
+ def revenues(from, to)
11
+ report(from,to).map do |hsh|
12
+ {
13
+ :impressions => hsh["impressionsDelivered"].to_i,
14
+ :amount => hsh["moneyEarned"].to_f,
15
+ :date => Date.strptime(hsh["dt"], "%Y-%m-%d"),
16
+ :appname => hsh["app"],
17
+ :not_matched => not_matched(:platform => hsh["platform"],
18
+ :appBundleId => hsh["appBundleId"],
19
+ :appId => hsh["appId"])
20
+ }
21
+ end
22
+ end
23
+
24
+ def report(from, to)
25
+ JSON(Net::HTTP::Persistent.new('chartboost').
26
+ request(query_url(from,to)).body)
27
+ end
28
+
29
+ def query_url(from, to)
30
+ params = {
31
+ :userId => credentials.user_id,
32
+ :userSignature => credentials.signature,
33
+ :dateMin => from.strftime("%Y-%m-%d"),
34
+ :dateMax => to.strftime("%Y-%m-%d"),
35
+ :groupBy => :app,
36
+ :aggregate => :daily,
37
+ }
38
+
39
+ uri = Addressable::URI.new
40
+ uri.query_values = params
41
+ URI.parse("%s?%s" % [BASE_URL, uri.query])
42
+ end
43
+ end
@@ -0,0 +1,85 @@
1
+ class AdtekioAdnetworks::Revenue::Flurry
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ define_required_credentials do
5
+ [:keys, :access_code]
6
+ end
7
+
8
+ def revenues(from, to)
9
+ report(from, to).map do |data|
10
+ data.map do |adspace_id, values|
11
+ next if values.nil?
12
+ values.map do |hsh|
13
+ check_version!(hsh['@version'], "1.0")
14
+ check_currency!(hsh["currency"], "usd")
15
+
16
+ next if hsh["results"].nil?
17
+ date = Date.strptime(hsh["results"]["date"], "%Y-%m-%d")
18
+
19
+ # Kinda confusing since the data is duplicated for each
20
+ # day. We import everything but flurry sends on a per-country
21
+ # basis with then a global value. That means the total
22
+ # of all entries for day with country should be the same
23
+ # as the entry with country == null.
24
+ ( (hsh["results"]["country_stats"] || []) +
25
+ [hsh['results']["global_stats"]]).compact.map do |dpt|
26
+ {
27
+ :date => date,
28
+ :appname => adspace_id,
29
+ :country => dpt["country"],
30
+ :amount => dpt["revenue"].to_f,
31
+ :clicks => dpt["clicks"].to_i,
32
+ :impressions => dpt["impressions"].to_i,
33
+ :installs => dpt["installs"].to_i
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end.flatten.compact
39
+ end
40
+
41
+ def report(from,to)
42
+ creds = credentials.keys["adspace_id"].zip(credentials.keys["api_key"])
43
+ creds.map do |adspace_id, api_key|
44
+ { adspace_id => ( (from..to).map do |date|
45
+ data_for_apikey(api_key, adspace_id, date)
46
+ end)
47
+ }
48
+ end
49
+ end
50
+
51
+ def data_for_apikey(key, adspaceid, for_date = Date.today-1)
52
+ sdate, edate = [for_date, for_date+1].map { |a| a.strftime("%Y-%m-%d") }
53
+
54
+ uri = Addressable::URI.new
55
+ uri.query_values = {
56
+ :apiAccessCode => credentials.access_code,
57
+ :adSpaceId => adspaceid,
58
+ :apiKey => key,
59
+ :startDate => sdate,
60
+ :endDate => edate
61
+ }
62
+
63
+ datauri = URI.
64
+ parse("%s?%s" % ["http://api.flurry.com/ffp/v1/AdSpaceCountry",
65
+ uri.query])
66
+
67
+ repeatthis(10) do
68
+ JSON(Net::HTTP::Persistent.new('flurry').request(datauri).body)
69
+ end
70
+ end
71
+
72
+ def repeatthis(cnt=5, timeout=0.1, &block)
73
+ last_exception = nil
74
+ cnt.times do
75
+ begin
76
+ return yield
77
+ rescue Exception => e
78
+ last_exception = e
79
+ sleep timeout
80
+ next
81
+ end
82
+ end
83
+ raise last_exception
84
+ end
85
+ end
@@ -0,0 +1,61 @@
1
+ class AdtekioAdnetworks::Revenue::Fyber
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ REPORT_URL =
5
+ "https://dashboard.fyber.com/publishers/v1/28839/statistics.json"
6
+
7
+ define_required_credentials do
8
+ [:key]
9
+ end
10
+
11
+ def revenues(from, to)
12
+ report(from,to).map do |dpt|
13
+ appname = dpt['readable'].strip
14
+ from.upto(to).each_with_index.map do |date, idx|
15
+ {
16
+ :completions => dpt["transactions"][idx].to_i,
17
+ :impressions => dpt["views"][idx].to_i,
18
+ :clicks => dpt["clicks"][idx].to_i,
19
+ :amount => dpt["payout_usd"][idx].to_f,
20
+ :date => date,
21
+ :appname => appname,
22
+ :not_matched => not_matched(:id => dpt["id"])
23
+ }
24
+ end
25
+ end.flatten.compact
26
+ end
27
+
28
+ def report(from,to)
29
+ load_data({
30
+ :start_date => from.to_s,
31
+ :end_date => to.to_s,
32
+ :group_by => :applications,
33
+ :aggregation_level => :days,
34
+ })
35
+ end
36
+
37
+ def hash(params)
38
+ value = Hash[params.sort_by{|k, _| k}].reject do |_,v|
39
+ v.to_s.blank?
40
+ end.map do |k,v|
41
+ "#{k}=#{v}"
42
+ end.inject("/publishers/v1/28839/statistics.json") do |string, param|
43
+ string + "&" + param
44
+ end + "&" + credentials.key
45
+
46
+ Digest::SHA1.hexdigest value
47
+ end
48
+
49
+ def load_data(params)
50
+ uri = Addressable::URI.parse(REPORT_URL)
51
+ uri.query_values = params.merge({:hashkey => hash(params)})
52
+ response = http_client.request(URI.parse(uri.to_s))
53
+ JSON(response.body)['applications']
54
+ end
55
+
56
+ def http_client
57
+ @http_client ||= Net::HTTP::Persistent.new('fyber').tap do |client|
58
+ client.verify_mode = OpenSSL::SSL::VERIFY_NONE
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,69 @@
1
+ class AdtekioAdnetworks::Revenue::HyprMx
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ BASE_URL = 'https://live.hyprmx.com/fyber/v1/'
5
+
6
+ define_required_credentials do
7
+ [:apps]
8
+ end
9
+
10
+ def revenues(from, to)
11
+ # We import everything but hypermx sends on a per-country
12
+ # basis with then a global value. That means the total
13
+ # of all entries for day with country should be the same
14
+ # as the entry with country == null, for a specific date.
15
+ report(from,to).map do |dpt|
16
+ ((dpt[:country_stats] || []) + [dpt[:global_stats]]).map do |stats|
17
+ {
18
+ :appname => dpt[:appname],
19
+ :date => dpt[:date],
20
+ :amount => stats[:revenue].to_f,
21
+ :impressions => stats[:impressions].to_i,
22
+ :completions => stats[:completions].to_i,
23
+ :country => stats[:country],
24
+ :not_matched => not_matched(:dist_id => dpt[:dist_id])
25
+ }
26
+ end
27
+ end.flatten.compact
28
+ end
29
+
30
+ def report(from,to)
31
+ cnt = (credentials.apps["dist_id"] || []).count
32
+
33
+ cnt.times.map do |idx|
34
+ data = load_data({ :app_id => credentials.apps["dist_id"][idx],
35
+ :placement_id => credentials.apps["placement_id"][idx],
36
+ :start_date => from.to_s,
37
+ :end_date => to.to_s,
38
+ }, credentials.apps["api_key"][idx])
39
+
40
+ check_currency!(data[:currency], "usd")
41
+
42
+ data[:results].map do |dpt|
43
+ dpt.merge({ :appname => credentials.apps["placement_id"][idx],
44
+ :date => Date.strptime(dpt[:date],"%Y-%m-%d"),
45
+ :dist_id => credentials.apps["dist_id"][idx]})
46
+ end
47
+ end.flatten.compact
48
+ end
49
+
50
+ def http_client
51
+ @http_client ||= Net::HTTP::Persistent.new('hyprmx').tap do |client|
52
+ client.verify_mode = OpenSSL::SSL::VERIFY_NONE
53
+ end
54
+ end
55
+
56
+ def hash(params, api_key)
57
+ value = Hash[params.sort_by{|k, _| k}].map do |k,v|
58
+ "#{k}=#{v}"
59
+ end.join('&') + "&" + api_key
60
+ Digest::SHA1.hexdigest value
61
+ end
62
+
63
+ def load_data(params, api_key)
64
+ uri = Addressable::URI.parse(BASE_URL)
65
+ uri.query_values = params.merge({:hash_value => hash(params, api_key)})
66
+ response = http_client.request(URI.parse(uri.to_s))
67
+ JSON(response.body, :symbolize_names => true)
68
+ end
69
+ end
@@ -0,0 +1,59 @@
1
+ class AdtekioAdnetworks::Revenue::Lifestreet
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ define_required_credentials do
5
+ [:username, :password]
6
+ end
7
+
8
+ def revenues(from, to)
9
+ add_global_stats(from, to).map do |(date, appname), values|
10
+ values.map do |dpt|
11
+ {
12
+ :appname => appname,
13
+ :date => Date.strptime(date, "%Y-%m-%d"),
14
+ :country => dpt["Country.name"],
15
+ :impressions => dpt["adImps"].to_i,
16
+ :amount => dpt["adCost"].to_f
17
+ }
18
+ end
19
+ end.flatten
20
+ end
21
+
22
+ def add_global_stats(from, to)
23
+ # report comes split by country without a summary entry
24
+ # over all countries, so add this summary.
25
+ Hash[report(from,to)["data"].
26
+ group_by { |a| [a["Date"], a["AdSlot.name"]] }.
27
+ map do |(date, appname), values|
28
+ [ [date,appname], values +
29
+ [{ "Date" => date,
30
+ "AdSlot.name" => appname,
31
+ "Country.name" => nil,
32
+ "adImps" => values.map{ |a| a["adImps"] }.sum,
33
+ "adCost" => values.map{ |a| a["adCost"] }.sum }]]
34
+ end]
35
+ end
36
+
37
+ def report(from, to)
38
+ uri = Addressable::URI.
39
+ parse("https://my.lifestreetmedia.com/reporting/run/")
40
+ request = Net::HTTP::Post.new uri.request_uri
41
+ request.basic_auth credentials.username, credentials.password
42
+ # body is cgi encoded parameter with json values.
43
+ request.body = "data=" + ({
44
+ "measurements" => ["adImps", "adCost"],
45
+ "dimensions" => ["Date", "AdSlot.name",
46
+ "Country.name"],
47
+ "start_date" => from.to_s,
48
+ "end_date" => to.to_s,
49
+ "mobile" => true
50
+ }.to_json)
51
+
52
+ http = Net::HTTP.new(uri.hostname, 443)
53
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
54
+ http.use_ssl = true
55
+
56
+ response = http.request(request)
57
+ JSON.parse(response.body)
58
+ end
59
+ end
@@ -0,0 +1,38 @@
1
+ class AdtekioAdnetworks::Revenue::Mdotm
2
+ include AdtekioAdnetworks::RevenueImport
3
+
4
+ define_required_credentials do
5
+ [:account_id, :secret_key]
6
+ end
7
+
8
+ def revenues(from, to)
9
+ report(from, to).map do |data|
10
+ {
11
+ :impressions => data["impressions"].to_i,
12
+ :requests => data["requests"].to_i,
13
+ :clicks => data["clicks"].to_i,
14
+ :amount => data["earnings"].to_f,
15
+ :date => Date.strptime(data["logDT"], "%Y-%m-%d"),
16
+ :appname => data["appname"]
17
+ }
18
+ end
19
+ end
20
+
21
+ def report(from,to)
22
+ url = "http://platform.mdotm.com/monetize/appstats/" +
23
+ credentials.account_id.to_s + "/" +
24
+ credentials.secret_key.to_s + "/" +
25
+ from.strftime("%Y-%m-%d") + "/" +
26
+ to.strftime("%Y-%m-%d")
27
+
28
+ JSON(do_request(url))
29
+ end
30
+
31
+ def do_request(url)
32
+ h = Net::HTTP::Persistent.new('whatever')
33
+ h.verify_mode = OpenSSL::SSL::VERIFY_NONE
34
+ uri = URI.parse(url)
35
+ req = Net::HTTP::Get.new uri.request_uri
36
+ h.request(uri,req).body
37
+ end
38
+ end