source: internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/aptoide_mature_app_detector/explicit_content_detector/API/views.py @ 16516

Last change on this file since 16516 was 16516, checked in by dferreira, 4 years ago

Changes made to icon analysing and local or web images

File size: 5.2 KB
Line 
1# Diogo Daniel Soares Ferreira
2# diogodanielsoaresferreira@ua.pt
3# Aptoide, 2016
4
5# API in Django to deploy the analysis of an app, given its MD5 or ID.
6# Just start the server and write the following url:
7# http://127.0.0.1:8000/detect_mature/md5sum=md5_of_app
8# or
9# http://127.0.0.1:8000/detect_mature/id=md5_of_app
10
11# If you don't have acess to local images, change the config.json "local_or_web_images" to "web" instead of "local"
12
13import os
14from django.http import HttpResponse
15from django.shortcuts import redirect
16from django.db.models.base import ModelBase
17from bs4 import BeautifulSoup
18from datetime import datetime, time
19from Explicit_detector import analyse_app
20import threading
21import urllib2
22import json
23
24# Save the Illustration2Vec model on memory
25# Not needed to load everytime that exists a request
26class Model(ModelBase):
27        _model = analyse_app.get_model()
28        _time = datetime.now()
29        _local = True
30
31
32
33def local_url(parent_dir, image_path):
34        try:
35                image_path = image_path['path']
36        except:
37                pass
38        path = image_path.split("/")[-1:][0]
39        final_path = "/"+parent_dir+"/"+path[0]+"/"+path[1]+"/"+path[2]+"/"+path
40        return final_path
41
42
43# Function that analyses the information of an app and returns if it is explicit or not
44def get_data(page):
45        illust2vec = Model._model
46        exp = False
47
48        p = os.path.abspath(os.path.join("../", os.pardir))
49
50        with open(p+"/config.json") as json_data:
51                config = json.load(json_data)
52
53        if config['directories']['local_or_web_images']=='web':
54                        Model._local = False
55
56
57        print "Fetching data..."
58        title = page['meta']['title']
59
60        description = page['meta']['description']
61
62        categories = []
63
64        for cat in page['meta']['categories']['standard']:
65                categories.append(cat['name'])
66
67        for cat in page['meta']['categories']['custom']:
68                categories.append(cat['name'])
69
70        scr = []
71        scr_hd = []
72        # Relative path to our images. To use on outer machine, uncomment the following code and comment the next line after that code.
73        if 'sshots' in page['media']:
74                for s in page['media']['sshots']:
75                        if Model._local:
76                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
77                        else:
78                                try:
79                                        scr.append(s['path'])
80                                except:
81                                        scr.append(s)
82
83        if 'sshots_hd' in page['media']:
84                for s in page['media']['sshots_hd']:
85                        if Model._local:
86                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
87                        else:
88                                try:                           
89                                        scr_hd.append(s['path'])
90                                except:
91                                        scr_hd.append(s)
92
93        min_age = page['meta']['min_age']
94
95        icon = page['apk']['icon']
96
97        if Model._local:
98                icon = local_url(config['directories']['local_image_path_prefix'], icon)
99
100        icon_hd = []
101        if 'icon_hd' in page['apk']:
102                icon_hd = page['apk']['icon_hd']
103                if Model._local:
104                        icon_hd = local_url(config['directories']['local_image_path_prefix'],icon_hd)
105
106        icons = []
107        icons.append(icon)
108        if icon_hd:
109                icons.append(icon_hd)
110
111        screenshots = scr+scr_hd
112        size = len(description)
113        print "Analysing app..."
114        # Gets the percentage for safe and explicit content
115        dist = analyse_app.analyse_app(page['apk']['id'], page['apk']['md5sum'], illust2vec, icons, screenshots, description,''.join(categories), min_age, size, title)
116        try:
117                if dist.prob('exp')>0.5:
118                        exp = True
119        except:
120                if dist>0.5:
121                        exp = True
122        print "Done"
123        return exp
124
125# View for get by id
126def getbyId(request, app_id):
127        now = datetime.now()
128        url = "http://webservices.aptoide.com/webservices/3/getApkInfo/id:"
129
130        Model._time = now
131        exp = False
132        try:
133                # Fetching the JSON content
134                webpage = urllib2.urlopen(url+str(app_id)+"/json")
135                soup = BeautifulSoup(webpage, "lxml")
136                                       
137                text = soup.get_text()
138                page = json.loads(text)
139                if page['status']!='FAIL':
140
141                        exp = get_data(page)
142
143                else:
144                        status = 'Failed'
145                        print "App does not exist"
146                        return redirect('error')
147        except:
148                status = 'Failed'
149                print "Error during parsing"
150                return redirect('error')
151
152        # If it's explicit content, redirects to true page. Otherwise, redirects to false page.
153        if exp:
154                return redirect('true', app_id=app_id)
155        return redirect('false', app_id=app_id)
156
157# View for get by md5
158def getbyMD5(request, app_md5):
159        now = datetime.now()
160        url = "http://webservices.aptoide.com/webservices/3/getApkInfo/md5sum:"
161        app_id = 0
162        Model._time = now
163        exp = False
164        try:
165                # Fetching the JSON content
166                webpage = urllib2.urlopen(url+str(app_md5)+"/json")
167                soup = BeautifulSoup(webpage, "lxml")
168                               
169                text = soup.get_text()
170                page = json.loads(text)
171                if page['status']!='FAIL':
172
173                        app_id = page['apk']['id']
174                        exp = get_data(page)
175
176                else:
177                        status = 'Failed'
178                        print "App does not exist"
179                        return redirect('error')
180        except:
181                status = 'Failed'
182                print "Error during parsing"
183                return redirect('error')
184
185        # If it's explicit content, redirects to true page. Otherwise, redirects to false page.
186        if exp:
187                return redirect('true', app_id=app_id)
188        return redirect('false', app_id=app_id)
189
190def true(request, app_id):
191        return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'yes', 'time':str(datetime.now()-Model._time)}, sort_keys=True))
192
193def false(request, app_id):
194        return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'no', 'time':str(datetime.now()-Model._time)}, sort_keys=True))
195
196def error(request):
197        return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-Model._time)}, sort_keys=True))
Note: See TracBrowser for help on using the repository browser.