Skip to content

Commit 7e976d3

Browse files
committed
Added JSON Report(ThoughtfulDev#33), Fixed Age Detection
1 parent d816767 commit 7e976d3

File tree

5 files changed

+77
-16
lines changed

5 files changed

+77
-16
lines changed

Example_JSON.json

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"google_predictions": ["emeraude toubia instagram"],
3+
"instagram_names": ["emeraude"],
4+
"age": "27",
5+
"social_urls": [
6+
"https://twitter.com/emeraudetoubia/status/957383692833390593?lang=de",
7+
"https://twitter.com/gio53613",
8+
"https://twitter.com/onlyoulon",
9+
"https://www.instagram.com/emeraude/?hl=de",
10+
"https://www.instagram.com/p/BO3IpgFlVTF/?hl=de",
11+
"https://www.pinterest.com.mx/pin/344595808982228575/",
12+
"https://www.pinterest.com/gogreengo06/gorgeous-emeraude-toubia/",
13+
"https://www.pinterest.com/syc_mary/e-m-e-r-a-u-d-e-toubia/"],
14+
"name": "Unknown"
15+
}

eagle-eye.py

+27-8
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from grabber.instagram import InstagramGrabber
1616
from face_recog import FaceRecog
1717
import subprocess, json, shutil
18-
from report.report import makeReport
18+
from report.report import makeReport, makeJSONReport
1919

2020

2121
def presentResult(predictions):
@@ -43,14 +43,17 @@ def parseInstaUsername(links):
4343
a = l[8:]
4444
a = a.split('/')
4545
if len(a) >= 2:
46-
usernames.append(a[1])
46+
if len(a[1]) >= 4:
47+
usernames.append(a[1])
4748
else:
4849
console.subfailure('Error parsing {0}'.format(l))
4950
return usernames
5051

5152

5253
def validateInstaUser(username, num_jitters):
5354
images = getInstaLinks(username)
55+
if len(images) >= cfg.instaLimit():
56+
images = images[:cfg.instaLimit()]
5457
r = FaceRecog(username, images, num_jitters=num_jitters)
5558
r.loadKnown(username)
5659
profile_links, _ = r.getValidLinksAndImg(username)
@@ -60,7 +63,7 @@ def getInstaLinks(username):
6063
instagrabber = InstagramGrabber(username)
6164
return instagrabber.getLinks()
6265

63-
def main(skipFB=False, skipIR=False, skipY=False, FBUrls=[]):
66+
def main(skipFB=False, skipIR=False, skipY=False, FBUrls=[], jsonRep=None):
6467
if not skipFB:
6568
# collect user input
6669
console.prompt('Enter the persons name to find on FB: ')
@@ -147,6 +150,7 @@ def main(skipFB=False, skipIR=False, skipY=False, FBUrls=[]):
147150
raider_img_list = profile_imgs
148151
for v in validatedInstaNames:
149152
l = getInstaLinks(v)
153+
150154
for li in l:
151155
raider_img_list.append(li)
152156

@@ -185,16 +189,22 @@ def main(skipFB=False, skipIR=False, skipY=False, FBUrls=[]):
185189
if len(validatedInstaNames) > 0:
186190
for v in validatedInstaNames:
187191
l = getInstaLinks(v)
192+
if len(l) >= cfg.instaLimit():
193+
l = l[:cfg.instaLimit()]
188194
for li in l:
189195
ageEstimator.collectAges(li)
190196
age = ageEstimator.finish()
191197
else:
192198
console.failure('No Instagram Images to upload...')
193-
ageEstimator.finish()
199+
#ageEstimator.finish()
194200
age = "Unknown"
195201

196-
console.section("Creating PDF Report")
197-
makeReport(name, rev_links, predictions, validatedInstaNames, age)
202+
if jsonRep:
203+
console.section("Dumping JSON Report")
204+
makeJSONReport(name, rev_links, predictions, validatedInstaNames, age, jsonRep)
205+
else:
206+
console.section("Creating PDF Report")
207+
makeReport(name, rev_links, predictions, validatedInstaNames, age)
198208

199209

200210
p = os.path.join(tempfile.gettempdir(), 'imageraider')
@@ -212,24 +222,33 @@ def main(skipFB=False, skipIR=False, skipY=False, FBUrls=[]):
212222
parser.add_argument('-sFB', '--skipfb', action='store_true', help='Skips the Facebook Search')
213223
parser.add_argument('-sIR', '--skipir', action='store_true', help='Skips the ImageRaider Reverse Search')
214224
#parser.add_argument('-sY', '--skipyandex', action='store_true', help='Skips the Yandex Reverse Search')
225+
parser.add_argument('-json', '--json', nargs='?', help='Generates a json report. Specify a Filename')
215226
parser.add_argument('-fbList',
216227
'--facebookList',
217228
nargs='?',
218229
help="A file which contains Links to Facebook Profiles. '--skipfb' options must be enabled to use this" )
219230
args = parser.parse_args()
220231

232+
if args.json:
233+
jsonRepFile = args.json
234+
if os.path.isfile(jsonRepFile):
235+
console.failure("File '{}' already exists".format(jsonRepFile))
236+
sys.exit(-1)
237+
else:
238+
jsonRepFile = None
239+
221240
if args.facebookList and args.skipfb:
222241
if os.path.isfile(args.facebookList):
223242
with open(args.facebookList, 'r') as f:
224243
content = f.readlines()
225244
content = [x.strip() for x in content]
226245
#TODO: fix yandex
227246
#main(skipFB=args.skipfb, skipIR=args.skipir, skipY=args.skipyandex, FBUrls=content)
228-
main(skipFB=args.skipfb, skipIR=args.skipir, skipY=None, FBUrls=content)
247+
main(skipFB=args.skipfb, skipIR=args.skipir, skipY=None, FBUrls=content, jsonRep=jsonRepFile)
229248
else:
230249
console.failure("File '{}' does not exist".format(args.facebookList))
231250
sys.exit(-1)
232251
else:
233252
#TODO: fix yandex
234253
#main(skipFB=args.skipfb, skipIR=args.skipir, skipY=args.skipyandex, FBUrls=[])
235-
main(skipFB=args.skipfb, skipIR=args.skipir, skipY=None, FBUrls=[])
254+
main(skipFB=args.skipfb, skipIR=args.skipir, skipY=None, FBUrls=[], jsonRep=jsonRepFile)

face_recog.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ def getValidLinksAndImg(self, label):
8585
valid_img = []
8686
valid_indexes = self.constructIndexes(label)
8787
for index in valid_indexes:
88-
valid_url.append(self.profile_list[index])
89-
valid_img.append(self.profile_img[index])
88+
try:
89+
valid_url.append(self.profile_list[index])
90+
valid_img.append(self.profile_img[index])
91+
except:
92+
pass
9093
return valid_url, valid_img

grabber/pictriev.py

+12-6
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ def filterLink(link):
1919

2020
class PictrievGrabber:
2121
def __init__(self):
22-
console.section('Picture Age and Gender Detection')
22+
console.section('Age Detection')
2323
console.task('Opening Webdriver')
24-
self.driver = cfg.getWebDriver()
24+
self.driver = None
2525
self.ages = []
2626
self.males = []
2727
self.females = []
@@ -38,6 +38,8 @@ def mean(self, arr):
3838

3939

4040
def collectAges(self, img_url):
41+
if not self.driver:
42+
self.driver = cfg.getWebDriver()
4143
console.task('New Image: {0}'.format(img_url.strip()[:90]))
4244
driver = self.driver
4345
driver.get("http://www.pictriev.com/?lang=en")
@@ -50,11 +52,15 @@ def collectAges(self, img_url):
5052
console.subtask('Searching for Image...')
5153
time.sleep(cfg.timeout() * 3)
5254
try:
53-
age = driver.find_elements_by_css_selector('#age-gauge > svg:nth-child(1) > text:nth-child(6) > tspan:nth-child(1)')[0].text
54-
if int(age) > 0:
55-
self.ages.append(int(age))
55+
age = driver.find_elements_by_css_selector('#age-gauge > svg:nth-child(1) > text:nth-child(6) > tspan:nth-child(1)')
5656
except:
57-
pass
57+
age = driver.find_elements_by_css_selector('#age-gauge > svg:nth-child(1) > text:nth-child(6) > tspan:nth-child(1)')
58+
if len(age) == 1:
59+
age = age[0].text
60+
else:
61+
age = 0
62+
self.ages.append(int(age))
63+
5864

5965
def finish(self):
6066
self.driver.close()

report/report.py

+18
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from weasyprint import HTML
22
import os
3+
import json
34

45
def makeReport(name, links, preds, instnames, age):
56
#sort
@@ -37,3 +38,20 @@ def makeReport(name, links, preds, instnames, age):
3738
doc.write_pdf('{0}_Report.pdf'.format(name))
3839
os.remove('tmp.html')
3940

41+
def makeJSONReport(name, links, preds, instnames, age, fn):
42+
data = {}
43+
links = sorted(links)
44+
preds = sorted(preds)
45+
instnames = sorted(instnames)
46+
47+
name = name.strip()
48+
name = name.replace('%20', '-')
49+
50+
data['name'] = name
51+
data['age'] = str(age)
52+
data['social_urls'] = links
53+
data['google_predictions'] = preds
54+
data['instagram_names'] = instnames
55+
with open(fn, 'w') as o:
56+
json.dump(data, o)
57+

0 commit comments

Comments
 (0)