mirror of
https://github.com/laramies/theHarvester.git
synced 2025-02-24 14:32:57 +08:00
WIP: Adding github-code search
This commit is contained in:
parent
f8cc29b6f2
commit
f2b2c0fbf9
2 changed files with 25 additions and 17 deletions
|
@ -15,4 +15,4 @@ apikeys:
|
||||||
key: oCiMsgM6rQWqiTvPxFHYcExlZgg7wvTt
|
key: oCiMsgM6rQWqiTvPxFHYcExlZgg7wvTt
|
||||||
|
|
||||||
github:
|
github:
|
||||||
key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
|
key:
|
||||||
|
|
|
@ -32,9 +32,11 @@ def __init__(self, word, limit):
|
||||||
self.hostname = 'api.github.com'
|
self.hostname = 'api.github.com'
|
||||||
self.limit = limit
|
self.limit = limit
|
||||||
self.counter = 0
|
self.counter = 0
|
||||||
self.page = None
|
self.page = 1
|
||||||
self.key = Core.github_key()
|
self.key = Core.github_key()
|
||||||
# If you don't have a personal access token, github narrows your search capabilities significantly
|
# If you don't have a personal access token, github narrows your search capabilities significantly
|
||||||
|
# and rate limits you more severely
|
||||||
|
# https://developer.github.com/v3/search/#rate-limit
|
||||||
if self.key is None:
|
if self.key is None:
|
||||||
raise MissingKey(True)
|
raise MissingKey(True)
|
||||||
|
|
||||||
|
@ -56,7 +58,8 @@ def next_page_from_response(response: Response) -> Optional[int]:
|
||||||
parsed = urlparse.urlparse(next_link.get("url"))
|
parsed = urlparse.urlparse(next_link.get("url"))
|
||||||
params = urlparse.parse_qs(parsed.query)
|
params = urlparse.parse_qs(parsed.query)
|
||||||
page = params.get('page') or [None]
|
page = params.get('page') or [None]
|
||||||
return page[0]
|
next_page = page[0] and int(page[0])
|
||||||
|
return next_page
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
@ -67,18 +70,18 @@ def last_page_from_response(response: Response) -> Optional[int]:
|
||||||
parsed = urlparse.urlparse(next_link.get("url"))
|
parsed = urlparse.urlparse(next_link.get("url"))
|
||||||
params = urlparse.parse_qs(parsed.query)
|
params = urlparse.parse_qs(parsed.query)
|
||||||
page = params.get('page') or [None]
|
page = params.get('page') or [None]
|
||||||
return page[0]
|
last_page = page[0] and int(page[0])
|
||||||
|
return last_page
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def handle_response(self, response: Response) -> Optional[Any]:
|
def handle_response(self, response: Response) -> Optional[Any]:
|
||||||
if response.ok:
|
if response.ok:
|
||||||
fragments = self.fragments_from_response(response)
|
fragments = self.fragments_from_response(response)
|
||||||
print(fragments)
|
|
||||||
next_page = self.next_page_from_response(response)
|
next_page = self.next_page_from_response(response)
|
||||||
last_page = self.last_page_from_response(response)
|
last_page = self.last_page_from_response(response)
|
||||||
return SuccessResult(fragments, next_page, last_page)
|
return SuccessResult(fragments, next_page, last_page)
|
||||||
elif response.status_code == 429:
|
elif response.status_code == 429 or response.status_code == 403:
|
||||||
return RetryResult(60)
|
return RetryResult(60)
|
||||||
else:
|
else:
|
||||||
return ErrorResult(response.status_code, response.reason)
|
return ErrorResult(response.status_code, response.reason)
|
||||||
|
@ -101,26 +104,31 @@ def do_search(self, page: Optional[int]) -> Optional[Any]:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f'Error Occurred: {e}')
|
print(f'Error Occurred: {e}')
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def next_page_or_end(page: Optional[int], result: SuccessResult) -> Optional[int]:
|
||||||
|
if page is not None and result.last_page is not None and page < result.last_page:
|
||||||
|
return page + 1
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
while len(self.total_results) <= self.limit:
|
while self.counter <= self.limit and self.page is not None:
|
||||||
print(self.total_results)
|
|
||||||
print(self.limit)
|
|
||||||
result = self.do_search(self.page)
|
result = self.do_search(self.page)
|
||||||
if type(result) == SuccessResult:
|
if type(result) == SuccessResult:
|
||||||
|
print(f'\tSearching {self.counter} results.')
|
||||||
for f in result.fragments:
|
for f in result.fragments:
|
||||||
self.total_results += f
|
self.total_results += f
|
||||||
self.counter = self.counter + 1
|
self.counter = self.counter + 1
|
||||||
if self.page != result.last_page:
|
|
||||||
self.page = result.next_page
|
self.page = self.next_page_or_end(self.page, result)
|
||||||
else:
|
time.sleep(getDelay())
|
||||||
break
|
|
||||||
print(f'\tSearching {self.counter} results.')
|
|
||||||
elif type(result) == RetryResult:
|
elif type(result) == RetryResult:
|
||||||
print(f'\tRetrying page...')
|
sleepy_time = getDelay() + result.time
|
||||||
time.sleep(getDelay() + result.time)
|
print(f'\tRetrying page in {sleepy_time} seconds...')
|
||||||
|
time.sleep(sleepy_time)
|
||||||
else:
|
else:
|
||||||
raise Exception("Exception occurred: status_code: {} reason: {}".format(result.status_code,
|
raise Exception("Exception occurred: status_code: {} reason: {}".format(result.status_code,
|
||||||
result.text))
|
result.message))
|
||||||
|
|
||||||
def get_emails(self):
|
def get_emails(self):
|
||||||
rawres = myparser.Parser(self.total_results, self.word)
|
rawres = myparser.Parser(self.total_results, self.word)
|
||||||
|
|
Loading…
Reference in a new issue