Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Lucksi
GitHub Repository: Lucksi/Mr.Holmes
Path: blob/master/Core/Support/Person/Scraper.py
1071 views
1
# ORIGINAL CREATOR: Luca Garofalo (Lucksi)
2
# AUTHOR: Luca Garofalo (Lucksi)
3
# Copyright (C) 2022-2024 Lucksi <[email protected]>
4
# License: GNU General Public License v3.0
5
6
import os
7
import requests
8
import json
9
from bs4 import BeautifulSoup as soup
10
from Core.Support import Font
11
from Core.Support.Username import Scraper
12
from Core.Support import Headers
13
from Core.Support import Language
14
from time import sleep
15
16
filename = Language.Translation.Get_Language()
17
filename
18
19
headers = Headers.Get.classic()
20
21
22
class Search:
23
@staticmethod
24
def Instagram(report, username, http_proxy, InstagramParams, PostLocations, PostGpsCoordinates, imagefold, username2,fold):
25
List = []
26
Links = []
27
Pics = []
28
print(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE +
29
"SCANNING FOR {} INSTAGRAM RESULTS...".format(username))
30
url = "https://www.picuki.com/search/{}".format(username)
31
req = requests.get(url, timeout=None, proxies=http_proxy, headers=headers)
32
sleep(4)
33
try:
34
req = requests.get(url, timeout=None, proxies=None, headers=headers)
35
sleep(4)
36
if req.status_code == 200:
37
reader = soup(req.content, "html.parser")
38
users = reader.find_all("div", class_="profile-result")
39
i = 1
40
f = open(report, "a",encoding="utf-8")
41
f.write(
42
"\n\n--------------------------------\nSHOWING INSTAGRAM RESULTS FOR: {}\n".format(username))
43
for user in users:
44
if i <= 20:
45
usern = user.find("div",class_="result-username").text.replace("@","")
46
pic = user.find_all("div",class_="result-ava")
47
for image in pic:
48
profilepic = image.find("img")["src"]
49
Pics.append(profilepic)
50
link = "https://instagram.com/{}".format(usern)
51
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "USER FOUND: {}".format(
52
Font.Color.GREEN + usern + Font.Color.WHITE))
53
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "PROFILE-PIC: {}".format(
54
Font.Color.GREEN + profilepic + Font.Color.WHITE))
55
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "LINK: {}\n".format(
56
Font.Color.GREEN + link + Font.Color.WHITE))
57
List.append(usern)
58
Links.append(link)
59
f.write("\nUSER FOUND: {}".format(usern))
60
f.write("\nPROFILE-PIC FOUND: {}".format(profilepic))
61
f.write("\nLINK: {}\n".format(link))
62
i = i+1
63
else:
64
break
65
f.close()
66
except ConnectionError:
67
print(Font.Color.RED + "[!]" +
68
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Connection_Error2", "None"))
69
pass
70
except Exception as e:
71
print(Font.Color.RED + "[!]" +
72
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Error", "None") + str(e))
73
pass
74
j = 1
75
print(Font.Color.GREEN + "[+]" +
76
Font.Color.WHITE + "TOTAL USERNAMES FOUND")
77
if len(List):
78
for Names in List:
79
print(Font.Color.YELLOW +
80
"[v]" + Font.Color.WHITE + "USERNAME N°{}: {}".format(j, Names))
81
j = j+1
82
if fold == "People":
83
json_file = "GUI/Reports/People/{}/Insta_Link.json".format(username2)
84
else:
85
if username2 != "None":
86
json_file = "GUI/Reports/{}/{}/InstaName_Link.json".format(fold,username2)
87
else:
88
json_file = "GUI/Reports/{}/{}/Insta_Link.json".format(fold,username)
89
f = open(json_file, "w")
90
f.write('''{
91
"List":[
92
]
93
}''')
94
f.close()
95
96
i = 0
97
for image in Pics:
98
data2 = {
99
"username": "{}".format(List[i]),
100
"site": "{}".format(Links[i]),
101
"image": "{}".format(image)
102
}
103
with open(json_file, 'r+') as file:
104
file_data = json.load(file)
105
file_data["List"].append(data2)
106
file.seek(0)
107
json.dump(file_data, file, indent=4)
108
i = i +1
109
110
if fold == "People":
111
opt = int(input(Font.Color.BLUE + "\n[?]" + Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Username", "Default", "Scraper") +
112
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
113
if opt == 1:
114
check = str(input(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE + "INSERT THE USERNANE TO CHECK\n\n" +
115
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
116
if check not in List:
117
pass
118
else:
119
if os.path.isdir(imagefold):
120
pass
121
else:
122
os.mkdir(imagefold)
123
Scraper.info.Instagram(report, check, http_proxy, InstagramParams,
124
PostLocations, PostGpsCoordinates, "People", username2)
125
else:
126
print(Font.Color.RED + "\n[!]" +
127
Font.Color.WHITE + "NO USER HAS BEEN FOUND")
128
129
@staticmethod
130
def Twitter(report, username, http_proxy, TwitterParams, imagefold,username2,fold):
131
headers = Headers.Get.Twitter()
132
List = []
133
Links = []
134
Pics = []
135
Names2 = []
136
print(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE +
137
"SCANNING FOR {} TWITTER RESULTS...".format(username))
138
url = "https://nitter.net/search?f=users&q={}".format(username)
139
sleep(4)
140
try:
141
req = requests.get(url, timeout=None, proxies=http_proxy, headers=headers, allow_redirects=True)
142
if req.status_code == 200:
143
reader = soup(req.content, "html.parser")
144
users = reader.find_all("div", class_="timeline-item")
145
i = 1
146
f = open(report, "a",encoding="utf-8")
147
f.write(
148
"--------------------------------\nSHOWING TWITTER RESULTS FOR: {}\n".format(username))
149
for user in users:
150
if i <= 20:
151
usern = user.find(
152
"a", class_="username").text.replace("@", "")
153
pic = user.find("img",class_="avatar round")["src"]
154
profilepic = "https://nitter.net" + pic
155
Pics.append(profilepic)
156
link = "https://twitter.com/{}".format(usern)
157
bio = user.find(
158
"div", class_="tweet-content media-body").text
159
full_name = user.find(
160
"a", class_="fullname").text
161
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "USER FOUND: {}".format(
162
Font.Color.GREEN + usern + Font.Color.WHITE))
163
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "NAME FOUND: {}".format(
164
Font.Color.GREEN + full_name + Font.Color.WHITE))
165
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "BIO: {}".format(
166
Font.Color.GREEN + bio + Font.Color.WHITE))
167
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "PROFILE-PIC: {}".format(
168
Font.Color.GREEN + profilepic + Font.Color.WHITE))
169
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "LINK: {}\n".format(
170
Font.Color.GREEN + link + Font.Color.WHITE))
171
List.append(usern)
172
Links.append(link)
173
Names2.append(full_name)
174
f.write("\nUSER FOUND: {}".format(usern))
175
f.write("\nFULL-NAME: {}\n".format(full_name))
176
f.write("\nBIO: {}\n".format(bio))
177
f.write("\nPROFILE-PIC FOUND: {}".format(profilepic))
178
f.write("\nLINK: {}\n".format(link))
179
i = i+1
180
else:
181
break
182
f.close()
183
print(Font.Color.GREEN + "[+]" +
184
Font.Color.WHITE + "TOTAL USERNAMES FOUND")
185
else:
186
print("ERROR")
187
except ConnectionError:
188
print(Font.Color.RED + "[!]" +
189
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Connection_Error2", "None"))
190
pass
191
except Exception as e:
192
print(Font.Color.RED + "[!]" +
193
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Error", "None"))
194
pass
195
196
j = 1
197
if len(List):
198
for Names in List:
199
print(Font.Color.YELLOW +
200
"[v]" + Font.Color.WHITE + "USERNAME N°{}: {}".format(j, Names))
201
j = j+1
202
if fold == "People":
203
json_file = "GUI/Reports/People/{}/Twitter_Link.json".format(username2)
204
else:
205
if username2 != "None":
206
json_file = "GUI/Reports/{}/{}/TwitterName_Link.json".format(fold,username2)
207
else:
208
json_file = "GUI/Reports/{}/{}/Twitter_Link.json".format(fold,username)
209
f = open(json_file, "w")
210
f.write('''{
211
"List":[
212
213
]
214
}''')
215
f.close()
216
217
i = 0
218
for image in Pics:
219
data2 = {
220
"username": "{}".format(List[i]),
221
"full-name": "{}".format(Names2[i]),
222
"site": "{}".format(Links[i]),
223
"image": "{}".format(image)
224
}
225
with open(json_file, 'r+') as file:
226
file_data = json.load(file)
227
file_data["List"].append(data2)
228
file.seek(0)
229
json.dump(file_data, file, indent=4)
230
i = i +1
231
232
if fold == "People":
233
opt = int(input(Font.Color.BLUE + "\n[?]" + Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Username", "Default", "Scraper") +
234
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
235
if opt == 1:
236
check = str(input(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE + "INSERT THE USERNANE TO CHECK\n\n" +
237
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
238
if check not in List:
239
pass
240
else:
241
if os.path.isdir(imagefold):
242
pass
243
else:
244
os.mkdir(imagefold)
245
Scraper.info.Twitter(report, check, http_proxy, TwitterParams,
246
"People", username2)
247
else:
248
print(print(Font.Color.RED +
249
"\n[!]" + Font.Color.WHITE + "NO USER HAS BEEN FOUND"))
250
251
@staticmethod
252
def TikTok(report, username, http_proxy, imagefold, username2,fold):
253
List = []
254
Links = []
255
print(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE +
256
"SCANNING FOR {} TIKTOK RESULTS...".format(username))
257
url = "https://urlebird.com/search/?q={}".format(username)
258
sleep(4)
259
try:
260
req = requests.get(url, timeout=None, proxies=http_proxy, headers=headers)
261
if req.status_code == 200:
262
reader = soup(req.content, "html.parser")
263
users = reader.find_all("div", class_="info text-truncate")
264
i = 1
265
f = open(report, "a",encoding="utf-8")
266
f.write(
267
"--------------------------------\nSHOWING TIKTOK RESULTS FOR: {}\n".format(username))
268
for user in users:
269
if i <= 20:
270
usern = user.find(
271
"a", class_="uri").text
272
link = "https://tiktok.com/{}".format(usern)
273
followers = user.find(
274
"span", class_="followers").text
275
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "USER FOUND: {}".format(
276
Font.Color.GREEN + usern.replace("@","") + Font.Color.WHITE))
277
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "FOLLOWERS: {}".format(
278
Font.Color.GREEN + followers + Font.Color.WHITE))
279
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "LINK: {}\n".format(
280
Font.Color.GREEN + link + Font.Color.WHITE))
281
List.append(usern.replace("@",""))
282
Links.append(link)
283
f.write("\nUSER FOUND: {}".format(usern))
284
f.write("\nFOLLOWERS: {}\n".format(followers))
285
f.write("\nLINK: {}\n".format(link))
286
i = i+1
287
else:
288
break
289
f.close()
290
print(Font.Color.GREEN + "[+]" +
291
Font.Color.WHITE + "TOTAL USERNAMES FOUND")
292
else:
293
print("ERROR")
294
except ConnectionError:
295
print(Font.Color.RED + "[!]" +
296
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Connection_Error2", "None"))
297
pass
298
except Exception as e:
299
print(Font.Color.RED + "[!]" +
300
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Error", "None") + str(e))
301
pass
302
303
j = 1
304
if len(List):
305
for Names in List:
306
print(Font.Color.YELLOW +
307
"[v]" + Font.Color.WHITE + "USERNAME N°{}: {}".format(j, Names))
308
j = j+1
309
if fold == "People":
310
json_file = "GUI/Reports/People/{}/TikTok_Link.json".format(username2)
311
else:
312
if username2 != "None":
313
json_file = "GUI/Reports/{}/{}/TikTokName_Link.json".format(fold,username2)
314
else:
315
json_file = "GUI/Reports/{}/{}/TikTok_Link.json".format(fold,username)
316
f = open(json_file, "w")
317
f.write('''{
318
"List":[
319
320
]
321
}''')
322
f.close()
323
i = 0
324
for link in Links:
325
data = {
326
"username": "{}".format(List[i]),
327
"site": "{}".format(link)
328
}
329
with open(json_file, 'r+') as file:
330
file_data = json.load(file)
331
file_data["List"].append(data)
332
file.seek(0)
333
json.dump(file_data, file, indent=4)
334
335
if fold == "People":
336
opt = int(input(Font.Color.BLUE + "\n[?]" + Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Username", "Default", "Scraper") +
337
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
338
if opt == 1:
339
check = str(input(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE + "INSERT THE USERNANE TO CHECK\n\n" +
340
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
341
if check not in List:
342
pass
343
else:
344
check = check.replace("@", "")
345
if os.path.isdir(imagefold):
346
pass
347
else:
348
os.mkdir(imagefold)
349
Scraper.info.TikTok(report, check, http_proxy,
350
"People", username2)
351
else:
352
print(Font.Color.RED + "\n[!]" +
353
Font.Color.WHITE + "NO USER HAS BEEN FOUND")
354
@staticmethod
355
def Github(report, username, http_proxy,imagefold, username2,fold):
356
List = []
357
Links = []
358
Pics = []
359
print(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE +
360
"SCANNING FOR {} GITHUB RESULTS...".format(username))
361
url = "https://api.github.com/search/users?q={}+in:text".format(username)
362
req = requests.get(url, timeout=None, proxies=http_proxy, headers=headers)
363
sleep(4)
364
i = 0
365
req = requests.get(url,headers=headers).text
366
f = open(report, "a",encoding="utf-8")
367
f.write( "--------------------------------\nSHOWING GITHUB RESULTS FOR: {}\n".format(username))
368
try:
369
parser = json.loads(req)
370
output = parser["total_count"]
371
if output == 0:
372
pass
373
else:
374
if output <= 20:
375
output = output
376
else:
377
output = 20
378
for i in range(output):
379
usern = parser["items"][i]["login"]
380
link = parser["items"][i]["html_url"]
381
profile_pic = parser["items"][i]["avatar_url"]
382
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "USER FOUND: {}".format(Font.Color.GREEN + usern + Font.Color.WHITE))
383
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "PROFILE-PIC: {}".format(Font.Color.GREEN + profile_pic + Font.Color.WHITE))
384
print(Font.Color.YELLOW + "[v]" + Font.Color.WHITE + "LINK: {}\n".format(Font.Color.GREEN + link + Font.Color.WHITE))
385
List.append(usern)
386
Links.append(link)
387
Pics.append(profile_pic)
388
f.write("\nUSER FOUND: {}".format(usern))
389
f.write("\nPROFILE-PIC: {}".format(profile_pic))
390
f.write("\nLINK: {}\n".format(link))
391
except ConnectionError:
392
print(Font.Color.RED + "[!]" +
393
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Connection_Error2", "None"))
394
pass
395
except Exception as e:
396
print(Font.Color.RED + "[!]" +
397
Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Default", "Error", "None") + str(e))
398
pass
399
j = 1
400
if len(List):
401
for Names in List:
402
print(Font.Color.YELLOW +
403
"[v]" + Font.Color.WHITE + "USERNAME N°{}: {}".format(j, Names))
404
j = j+1
405
if fold == "People":
406
json_file = "GUI/Reports/People/{}/Github_Link.json".format(username2)
407
else:
408
if username2 != "None":
409
json_file = "GUI/Reports/{}/{}/GithubName_Link.json".format(fold,username2)
410
else:
411
json_file = "GUI/Reports/{}/{}/Github_Link.json".format(fold,username)
412
f = open(json_file, "w")
413
f.write('''{
414
"List":[
415
416
]
417
}''')
418
f.close()
419
420
i = 0
421
for image in Pics:
422
data2 = {
423
"username":"{}".format(List[i]),
424
"site": "{}".format(Links[i]),
425
"image": "{}".format(image)
426
}
427
with open(json_file, 'r+') as file:
428
file_data = json.load(file)
429
file_data["List"].append(data2)
430
file.seek(0)
431
json.dump(file_data, file, indent=4)
432
i = i +1
433
if fold == "People":
434
opt = int(input(Font.Color.BLUE + "\n[?]" + Font.Color.WHITE + Language.Translation.Translate_Language(filename, "Username", "Default", "Scraper") +
435
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
436
if opt == 1:
437
check = str(input(Font.Color.GREEN + "\n[+]" + Font.Color.WHITE + "INSERT THE USERNANE TO CHECK\n\n" +
438
Font.Color.GREEN + "[#MR.HOLMES#]" + Font.Color.WHITE + "-->"))
439
if check not in List:
440
pass
441
else:
442
check = check.replace("@", "")
443
if os.path.isdir(imagefold):
444
pass
445
else:
446
os.mkdir(imagefold)
447
Scraper.info.Github(report, check, http_proxy,
448
"People", username2)
449
else:
450
print(print(Font.Color.RED +
451
"\n[!]" + Font.Color.WHITE + "NO USER HAS BEEN FOUND"))
452
453