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

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

Added option of force reload the cache

File size: 8.8 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"
12from threading import Thread
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        _local = True
29
30
31def postpone(function):
32  def decorator(*args, **kwargs):
33    t = Thread(target = function, args=args, kwargs=kwargs)
34    t.daemon = True
35    t.start()
36  return decorator
37
38
39def local_url(parent_dir, image_path):
40        try:
41                image_path = image_path['path']
42        except:
43                pass
44        path = image_path.split("/")[-1:][0]
45        final_path = "/"+parent_dir+"/"+path[0]+"/"+path[1]+"/"+path[2]+"/"+path
46        return final_path
47
48# Function that analyses the information of an app and returns if it is explicit or not
49@postpone
50def get_data_async(page, url_async, cache_reload):
51        illust2vec = Model._model
52        exp = False
53
54        p = os.path.abspath(os.path.join("../", os.pardir))
55
56        with open(p+"/config.json") as json_data:
57                config = json.load(json_data)
58
59        if config['directories']['local_or_web_images']=='web':
60                        Model._local = False
61
62
63        print "Fetching data..."
64        title = page['meta']['title']
65
66        description = page['meta']['description']
67
68        categories = []
69
70        for cat in page['meta']['categories']['standard']:
71                categories.append(cat['name'])
72
73        for cat in page['meta']['categories']['custom']:
74                categories.append(cat['name'])
75
76        scr = []
77        scr_hd = []
78        # Relative path to our images. To use on outer machine, uncomment the following code and comment the next line after that code.
79        if 'sshots' in page['media']:
80                for s in page['media']['sshots']:
81                        if Model._local:
82                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
83                        else:
84                                try:
85                                        scr.append(s['path'])
86                                except:
87                                        scr.append(s)
88
89        if 'sshots_hd' in page['media']:
90                for s in page['media']['sshots_hd']:
91                        if Model._local:
92                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
93                        else:
94                                try:                           
95                                        scr_hd.append(s['path'])
96                                except:
97                                        scr_hd.append(s)
98
99        min_age = page['meta']['min_age']
100
101        icon = page['apk']['icon']
102
103        if Model._local:
104                icon = local_url(config['directories']['local_image_path_prefix'], icon)
105
106        icon_hd = []
107        if 'icon_hd' in page['apk']:
108                icon_hd = page['apk']['icon_hd']
109                if Model._local:
110                        icon_hd = local_url(config['directories']['local_image_path_prefix'],icon_hd)
111
112        icons = []
113        icons.append(icon)
114        if icon_hd:
115                icons.append(icon_hd)
116
117        screenshots = scr+scr_hd
118        size = len(description)
119        print "Analysing app..."
120        # Gets the percentage for safe and explicit content
121        dist = analyse_app.analyse_app(page['apk']['id'], page['apk']['md5sum'], illust2vec, icons, screenshots, description,''.join(categories), min_age, size, title, cache_reload)
122        try:
123                if dist.prob('exp')>0.5:
124                        exp = True
125        except:
126                if dist>0.5:
127                        exp = True
128        try:
129                print "Opening "+str(url_async)+str(exp)
130                return urllib2.urlopen(str(url_async)+str(exp))
131        except:
132                print "Could not open the webpage"
133
134# Function that analyses the information of an app and returns if it is explicit or not
135def get_data_sync(page, cache_reload):
136        illust2vec = Model._model
137        exp = False
138
139        p = os.path.abspath(os.path.join("../", os.pardir))
140
141        with open(p+"/config.json") as json_data:
142                config = json.load(json_data)
143
144        if config['directories']['local_or_web_images']=='web':
145                        Model._local = False
146
147
148        print "Fetching data..."
149        title = page['meta']['title']
150
151        description = page['meta']['description']
152
153        categories = []
154
155        for cat in page['meta']['categories']['standard']:
156                categories.append(cat['name'])
157
158        for cat in page['meta']['categories']['custom']:
159                categories.append(cat['name'])
160
161        scr = []
162        scr_hd = []
163        # Relative path to our images. To use on outer machine, uncomment the following code and comment the next line after that code.
164        if 'sshots' in page['media']:
165                for s in page['media']['sshots']:
166                        if Model._local:
167                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
168                        else:
169                                try:
170                                        scr.append(s['path'])
171                                except:
172                                        scr.append(s)
173
174        if 'sshots_hd' in page['media']:
175                for s in page['media']['sshots_hd']:
176                        if Model._local:
177                                scr.append(local_url(config['directories']['local_image_path_prefix'],s))
178                        else:
179                                try:                           
180                                        scr_hd.append(s['path'])
181                                except:
182                                        scr_hd.append(s)
183
184        min_age = page['meta']['min_age']
185
186        icon = page['apk']['icon']
187
188        if Model._local:
189                icon = local_url(config['directories']['local_image_path_prefix'], icon)
190
191        icon_hd = []
192        if 'icon_hd' in page['apk']:
193                icon_hd = page['apk']['icon_hd']
194                if Model._local:
195                        icon_hd = local_url(config['directories']['local_image_path_prefix'],icon_hd)
196
197        icons = []
198        icons.append(icon)
199        if icon_hd:
200                icons.append(icon_hd)
201
202        screenshots = scr+scr_hd
203        size = len(description)
204        print "Analysing app..."
205        # Gets the percentage for safe and explicit content
206        dist = analyse_app.analyse_app(page['apk']['id'], page['apk']['md5sum'], illust2vec, icons, screenshots, description,''.join(categories), min_age, size, title, cache_reload)
207        try:
208                if dist.prob('exp')>0.5:
209                        exp = True
210        except:
211                if dist>0.5:
212                        exp = True
213        print "Done"
214        return exp
215
216
217
218# View for get by id
219# For more detailed error logs comment the try... except and indentate correctly its content
220
221def getbyId(request, app_id, cache_reload=0):
222        if not cache_reload:
223                cache_reload=0
224        now = datetime.now()
225        url = "http://webservices.aptoide.com/webservices/3/getApkInfo/id:"
226        p = os.path.abspath(os.path.join("../", os.pardir))
227        with open(p+"/config.json") as json_data:
228                config = json.load(json_data)
229        exp = False
230        #try:
231                # Fetching the JSON content
232        webpage = urllib2.urlopen(url+str(app_id)+"/json")
233        soup = BeautifulSoup(webpage, "lxml")
234                                               
235        text = soup.get_text()
236        page = json.loads(text)
237        if page['status']!='FAIL':
238                if config["synchronous_or_asynchronous"]=="asynchronous":
239                        get_data_async(page, config["directories"]["asynchronous_dir"], cache_reload)
240                        return HttpResponse("Waiting")
241                exp = get_data_sync(page, int(cache_reload))
242
243        else:
244                status = 'Failed'
245                print "App does not exist"
246                return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
247        #except:
248        #       status = 'Failed'
249        #       print "Error during parsing"
250        #       return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
251
252        # If it's explicit content, redirects to true page. Otherwise, redirects to false page.
253        if exp:
254                return HttpResponse(json.dumps({'app_id': int(app_id), 'status': 'OK','mature_content': 'yes', 'time':str(datetime.now()-now)}, sort_keys=True))
255        return HttpResponse(json.dumps({'app_id': int(app_id), 'status': 'OK','mature_content': 'no', 'time':str(datetime.now()-now)}, sort_keys=True))
256
257
258
259# View for get by md5
260# For more detailed error logs comment the try... except and indentate correctly its content
261def getbyMD5(request, app_md5, cache_reload=0):
262        if not cache_reload:
263                cache_reload=0
264        now = datetime.now()
265        url = "http://webservices.aptoide.com/webservices/3/getApkInfo/md5sum:"
266        p = os.path.abspath(os.path.join("../", os.pardir))
267        with open(p+"/config.json") as json_data:
268                config = json.load(json_data)
269
270        app_id = 0
271        exp = False
272        try:
273                # Fetching the JSON content
274                webpage = urllib2.urlopen(url+str(app_md5)+"/json")
275                soup = BeautifulSoup(webpage, "lxml")
276                               
277                text = soup.get_text()
278                page = json.loads(text)
279                if page['status']!='FAIL':
280                        app_id = page['apk']['id']
281                        if config["synchronous_or_asynchronous"]=="asynchronous":
282                                get_data_async(page, config["directories"]["asynchronous_dir"], cache_reload)
283                                return HttpResponse("Waiting")
284                        exp = get_data_sync(page, int(cache_reload))
285
286                else:
287                        status = 'Failed'
288                        print "App does not exist"
289                        return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
290        except:
291                status = 'Failed'
292                print "Error during parsing"
293                return HttpResponse(json.dumps({'status': 'Failed', 'time':str(datetime.now()-now)}, sort_keys=True))
294
295        # If it's explicit content, redirects to true page. Otherwise, redirects to false page.
296        if exp:
297                return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'yes', 'time':str(datetime.now()-now)}, sort_keys=True))
298        return HttpResponse(json.dumps({'app_id': app_id, 'status': 'OK','mature_content': 'no', 'time':str(datetime.now()-now)}, sort_keys=True))
Note: See TracBrowser for help on using the repository browser.