示例#1
0
 def search_bing_api(self, query, limit=0):
     url = 'https://api.cognitive.microsoft.com/bing/v7.0/search'
     payload = {'q': query, 'count': 50, 'offset': 0, 'responseFilter': 'WebPages'}
     headers = {'Ocp-Apim-Subscription-Key': self.get_key('bing_api')}
     results = []
     cnt = 0
     self.verbose('Searching Bing API for: %s' % (query))
     while True:
         resp = self.request(url, payload=payload, headers=headers)
         if resp.json == None:
             raise framework.FrameworkException('Invalid JSON response.\n%s' % (resp.text))
         #elif 'error' in resp.json:
         elif resp.status_code == 401:
             raise framework.FrameworkException('%s: %s' % (resp.json['statusCode'], resp.json['message']))
         # add new results, or if there's no more, return what we have...
         if 'webPages' in resp.json:
             results.extend(resp.json['webPages']['value'])
         else:
             return results
         # increment and check the limit
         cnt += 1
         if limit == cnt:
             break
         # check for more pages
         # https://msdn.microsoft.com/en-us/library/dn760787.aspx
         if payload['offset'] > (resp.json['webPages']['totalEstimatedMatches'] - payload['count']):
             break
         # set the payload for the next request
         payload['offset'] += payload['count']
     return results
示例#2
0
 def _get_source(self, params, query=None):
     prefix = params.split()[0].lower()
     if prefix in ['query', 'default']:
         query = ' '.join(
             params.split()[1:]) if prefix == 'query' else query
         try:
             results = self.query(query)
         except sqlite3.OperationalError as e:
             raise framework.FrameworkException(
                 'Invalid source query. %s %s' %
                 (type(e).__name__, e.message))
         if not results:
             sources = []
         elif len(results[0]) > 1:
             sources = [x[:len(x)] for x in results]
             #raise framework.FrameworkException('Too many columns of data as source input.')
         else:
             sources = [x[0] for x in results]
     elif os.path.exists(params):
         sources = open(params).read().split()
     else:
         sources = [params]
     source = [self.to_unicode(x) for x in sources]
     if not source:
         raise framework.FrameworkException('Source contains no input.')
     return source
示例#3
0
 def search_shodan_api(self, query, limit=0):
     api_key = self.get_key('shodan_api')
     url = 'https://api.shodan.io/shodan/host/search'
     payload = {'query': query, 'key': api_key}
     results = []
     cnt = 1
     page = 1
     self.verbose('Searching Shodan API for: %s' % (query))
     while True:
         resp = self.request(url, payload=payload)
         if resp.json == None:
             raise framework.FrameworkException(
                 'Invalid JSON response.\n%s' % (resp.text))
         if 'error' in resp.json:
             raise framework.FrameworkException(resp.json['error'])
         if not resp.json['matches']:
             break
         # add new results
         results.extend(resp.json['matches'])
         # check limit
         if limit == cnt:
             break
         cnt += 1
         # next page
         page += 1
         payload['page'] = page
     return results
示例#4
0
 def search_shodan_api(self, query, limit=0):
     api_key = self.get_key('shodan_api')
     url = 'https://api.shodan.io/shodan/host/search'
     payload = {'query': query, 'key': api_key}
     results = []
     cnt = 0
     page = 1
     self.verbose(f"Searching Shodan API for: {query}")
     while True:
         time.sleep(1)
         resp = self.request('GET', url, params=payload)
         if resp.json() == None:
             raise framework.FrameworkException(f"Invalid JSON response.{os.linesep}{resp.text}")
         if 'error' in resp.json():
             raise framework.FrameworkException(resp.json()['error'])
         if not resp.json()['matches']:
             break
         # add new results
         results.extend(resp.json()['matches'])
         # increment and check the limit
         cnt += 1
         if limit == cnt:
             break
         # next page
         page += 1
         payload['page'] = page
     return results
示例#5
0
 def _request_file_from_repo(self, path):
     resp = self.request('GET', urljoin(self.repo_url, path))
     if resp.status_code != 200:
         raise framework.FrameworkException(
             f"Invalid response from module repository ({resp.status_code})."
         )
     return resp
示例#6
0
 def search_google_api(self, query, limit=0):
     api_key = self.get_key('google_api')
     cse_id = self.get_key('google_cse')
     url = 'https://www.googleapis.com/customsearch/v1'
     payload = {
         'alt': 'json',
         'prettyPrint': 'false',
         'key': api_key,
         'cx': cse_id,
         'q': query
     }
     results = []
     cnt = 1
     self.verbose('Searching Google API for: %s' % (query))
     while True:
         resp = None
         resp = self.request(url, payload=payload)
         if resp.json == None:
             raise framework.FrameworkException(
                 'Invalid JSON response.\n%s' % (resp.text))
         # add new results
         if 'items' in resp.json:
             results.extend(resp.json['items'])
         # check limit
         if limit == cnt:
             break
         cnt += 1
         # check for more pages
         if not 'nextPage' in resp.json['queries']:
             break
         payload['start'] = resp.json['queries']['nextPage'][0][
             'startIndex']
     return results
示例#7
0
 def search_bing_api(self, query, limit=0):
     api_key = self.get_key('bing_api')
     url = 'https://api.datamarket.azure.com/Bing/Search/Web'
     payload = {'Query': "'%s'" % (query), '$format': 'json'}
     results = []
     cnt = 1
     self.verbose('Searching Bing API for: %s' % (query))
     while True:
         resp = None
         resp = self.request(url, payload=payload, auth=(api_key, api_key))
         if resp.json == None:
             raise framework.FrameworkException(
                 'Invalid JSON response.\n%s' % (resp.text))
         # add new results
         if 'results' in resp.json['d']:
             results.extend(resp.json['d']['results'])
         # check limit
         if limit == cnt:
             break
         cnt += 1
         # check for more pages
         if not '__next' in resp.json['d']:
             break
         payload['$skip'] = resp.json['d']['__next'].split('=')[-1]
     return results
示例#8
0
 def get_twitter_oauth_token(self):
     token_name = 'twitter_token'
     try:
         return self.get_key(token_name)
     except:
         pass
     twitter_key = self.get_key('twitter_api')
     twitter_secret = self.get_key('twitter_secret')
     url = 'https://api.twitter.com/oauth2/token'
     auth = (twitter_key, twitter_secret)
     headers = {
         'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
     }
     payload = {'grant_type': 'client_credentials'}
     resp = self.request(url,
                         method='POST',
                         auth=auth,
                         headers=headers,
                         payload=payload)
     if 'errors' in resp.json:
         raise framework.FrameworkException(
             '%s, %s' % (resp.json['errors'][0]['message'],
                         resp.json['errors'][0]['label']))
     access_token = resp.json['access_token']
     self.add_key(token_name, access_token)
     return access_token
示例#9
0
 def get_twitter_oauth_token(self):
     token_name = 'twitter_token'
     token = self.get_key(token_name)
     if token:
         return token
     twitter_key = self.get_key('twitter_api')
     twitter_secret = self.get_key('twitter_secret')
     url = 'https://api.twitter.com/oauth2/token'
     auth = (twitter_key, twitter_secret)
     headers = {
         'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
     }
     payload = {'grant_type': 'client_credentials'}
     resp = self.request('POST',
                         url,
                         auth=auth,
                         headers=headers,
                         data=payload)
     if 'errors' in resp.json():
         raise framework.FrameworkException(
             f"{resp.json()['errors'][0]['message']}, {resp.json()['errors'][0]['label']}"
         )
     access_token = resp.json()['access_token']
     self.add_key(token_name, access_token)
     return access_token
示例#10
0
 def search_google_api(self, query, limit=0):
     api_key = self.get_key('google_api')
     cse_id = self.get_key('google_cse')
     url = 'https://www.googleapis.com/customsearch/v1'
     payload = {
         'alt': 'json',
         'prettyPrint': 'false',
         'key': api_key,
         'cx': cse_id,
         'q': query
     }
     results = []
     cnt = 0
     self.verbose(f"Searching Google API for: {query}")
     while True:
         resp = self.request('GET', url, params=payload)
         if resp.json() == None:
             raise framework.FrameworkException(
                 f"Invalid JSON response.{os.linesep}{resp.text}")
         # add new results
         if 'items' in resp.json():
             results.extend(resp.json()['items'])
         # increment and check the limit
         cnt += 1
         if limit == cnt:
             break
         # check for more pages
         if not 'nextPage' in resp.json()['queries']:
             break
         payload['start'] = resp.json(
         )['queries']['nextPage'][0]['startIndex']
     return results
示例#11
0
文件: module.py 项目: rubrod/recon-es
 def _get_source(self, params, query=None):
     prefix = params.split()[0].lower()
     if prefix in ['query', 'default']:
         query = ' '.join(params.split()[1:]) if prefix == 'query' else query
         docs = self.read_doc_ES(os.path.basename(self.workspace), query)
         sources = []
         for doc in docs:
             for value in doc['_source'].values():
                 sources.append(value)
     elif os.path.exists(params):
         sources = open(params, encoding='UTF-8').read().split()
     else:
         sources = [params]
     if not sources:
         raise framework.FrameworkException('Source contains no input.')
     return sources
示例#12
0
 def search_twitter_api(self, payload, limit=False):
     headers = {'Authorization': 'Bearer %s' % (self.get_twitter_oauth_token())}
     url = 'https://api.twitter.com/1.1/search/tweets.json'
     results = []
     while True:
         resp = self.request(url, payload=payload, headers=headers)
         if limit:
             # app auth rate limit for search/tweets is 450/15min
             time.sleep(2)
         jsonobj = resp.json
         for item in ['error', 'errors']:
             if item in jsonobj:
                 raise framework.FrameworkException(jsonobj[item])
         results += jsonobj['statuses']
         if 'next_results' in jsonobj['search_metadata']:
             max_id = urlparse.parse_qs(jsonobj['search_metadata']['next_results'][1:])['max_id'][0]
             payload['max_id'] = max_id
             continue
         break
     return results
示例#13
0
 def search_twitter_api(self, payload):
     headers = {
         'Authorization': 'Bearer %s' % (self.get_twitter_oauth_token())
     }
     url = 'https://api.twitter.com/1.1/search/tweets.json'
     # count causes inconsistent results when applied
     #payload['count'] = 50 # api stops paginating at count=90
     results = []
     while True:
         resp = self.request(url, payload=payload, headers=headers)
         jsonobj = resp.json
         for item in ['error', 'errors']:
             if item in jsonobj:
                 raise framework.FrameworkException(jsonobj[item])
         results += jsonobj['statuses']
         if 'next_results' in jsonobj['search_metadata']:
             max_id = urlparse.parse_qs(jsonobj['search_metadata']
                                        ['next_results'][1:])['max_id'][0]
             payload['max_id'] = max_id
             continue
         break
     return results