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,59 @@
|
|
1
|
+
require 'mechanize'
|
2
|
+
|
3
|
+
module AdtekioAdnetworks
|
4
|
+
class ApiKeyScrapers
|
5
|
+
attr_reader :agent, :params
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@agent = Mechanize.new
|
9
|
+
@agent.user_agent_alias = 'Mac Mozilla'
|
10
|
+
end
|
11
|
+
|
12
|
+
def obtain_key_for(network, params)
|
13
|
+
@params = params
|
14
|
+
send("key_for_#{network}")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.supporter_adnetworks
|
18
|
+
public_instance_methods.
|
19
|
+
select { |a| a =~ /key_for_/ }.map { |a| a.to_s.sub(/key_for_/,'') }
|
20
|
+
end
|
21
|
+
|
22
|
+
protected
|
23
|
+
|
24
|
+
def _g(url)
|
25
|
+
agent.get(url)
|
26
|
+
end
|
27
|
+
|
28
|
+
def _p(url, data)
|
29
|
+
agent.post(url, data)
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_and_match(url, regexp)
|
33
|
+
_g(url).content =~ regexp && $1
|
34
|
+
end
|
35
|
+
|
36
|
+
def post_and_match(url, data, regexp)
|
37
|
+
_p(url, data).content =~ regexp && $1
|
38
|
+
end
|
39
|
+
|
40
|
+
def return_result_hash(&block)
|
41
|
+
{}.tap { |result| yield(result) }
|
42
|
+
end
|
43
|
+
|
44
|
+
def return_token_hash(&block)
|
45
|
+
return_result_hash { |r| r[:token] = yield }
|
46
|
+
end
|
47
|
+
|
48
|
+
def enter_login_details(form)
|
49
|
+
form.fields.
|
50
|
+
select { |a| a.name =~ /email/i }.first.value = params["username"]
|
51
|
+
form.fields.
|
52
|
+
select {|a| a.name =~ /passw(or)?d/i}.first.value = params["password"]
|
53
|
+
form
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
Dir[File.join(File.dirname(__FILE__), "api_key_scrapers", '*.rb')].
|
59
|
+
each { |f| require f }
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_adcolony
|
4
|
+
return_token_hash do
|
5
|
+
csrf_token =
|
6
|
+
get_and_match("https://clients.adcolony.com/login",
|
7
|
+
/_csrf.:.([^"]+)"/)
|
8
|
+
|
9
|
+
data = {
|
10
|
+
"_csrf" => csrf_token,
|
11
|
+
"email" => params["username"],
|
12
|
+
"password" => params["password"]
|
13
|
+
}
|
14
|
+
|
15
|
+
post_and_match("https://clients.adcolony.com/login", data,
|
16
|
+
/single_access_token.:.([^"]+)"/)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_applift
|
4
|
+
return_token_hash do
|
5
|
+
enter_login_details(_g("https://partner.applift.com").forms.first).
|
6
|
+
submit
|
7
|
+
|
8
|
+
get_and_match("https://partner.applift.com/stats/stats_api",
|
9
|
+
/Your API Key .+ <i>([^ ]+)[<]/)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_applovin
|
4
|
+
return_token_hash do
|
5
|
+
enter_login_details(_g("https://www.applovin.com/login").forms.first).
|
6
|
+
submit
|
7
|
+
|
8
|
+
page = _g("https://www.applovin.com/account")
|
9
|
+
page.search("input[id=report_key]").first.attributes["value"].value
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_chartboost
|
4
|
+
return_result_hash do |result|
|
5
|
+
_p("https://dashapi.chartboost.com/v3/login", {
|
6
|
+
"email" => params["username"],
|
7
|
+
"password" => params["password"]
|
8
|
+
})
|
9
|
+
|
10
|
+
chsh = JSON.parse(_g("https://dashapi.chartboost.com/v3/"+
|
11
|
+
"companies?with=money%2users,ounts").content)
|
12
|
+
|
13
|
+
result["user_id"] = chsh["response"]["user_id"]
|
14
|
+
result["signature"] = chsh["response"]["user_signature"]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_crossinstall
|
4
|
+
return_token_hash do
|
5
|
+
agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
6
|
+
form = _g("https://secure.crossinstall.com/login").forms.first
|
7
|
+
|
8
|
+
enter_login_details(form).submit.link_with(:text => " API Key").
|
9
|
+
click.search("input[name=api_key]").first.attributes["value"].value
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_leadbolt
|
4
|
+
return_result_hash do |r|
|
5
|
+
form =
|
6
|
+
_g("https://www.leadboltnetwork.net/advertiser/login").forms.first
|
7
|
+
enter_login_details(form).submit
|
8
|
+
|
9
|
+
page = _g("https://www.leadboltnetwork.net/a/account/accountsettings")
|
10
|
+
|
11
|
+
r["secret_key"] =
|
12
|
+
page.search("div p[class=form-control-static]").last.text
|
13
|
+
r["advertiser_id"] =
|
14
|
+
page.search("div p[class=form-control-static]")[-2].text
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_loopme
|
4
|
+
return_token_hash do
|
5
|
+
form = _g("https://loopme.me/login").forms.first
|
6
|
+
enter_login_details(form).submit
|
7
|
+
page = _g("https://loopme.me/account/settings")
|
8
|
+
page.search("span[id=api_auth_token]").first.children.first.text
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_mdotm
|
4
|
+
return_result_hash do |result|
|
5
|
+
agent.agent.http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
6
|
+
|
7
|
+
form = _g("https://platform.mdotm.com/app/login").forms.first
|
8
|
+
page = enter_login_details(form).submit
|
9
|
+
page = page.link_with(:text => "Your Profile").click
|
10
|
+
|
11
|
+
{
|
12
|
+
"account_id" => /AccountID.*<code>(.+)<\/code>/,
|
13
|
+
"token" => /Your API Key.*<code>(.+)<\/code>/,
|
14
|
+
"secret_key" => /Your Secret Key.*<code>(.+)<\/code>/
|
15
|
+
}.each do |key, regexp|
|
16
|
+
page.content =~ regexp
|
17
|
+
result[key] = $1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_revmob
|
4
|
+
return_result_hash do |result|
|
5
|
+
_p("https://www.revmobmobileadnetwork.com/home/signIn",{
|
6
|
+
"emailSignIn" => params["username"],
|
7
|
+
"pass" => params["password"],
|
8
|
+
"originalUrl" => "/users/session/new"})
|
9
|
+
|
10
|
+
page = _p("https://www.revmobmobileadnetwork.com/myMedias",{
|
11
|
+
"countEnable" => "false",
|
12
|
+
"filterText" => "",
|
13
|
+
"limitEnd" => 15,
|
14
|
+
"limitStart" => 15})
|
15
|
+
|
16
|
+
hsh = JSON.parse(page.content)
|
17
|
+
result["user_id"] = hsh["user_id"]
|
18
|
+
result["auth_token"] = hsh["auth_token"]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_tapjoy
|
4
|
+
return_token_hash do
|
5
|
+
page = _p("https://dashboard.tapjoy.com/api/client/v1/session", {
|
6
|
+
'username' => params["username"],
|
7
|
+
'password' => params["password"],
|
8
|
+
"_method" => "put"})
|
9
|
+
|
10
|
+
user_id = get_and_match(JSON.parse(page.content)["link"] + "/d",
|
11
|
+
/User Id., "([^"]+)"/)
|
12
|
+
|
13
|
+
page = _g("https://dashboard.tapjoy.com/api/client/users/#{user_id}")
|
14
|
+
|
15
|
+
JSON.parse(page.content)["result"]["user"]["api_key"]
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_unilead
|
4
|
+
return_token_hash do
|
5
|
+
enter_login_details(_g("http://my.unileadnetwork.com/").forms.first).
|
6
|
+
submit
|
7
|
+
|
8
|
+
get_and_match("http://my.unileadnetwork.com/stats/stats_api",
|
9
|
+
/Your API Key .+ <i>([^ ]+)[<]/)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module AdtekioAdnetworks
|
2
|
+
class ApiKeyScrapers
|
3
|
+
def key_for_vungle
|
4
|
+
return_token_hash do
|
5
|
+
csrf_token = get_and_match("https://v.vungle.com/dashboard/login",
|
6
|
+
/id="csrf" value="([^"]+)"/)
|
7
|
+
|
8
|
+
_p("https://v.vungle.com/dashboard/login", {
|
9
|
+
"_csrf" => csrf_token,
|
10
|
+
"email" => params["username"],
|
11
|
+
"password" => params["password"]})
|
12
|
+
|
13
|
+
account_id = get_and_match("https://v.vungle.com/dashboard/reports",
|
14
|
+
/"account":."_id":"([^"]+)"/)
|
15
|
+
|
16
|
+
page = _g("https://v.vungle.com/dashboard/api/1/"+
|
17
|
+
"accounts/#{account_id}/users")
|
18
|
+
|
19
|
+
JSON.parse(page.content).map {|a|a["secretKey"]}.compact.first
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'adwords_api'
|
2
|
+
require 'addressable'
|
3
|
+
require 'addressable/uri'
|
4
|
+
require 'csv'
|
5
|
+
require 'curb'
|
6
|
+
require 'mechanize'
|
7
|
+
require 'uri'
|
8
|
+
require 'net/http'
|
9
|
+
require 'net/http/persistent'
|
10
|
+
require 'net/http/digest_auth'
|
11
|
+
require 'rest-client'
|
12
|
+
require 'digest/sha1'
|
13
|
+
|
14
|
+
module AdtekioAdnetworks
|
15
|
+
module BaseImporter
|
16
|
+
def self.included(klz)
|
17
|
+
klz.class_eval do
|
18
|
+
def self.networks
|
19
|
+
@networks
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.register(importer_klz)
|
23
|
+
(@networks ||= {})[importer_klz.new.network] = importer_klz
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.included(importer_klz)
|
27
|
+
register(importer_klz)
|
28
|
+
importer_klz.class_eval do
|
29
|
+
def self.define_required_credentials(&block)
|
30
|
+
@reqcreds = yield
|
31
|
+
self.class_eval do
|
32
|
+
def self.required_credentials
|
33
|
+
@reqcreds
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def network
|
43
|
+
@network ||=
|
44
|
+
self.class.name.to_s.sub(/^.+::([^:]+)$/,'\1').snakecase.to_sym
|
45
|
+
end
|
46
|
+
|
47
|
+
def credentials
|
48
|
+
@credentials ||= OpenStruct.new
|
49
|
+
end
|
50
|
+
|
51
|
+
def credentials=(val)
|
52
|
+
@credentials = val.is_a?(Hash) ? OpenStruct.new(val) : val
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
require_relative 'importers/cost_import'
|
58
|
+
require_relative 'importers/revenue_import'
|
@@ -0,0 +1,43 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Adcolony
|
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://clients.adcolony.com/api/v2/advertiser_summary")
|
11
|
+
|
12
|
+
uri.query_values = {
|
13
|
+
:user_credentials => credentials.api_key,
|
14
|
+
:date => from.strftime("%m%d%Y"),
|
15
|
+
:end_date => till.strftime("%m%d%Y"),
|
16
|
+
:group_by => [:campaign, :ad_group, :country],
|
17
|
+
:date_group => :day
|
18
|
+
}
|
19
|
+
req = Net::HTTP::Get.new(uri.request_uri)
|
20
|
+
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
21
|
+
http.request(req)
|
22
|
+
end
|
23
|
+
|
24
|
+
(JSON.parse(res.body, :symbolize_names => true)[:results] || []).
|
25
|
+
map do |campaign|
|
26
|
+
next if campaign[:spend].to_f == 0.0
|
27
|
+
campaign_name = campaign[:group_name].
|
28
|
+
encode(Encoding.find('ASCII'),
|
29
|
+
:invalid => :replace, :replace => '', :undef => :replace)
|
30
|
+
|
31
|
+
{
|
32
|
+
:date => Date.strptime(campaign[:date], "%Y-%m-%d"),
|
33
|
+
:campaign => campaign_name,
|
34
|
+
:adgroup => campaign[:country],
|
35
|
+
:impressions => campaign[:impressions].to_i,
|
36
|
+
:clicks => campaign[:total_clicks].to_i,
|
37
|
+
:conversions => campaign[:installs].to_i,
|
38
|
+
:amount => campaign[:spend].to_f,
|
39
|
+
:target_country => campaign[:country].try(:downcase),
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
class AdtekioAdnetworks::Cost::Adquant
|
2
|
+
include AdtekioAdnetworks::CostImport
|
3
|
+
|
4
|
+
API_ENDPOINT = "https://rpc.mb4w.com/"
|
5
|
+
AUTH_ROUTE = "auth"
|
6
|
+
DATA_ROUTE = "report/grid"
|
7
|
+
|
8
|
+
define_required_credentials do
|
9
|
+
[:username, :password]
|
10
|
+
end
|
11
|
+
|
12
|
+
def campaign_costs(from, till)
|
13
|
+
load_data.map do |campaign_data|
|
14
|
+
campaign_name = campaign_data[:fcg_name]
|
15
|
+
adgroup_name = campaign_data[:fbc_name].
|
16
|
+
sub(/(#{Regexp.escape(campaign_name)}_)/i, "").sub('%) ', '_')
|
17
|
+
ad_name = campaign_data[:fba_name].
|
18
|
+
sub(/(#{Regexp.escape(campaign_name)}_#{Regexp.escape(adgroup_name)}_)/i, "")
|
19
|
+
|
20
|
+
{
|
21
|
+
:date => Date.parse(campaign_data[:date]).to_s,
|
22
|
+
:campaign => campaign_name,
|
23
|
+
:adgroup => adgroup_name,
|
24
|
+
:ad => ad_name,
|
25
|
+
:impressions => campaign_data[:fb_unique_imps],
|
26
|
+
:clicks => campaign_data[:fb_unique_clicks],
|
27
|
+
:conversions => campaign_data[:conversion],
|
28
|
+
:amount => campaign_data[:dst_amount][:USD]
|
29
|
+
}
|
30
|
+
end.select { |d| (from..till).include?(Date.parse(d[:date])) }
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def load_data
|
36
|
+
params = {
|
37
|
+
:token => api_token,
|
38
|
+
:groups => ["cpn_id", "fcg_id", "fbc_id", "fba_id", "date"].to_json,
|
39
|
+
:values => ["cpn_id", "fcg_id", "fbc_id", "fba_id", "date", "dst_amount",
|
40
|
+
"act_action_date", "conversions", "fb_unique_imps",
|
41
|
+
"fb_unique_clicks", "cpn_title"].to_json,
|
42
|
+
}
|
43
|
+
make_request(params, DATA_ROUTE)[:rowset]
|
44
|
+
end
|
45
|
+
|
46
|
+
def api_token
|
47
|
+
@api_token ||= begin
|
48
|
+
params = {
|
49
|
+
:usr_email => credentials.username,
|
50
|
+
:usr_pwd => credentials.password
|
51
|
+
}
|
52
|
+
response_json = make_request(params, AUTH_ROUTE)
|
53
|
+
response_json[:token]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def make_request(params, route)
|
58
|
+
response = ::RestClient::Request.
|
59
|
+
execute(method: :post,
|
60
|
+
content_type: 'application/json',
|
61
|
+
url: "#{API_ENDPOINT}#{route}",
|
62
|
+
payload: params,
|
63
|
+
headers: {"Accept-Encoding" => "deflate"},
|
64
|
+
ssl_version: :SSLv23)
|
65
|
+
|
66
|
+
JSON.parse(response.to_str, :symbolize_names => true)[:data]
|
67
|
+
end
|
68
|
+
end
|