From a2bf55f16b674b49f5f0cabf66823e4b0edcafe8 Mon Sep 17 00:00:00 2001 From: syed abuthahir Date: Sat, 6 Jul 2019 12:03:29 +0530 Subject: [PATCH 1/9] create setup file --- .DS_Store | Bin 0 -> 8196 bytes build/lib/wappalyze/__init__.py | 1 + .../lib/wappalyze/wappalyze.py | 18 ++- build/scripts-2.7/wappalyze.py | 143 ++++++++++++++++++ dist/wappalyze-1.0-py2.7.egg | Bin 0 -> 7308 bytes setup.py | 32 ++++ wappalyze.egg-info/PKG-INFO | 22 +++ wappalyze.egg-info/SOURCES.txt | 9 ++ wappalyze.egg-info/dependency_links.txt | 1 + wappalyze.egg-info/requires.txt | 2 + wappalyze.egg-info/top_level.txt | 1 + wappalyze.pyc | Bin 0 -> 4542 bytes wappalyze/.DS_Store | Bin 0 -> 6148 bytes wappalyze/__init__.py | 1 + wappalyze/__init__.pyc | Bin 0 -> 148 bytes {data => wappalyze}/apps.json | 0 wappalyze/wappalyze.py | 143 ++++++++++++++++++ wappalyze/wappalyze.pyc | Bin 0 -> 4862 bytes 18 files changed, 366 insertions(+), 7 deletions(-) create mode 100644 .DS_Store create mode 100644 build/lib/wappalyze/__init__.py rename wappalyze.py => build/lib/wappalyze/wappalyze.py (90%) create mode 100755 build/scripts-2.7/wappalyze.py create mode 100644 dist/wappalyze-1.0-py2.7.egg create mode 100644 setup.py create mode 100644 wappalyze.egg-info/PKG-INFO create mode 100644 wappalyze.egg-info/SOURCES.txt create mode 100644 wappalyze.egg-info/dependency_links.txt create mode 100644 wappalyze.egg-info/requires.txt create mode 100644 wappalyze.egg-info/top_level.txt create mode 100644 wappalyze.pyc create mode 100644 wappalyze/.DS_Store create mode 100644 wappalyze/__init__.py create mode 100644 wappalyze/__init__.pyc rename {data => wappalyze}/apps.json (100%) create mode 100644 wappalyze/wappalyze.py create mode 100644 wappalyze/wappalyze.pyc diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eecd89fdc8f9aeed4d870fe3f530c346a5fe6fc3 GIT binary patch literal 8196 zcmeHM&2G~`5T0!eIH@XfK(t3+kU)y6~%Tb)Pj+pZP2Z8^SAsXrN8_5;uD z?-eg?(=fKY(CzSG&vB9R_@Ng%v|p#a(CPByn8Km!c|E^ZygVFMua}H!WmGbT)oQt9 z+$e91MtObpO668_KNuVhpO21T@(loycP+RmzEAp-yM+8w!hlZY z&+@0_*CKWT6ZsF#PUzF{0O#0w7T`8CVHxFRW_mA=S;X+iWv8nNRmQwl7i0y(kiHCF%coc{iQ5v5UkRthYP0z_+= zjXG}k_kXFgJ7=}Ffo&ffGsYVWpq~F+ Kc-1Ym0>1!IQCiyo literal 0 HcmV?d00001 diff --git a/build/lib/wappalyze/__init__.py b/build/lib/wappalyze/__init__.py new file mode 100644 index 0000000..29391ef --- /dev/null +++ b/build/lib/wappalyze/__init__.py @@ -0,0 +1 @@ +from wappalyze import * \ No newline at end of file diff --git a/wappalyze.py b/build/lib/wappalyze/wappalyze.py similarity index 90% rename from wappalyze.py rename to build/lib/wappalyze/wappalyze.py index 48b0569..2f9da0e 100644 --- a/wappalyze.py +++ b/build/lib/wappalyze/wappalyze.py @@ -1,13 +1,14 @@ import json -import re +import re,argparse,os import warnings import pkg_resources import requests from bs4 import BeautifulSoup - def _parse_webpage(url): webpage={} + if not url.startswith('http'): + url='http://'+url response = requests.get(url) webpage['url'] = response.url webpage['headers'] = response.headers @@ -108,10 +109,10 @@ def __get_implied_apps(detect, apps): return all_implied_apps -def analyze(): - url = raw_input('Enter the URL: ') +def analyze(target): + url = target webpage = _parse_webpage(url) - obj = json.loads(pkg_resources.resource_string(__name__, "data/apps.json")) + obj = json.loads(pkg_resources.resource_string(__name__, "apps.json")) apps = obj['apps'] detected = [] for app_name, app in apps.items(): @@ -132,8 +133,11 @@ def analyze(): if __name__ == '__main__': - printing = analyze() + ap = argparse.ArgumentParser() + ap.add_argument("-u", "--url", required=True,help="Please enter target Url") + args = vars(ap.parse_args()) + printing = analyze(args['url']) for x in printing.items(): string = '\nCategory: '+str(x[0])+'\nFrameworks :'+','.join(x[1]) - print string + print(string) diff --git a/build/scripts-2.7/wappalyze.py b/build/scripts-2.7/wappalyze.py new file mode 100755 index 0000000..2f9da0e --- /dev/null +++ b/build/scripts-2.7/wappalyze.py @@ -0,0 +1,143 @@ +import json +import re,argparse,os +import warnings +import pkg_resources +import requests +from bs4 import BeautifulSoup + +def _parse_webpage(url): + webpage={} + if not url.startswith('http'): + url='http://'+url + response = requests.get(url) + webpage['url'] = response.url + webpage['headers'] = response.headers + webpage['response'] = response.text + webpage['html'] = BeautifulSoup(response.text, 'html.parser') + webpage['scripts'] = [script['src'] for script in webpage['html'].findAll('script', src=True)] + webpage['metatags'] = {meta['name'].lower(): meta['content'] + for meta in webpage['html'].findAll('meta', attrs=dict(name=True, content=True))} + return webpage + +def _prepare_app(app): + + for key in ['url', 'html', 'script', 'implies']: + try: + value = app[key] + except KeyError: + app[key] = [] + else: + if not isinstance(value, list): + app[key] = [value] + + for key in ['headers', 'meta']: + try: + value = app[key] + except KeyError: + app[key] = {} + + obj = app['meta'] + if not isinstance(obj, dict): + app['meta'] = {'generator': obj} + + for key in ['headers', 'meta']: + obj = app[key] + app[key] = {k.lower(): v for k, v in obj.items()} + + for key in ['url', 'html', 'script']: + app[key] = [_prepare_pattern(pattern) for pattern in app[key]] + + for key in ['headers', 'meta']: + obj = app[key] + for name, pattern in obj.items(): + obj[name] = _prepare_pattern(obj[name]) + +def _prepare_pattern(pattern): + regex, _, rest = pattern.partition('\\;') + try: + return re.compile(regex, re.I) + except re.error as e: + warnings.warn( + "Caught '{error}' compiling regex: {regex}" + .format(error=e, regex=regex) + ) + # regex that never matches: + # http://stackoverflow.com/a/1845097/413622 + return re.compile(r'(?!x)x') + + +def _has_app(app, webpage): + for regex in app['url']: + if regex.search(webpage['url']): + return True + for name, regex in app['headers'].items(): + if name in webpage['headers']: + content = webpage['headers'][name] + if regex.search(content): + return True + for regex in app['script']: + for script in webpage['scripts']: + if regex.search(script): + return True + for name, regex in app['meta'].items(): + if name in webpage['metatags']: + content = webpage['metatags'][name] + if regex.search(content): + return True + for regex in app['html']: + if regex.search(webpage['response']): + return True + +def _get_implied_apps(detected_apps, apps1): + + def __get_implied_apps(detect, apps): + _implied_apps = set() + for detected in detect: + try: + _implied_apps.update(set(apps[detected]['implies'])) + except KeyError: + pass + return _implied_apps + + implied_apps = __get_implied_apps(detected_apps, apps1) + all_implied_apps = set() + + while not all_implied_apps.issuperset(implied_apps): + all_implied_apps.update(implied_apps) + implied_apps = __get_implied_apps(all_implied_apps, apps1) + + return all_implied_apps + + +def analyze(target): + url = target + webpage = _parse_webpage(url) + obj = json.loads(pkg_resources.resource_string(__name__, "apps.json")) + apps = obj['apps'] + detected = [] + for app_name, app in apps.items(): + _prepare_app(app) + if _has_app(app, webpage): + detected.append(app_name) + detected = set(detected).union(_get_implied_apps(detected, apps)) + category_wise = {} + for app_name in detected: + cats = apps[app_name]['cats'] + for cat in cats: + category_wise[app_name] = obj['categories'][str(cat)]['name'] + inv_map = {} + for k, v in category_wise.iteritems(): + inv_map[v] = inv_map.get(v, []) + inv_map[v].append(k) + return inv_map + + +if __name__ == '__main__': + ap = argparse.ArgumentParser() + ap.add_argument("-u", "--url", required=True,help="Please enter target Url") + args = vars(ap.parse_args()) + printing = analyze(args['url']) + for x in printing.items(): + string = '\nCategory: '+str(x[0])+'\nFrameworks :'+','.join(x[1]) + print(string) + diff --git a/dist/wappalyze-1.0-py2.7.egg b/dist/wappalyze-1.0-py2.7.egg new file mode 100644 index 0000000000000000000000000000000000000000..ab878f98557e3f715382b6c813745b0bcfbbfb95 GIT binary patch literal 7308 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.3", "lxml==0.5a7"] +if os.path.isfile(requirementPath): + with open(requirementPath) as f: + install_requires = f.read().splitlines() +setuptools.setup( + name="wappalyze", + version="1.0", + author="Syed Abuthahir", + author_email="developerabu@gmail.com", + description="Framework Identifier tool", + long_description=long_description, + long_description_content_type="text/markdown", + url="https://github.com/abuvanth/framework-identifier", + packages=setuptools.find_packages(), + package_dir={'wappalyze': 'wappalyze'}, + package_data={'wappalyze': ['app.json']}, + install_requires=install_requires, + scripts=['wappalyze/wappalyze.py'], + classifiers=[ + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], +) diff --git a/wappalyze.egg-info/PKG-INFO b/wappalyze.egg-info/PKG-INFO new file mode 100644 index 0000000..61aae4b --- /dev/null +++ b/wappalyze.egg-info/PKG-INFO @@ -0,0 +1,22 @@ +Metadata-Version: 2.1 +Name: wappalyze +Version: 1.0 +Summary: Framework Identifier tool +Home-page: https://github.com/abuvanth/framework-identifier +Author: Syed Abuthahir +Author-email: developerabu@gmail.com +License: UNKNOWN +Description: # framework-identifier + This repository is the python implementation of the repo(https://github.com/AliasIO/Wappalyzer). + ## Setup + Run: + `pip install -r requirements.txt` + ## Running the script + To run the script, the following command is to be used: + `python wappalyze.py` + +Platform: UNKNOWN +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Description-Content-Type: text/markdown diff --git a/wappalyze.egg-info/SOURCES.txt b/wappalyze.egg-info/SOURCES.txt new file mode 100644 index 0000000..6e2696b --- /dev/null +++ b/wappalyze.egg-info/SOURCES.txt @@ -0,0 +1,9 @@ +README.md +setup.py +wappalyze/__init__.py +wappalyze/wappalyze.py +wappalyze.egg-info/PKG-INFO +wappalyze.egg-info/SOURCES.txt +wappalyze.egg-info/dependency_links.txt +wappalyze.egg-info/requires.txt +wappalyze.egg-info/top_level.txt \ No newline at end of file diff --git a/wappalyze.egg-info/dependency_links.txt b/wappalyze.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/wappalyze.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/wappalyze.egg-info/requires.txt b/wappalyze.egg-info/requires.txt new file mode 100644 index 0000000..dc1536f --- /dev/null +++ b/wappalyze.egg-info/requires.txt @@ -0,0 +1,2 @@ +requests +bs4 diff --git a/wappalyze.egg-info/top_level.txt b/wappalyze.egg-info/top_level.txt new file mode 100644 index 0000000..05ac273 --- /dev/null +++ b/wappalyze.egg-info/top_level.txt @@ -0,0 +1 @@ +wappalyze diff --git a/wappalyze.pyc b/wappalyze.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3243944ea465ba7774b12e89e12dc27b20812d01 GIT binary patch literal 4542 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 Date: Sat, 6 Jul 2019 12:13:20 +0530 Subject: [PATCH 2/9] remove build files --- .DS_Store | Bin 8196 -> 6148 bytes .gitignore | 103 +++++++++++++++++ build/lib/wappalyze/__init__.py | 1 - build/lib/wappalyze/wappalyze.py | 143 ------------------------ build/scripts-2.7/wappalyze.py | 143 ------------------------ dist/wappalyze-1.0-py2.7.egg | Bin 7308 -> 0 bytes wappalyze.egg-info/PKG-INFO | 22 ---- wappalyze.egg-info/SOURCES.txt | 9 -- wappalyze.egg-info/dependency_links.txt | 1 - wappalyze.egg-info/requires.txt | 2 - wappalyze.egg-info/top_level.txt | 1 - wappalyze.pyc | Bin 4542 -> 0 bytes wappalyze/wappalyze.pyc | Bin 4862 -> 0 bytes 13 files changed, 103 insertions(+), 322 deletions(-) create mode 100644 .gitignore delete mode 100644 build/lib/wappalyze/__init__.py delete mode 100644 build/lib/wappalyze/wappalyze.py delete mode 100755 build/scripts-2.7/wappalyze.py delete mode 100644 dist/wappalyze-1.0-py2.7.egg delete mode 100644 wappalyze.egg-info/PKG-INFO delete mode 100644 wappalyze.egg-info/SOURCES.txt delete mode 100644 wappalyze.egg-info/dependency_links.txt delete mode 100644 wappalyze.egg-info/requires.txt delete mode 100644 wappalyze.egg-info/top_level.txt delete mode 100644 wappalyze.pyc delete mode 100644 wappalyze/wappalyze.pyc diff --git a/.DS_Store b/.DS_Store index eecd89fdc8f9aeed4d870fe3f530c346a5fe6fc3..24ff59d51446d73da24aba347815cee64a887aba 100644 GIT binary patch delta 169 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{Mvv5sJ6q~50$SANeU^g?Pz+@hQ>dkUOf=tXT zJzpk&6cU^4A;QDa!S>R{I^&=tNI)bvKgA^}CqD^f3bMrHIU>AFEC(ik5E7q!NaW69 rb`B0fW}qS<5a0$9t{~esCVpq0%rD~!vYUYk;tr707&gcA%wYxqO^7DX delta 378 zcmZoMXmOBWU|?W$DortDU;r^WfEYvza8FDWo2aMAD84aZH}hr%jz7$c**Q2S7O*gi zPv&8%He_K)VMt^sVMz4M$xlwo$xi}l0%B_**7y$wKo$c7T;1eFtk>${yqt8y;N<+= z0*IRAGGvvx`7SO{6FIn7oLFp@anKP}J_WCQK?btfU@M^Z@-ZZq1sCPzmHTeyjqKjfwx503jn`Z2$lO diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..457d704 --- /dev/null +++ b/.gitignore @@ -0,0 +1,103 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST +kickdomain/provider/config.py +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ \ No newline at end of file diff --git a/build/lib/wappalyze/__init__.py b/build/lib/wappalyze/__init__.py deleted file mode 100644 index 29391ef..0000000 --- a/build/lib/wappalyze/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from wappalyze import * \ No newline at end of file diff --git a/build/lib/wappalyze/wappalyze.py b/build/lib/wappalyze/wappalyze.py deleted file mode 100644 index 2f9da0e..0000000 --- a/build/lib/wappalyze/wappalyze.py +++ /dev/null @@ -1,143 +0,0 @@ -import json -import re,argparse,os -import warnings -import pkg_resources -import requests -from bs4 import BeautifulSoup - -def _parse_webpage(url): - webpage={} - if not url.startswith('http'): - url='http://'+url - response = requests.get(url) - webpage['url'] = response.url - webpage['headers'] = response.headers - webpage['response'] = response.text - webpage['html'] = BeautifulSoup(response.text, 'html.parser') - webpage['scripts'] = [script['src'] for script in webpage['html'].findAll('script', src=True)] - webpage['metatags'] = {meta['name'].lower(): meta['content'] - for meta in webpage['html'].findAll('meta', attrs=dict(name=True, content=True))} - return webpage - -def _prepare_app(app): - - for key in ['url', 'html', 'script', 'implies']: - try: - value = app[key] - except KeyError: - app[key] = [] - else: - if not isinstance(value, list): - app[key] = [value] - - for key in ['headers', 'meta']: - try: - value = app[key] - except KeyError: - app[key] = {} - - obj = app['meta'] - if not isinstance(obj, dict): - app['meta'] = {'generator': obj} - - for key in ['headers', 'meta']: - obj = app[key] - app[key] = {k.lower(): v for k, v in obj.items()} - - for key in ['url', 'html', 'script']: - app[key] = [_prepare_pattern(pattern) for pattern in app[key]] - - for key in ['headers', 'meta']: - obj = app[key] - for name, pattern in obj.items(): - obj[name] = _prepare_pattern(obj[name]) - -def _prepare_pattern(pattern): - regex, _, rest = pattern.partition('\\;') - try: - return re.compile(regex, re.I) - except re.error as e: - warnings.warn( - "Caught '{error}' compiling regex: {regex}" - .format(error=e, regex=regex) - ) - # regex that never matches: - # http://stackoverflow.com/a/1845097/413622 - return re.compile(r'(?!x)x') - - -def _has_app(app, webpage): - for regex in app['url']: - if regex.search(webpage['url']): - return True - for name, regex in app['headers'].items(): - if name in webpage['headers']: - content = webpage['headers'][name] - if regex.search(content): - return True - for regex in app['script']: - for script in webpage['scripts']: - if regex.search(script): - return True - for name, regex in app['meta'].items(): - if name in webpage['metatags']: - content = webpage['metatags'][name] - if regex.search(content): - return True - for regex in app['html']: - if regex.search(webpage['response']): - return True - -def _get_implied_apps(detected_apps, apps1): - - def __get_implied_apps(detect, apps): - _implied_apps = set() - for detected in detect: - try: - _implied_apps.update(set(apps[detected]['implies'])) - except KeyError: - pass - return _implied_apps - - implied_apps = __get_implied_apps(detected_apps, apps1) - all_implied_apps = set() - - while not all_implied_apps.issuperset(implied_apps): - all_implied_apps.update(implied_apps) - implied_apps = __get_implied_apps(all_implied_apps, apps1) - - return all_implied_apps - - -def analyze(target): - url = target - webpage = _parse_webpage(url) - obj = json.loads(pkg_resources.resource_string(__name__, "apps.json")) - apps = obj['apps'] - detected = [] - for app_name, app in apps.items(): - _prepare_app(app) - if _has_app(app, webpage): - detected.append(app_name) - detected = set(detected).union(_get_implied_apps(detected, apps)) - category_wise = {} - for app_name in detected: - cats = apps[app_name]['cats'] - for cat in cats: - category_wise[app_name] = obj['categories'][str(cat)]['name'] - inv_map = {} - for k, v in category_wise.iteritems(): - inv_map[v] = inv_map.get(v, []) - inv_map[v].append(k) - return inv_map - - -if __name__ == '__main__': - ap = argparse.ArgumentParser() - ap.add_argument("-u", "--url", required=True,help="Please enter target Url") - args = vars(ap.parse_args()) - printing = analyze(args['url']) - for x in printing.items(): - string = '\nCategory: '+str(x[0])+'\nFrameworks :'+','.join(x[1]) - print(string) - diff --git a/build/scripts-2.7/wappalyze.py b/build/scripts-2.7/wappalyze.py deleted file mode 100755 index 2f9da0e..0000000 --- a/build/scripts-2.7/wappalyze.py +++ /dev/null @@ -1,143 +0,0 @@ -import json -import re,argparse,os -import warnings -import pkg_resources -import requests -from bs4 import BeautifulSoup - -def _parse_webpage(url): - webpage={} - if not url.startswith('http'): - url='http://'+url - response = requests.get(url) - webpage['url'] = response.url - webpage['headers'] = response.headers - webpage['response'] = response.text - webpage['html'] = BeautifulSoup(response.text, 'html.parser') - webpage['scripts'] = [script['src'] for script in webpage['html'].findAll('script', src=True)] - webpage['metatags'] = {meta['name'].lower(): meta['content'] - for meta in webpage['html'].findAll('meta', attrs=dict(name=True, content=True))} - return webpage - -def _prepare_app(app): - - for key in ['url', 'html', 'script', 'implies']: - try: - value = app[key] - except KeyError: - app[key] = [] - else: - if not isinstance(value, list): - app[key] = [value] - - for key in ['headers', 'meta']: - try: - value = app[key] - except KeyError: - app[key] = {} - - obj = app['meta'] - if not isinstance(obj, dict): - app['meta'] = {'generator': obj} - - for key in ['headers', 'meta']: - obj = app[key] - app[key] = {k.lower(): v for k, v in obj.items()} - - for key in ['url', 'html', 'script']: - app[key] = [_prepare_pattern(pattern) for pattern in app[key]] - - for key in ['headers', 'meta']: - obj = app[key] - for name, pattern in obj.items(): - obj[name] = _prepare_pattern(obj[name]) - -def _prepare_pattern(pattern): - regex, _, rest = pattern.partition('\\;') - try: - return re.compile(regex, re.I) - except re.error as e: - warnings.warn( - "Caught '{error}' compiling regex: {regex}" - .format(error=e, regex=regex) - ) - # regex that never matches: - # http://stackoverflow.com/a/1845097/413622 - return re.compile(r'(?!x)x') - - -def _has_app(app, webpage): - for regex in app['url']: - if regex.search(webpage['url']): - return True - for name, regex in app['headers'].items(): - if name in webpage['headers']: - content = webpage['headers'][name] - if regex.search(content): - return True - for regex in app['script']: - for script in webpage['scripts']: - if regex.search(script): - return True - for name, regex in app['meta'].items(): - if name in webpage['metatags']: - content = webpage['metatags'][name] - if regex.search(content): - return True - for regex in app['html']: - if regex.search(webpage['response']): - return True - -def _get_implied_apps(detected_apps, apps1): - - def __get_implied_apps(detect, apps): - _implied_apps = set() - for detected in detect: - try: - _implied_apps.update(set(apps[detected]['implies'])) - except KeyError: - pass - return _implied_apps - - implied_apps = __get_implied_apps(detected_apps, apps1) - all_implied_apps = set() - - while not all_implied_apps.issuperset(implied_apps): - all_implied_apps.update(implied_apps) - implied_apps = __get_implied_apps(all_implied_apps, apps1) - - return all_implied_apps - - -def analyze(target): - url = target - webpage = _parse_webpage(url) - obj = json.loads(pkg_resources.resource_string(__name__, "apps.json")) - apps = obj['apps'] - detected = [] - for app_name, app in apps.items(): - _prepare_app(app) - if _has_app(app, webpage): - detected.append(app_name) - detected = set(detected).union(_get_implied_apps(detected, apps)) - category_wise = {} - for app_name in detected: - cats = apps[app_name]['cats'] - for cat in cats: - category_wise[app_name] = obj['categories'][str(cat)]['name'] - inv_map = {} - for k, v in category_wise.iteritems(): - inv_map[v] = inv_map.get(v, []) - inv_map[v].append(k) - return inv_map - - -if __name__ == '__main__': - ap = argparse.ArgumentParser() - ap.add_argument("-u", "--url", required=True,help="Please enter target Url") - args = vars(ap.parse_args()) - printing = analyze(args['url']) - for x in printing.items(): - string = '\nCategory: '+str(x[0])+'\nFrameworks :'+','.join(x[1]) - print(string) - diff --git a/dist/wappalyze-1.0-py2.7.egg b/dist/wappalyze-1.0-py2.7.egg deleted file mode 100644 index ab878f98557e3f715382b6c813745b0bcfbbfb95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7308 zcmeHMXH-+o+6^5Ioq!Y-L^>oOAW9XGULu{)dkLKYih%SQ1f&X5G!!Y)Ly@lZ-lQYa zJ19kp(muF%smOZo|L?~;Sf*I!A($ms72D2iDlt2X)g+1<{pG4ft-g8-Zhni z)yeLL%C8>(l!MM?h`Ex{weKIeMsn(WWbl?;VoJPPM>#SkZeG2&?DrZHbfc|SY%Bqrk?8V=4Fu z0dlj>4_K8~UyrK%e!$Q&w(JE+tH^4b*-Q(y`#99j4T z5BREvfgUiyAVd`LZVDw>^QY#Q(uZ53K=TmmBfeH7ztP&W#LK$wHr#VFb~++il=x8k%D1dU&CTiT z$i`v0C1`?Zlc^8;tW3|r;U46~&bhtV-WsN}W<^I#Kfb@aIPdkc1iH4w*!MhDh0Ynp z57yy>*S}orb!c;J+U~ZR^X0BXQ1>2WX8O0EU@8Aq*QIK#AeXax&Yi`1wSU)D?U9D+ zLn$?gi<=7&;p(#GI@GB&!wvUb?j4M!$yB4P&YZL>O1IuV&jp7O<8T z@u68MvOMLy#66+b+SWv}7=XXCjKLk@IeYN{XD=Y&#>Fhn%pJ|`&CKmhpBmc2?QNXT z)1AY-gsw4vE<${UB0LLoCC&^6D*|uEA3cN#oOh{K<$wzZkR8;Hs?$ zg1|Qlu3O9rXEYZAZcjZS;)-S!fFCMjG702$=`23J~ z6tcEYZzp_cE5Hz_vn6u>W$dnsEM;a>!J=!XROU*F5a{#`Sav6uNfz+fF+cNFAySW5 z-P9Ht8e<23o;o?Rs`(gGBsarHIrRBGLVs_c7eI%PP~kL;y*z!rtqLFpPHB7~K+8i9 z{v!eRWyrj%FHuwTgcf;#^uZ;yOr|L1BJZWXRzQ${p=1K zFf-kSYz(FMuu^!gPzK^=<#(hp>0f$RclX$zd@hy<{dAhHuNgbiV|vmD$TSe19WY-N z&nH#cYq)6YAUECDx2PYv;2%fZ2*k(zlF?^U2y=n1J!J%ca+asO!B6|){R;}``lzTC zQRM>5pABfwkB`h+6_LU0xL$!QS7?D5(qSyPPm=msCt7Z1Ld5UQf?_yZ7_!CROthH1 z1?mq{q(6C5|2~aUtbd^#Bxmp~DGk(h#Xs%=XDt>ZCq6dg43Z$aeg7S{A#8efUBuy@ zuF`UhvFF>SRRF>UA)ngyZHIGOfj-)!AaUkZ*eF?V_o<4^Sp74bD!bj+|;sVDs3w}M5+{5ZSnffxP>+k5P@(dNw{%L z%|J#U*CdEHJgmNEj6j>1?a;G2+_B+PKrTe(vSkeG)qtAums{}ns&nI{R%QKEmHQ?} z(#3o=HJrV{tr5|>*(z^0B3Gg%a>{+zab{Qp)3D>9vc)pR5tnP>-vCWzCf zB;wQ0b)h~8Aj1=9t7*}KtdHlIF+un|x^mOq3#eC=FWL!26#GX6!@O(uu&pG^Obi_O z$_aZXy`|-JXCyayzUs;AunG7Wsdcul!xGj~s=-8)>pRMM?pVGmV|V1h!b}<0AfFtq z{Fp$#Lg~2zgOk9mrRj2|638?GHK(M4w@pdA=8X~&2Z`$AF6xlhxu{Px4nMBpsjrH5 zHSdu$`pQ@?A8D_r-RheZou-W(o_XH26kt(gpsp>g7R>uR@enPx4YeN^89a_$RP7K3 zk=Oa%cJ{D+Jk$dy(bDoc)VBRP6$s++KusV^5_?7C{Tf#=?siG@2ev&B+raK1OdZ6C z1q7@UQZ+whN^={by-B^!A&yBjP`D)nKp))hjV9r9P91YiDsTIKSs= zE<;1OJ>136@NCjn;OOYpVErW-8f{(RHZFFRzRS|#4ZY=sJmYwO7U$CQk6fmvCtaOG zCRrp&T>uf{IE)HG#_SZi25w;;FBgKWQ5~2C0r02|vq=-wz)G zPzTT>!M>8Ja0@8XOI6;&Db&E;1mWcrSb*|PMTOc225Q$NhI(1MSBZWG93LEX)pSK4 zxYhb~kP*GHPx^cmJCLj{RHRSOi}7b9F3Z^8+5hgxzxwsBe*LRo|LWJj`t|=pzs@)N z`s2z&mRA4(i?bc!xrY6otN+?{n3lm5oM~H0ziJEP`!F6v%ieOQQeDR{d8jIHCH2-= zgp;j2Io5?bCoxyQeE7S#sGK=nSRo(k9`${RQ&lL>q!~LQ>T^ z87XfkT?Tsk?3v+~@OvC~!Q;Gx?fv!WXxbeWg=HUi zm+-qmQDs+1vuUNkE2j2-xDl_@?&L+Mu|F9Ykeh%?3sUF4;v5q#b)RorCeTO%RmkU4 z4?|+D5%hUCH^2kfW@^IfKT{t1Kj`Sd)Ig0FLhX`FnUaLpsFP4oW^p1l-;f$d(uN{v zyyJ(gpx&d71TQ}Fd*%1;DP7$#9_8nGD`FT-+C~y6xVm2z6=7lSlvUfm-yj=&Ck{%B z=f6s0+;>lc@hYuE6OmM!Io>1OUZP0D3Y{R#eMneAGfLqo-I3m8?UWj?N5bd}>mW^S zLBIZOy=ns)-6Wpw$KS+)AK$9yx9@lr!EX?VC2!ErZ@?8KJ~8DvgBLZn>=tgor&I6h zJU2Z2bGc{Z=SIHLq^Xd%N$%>6qnO$8U^jYN4lJdDP4do-XvTn7FkB zM0Eo7_gMOG0F7%b)Mtzv3)|dKp+uNF?3!PVvTu`z&b}IduQ;?2alK(V%85R{Sa-wU? z%5WAT| z`Gm|b>c>n9nb+wXu`2wAiN|sjquf=_(NooTV)4=H&r?USLW}~01mpLFLfrRZOx>Wz zg*#tYLKPzS;^EO2mb6*a?o{OE>Jrnzx%@we`_FbN&yHI z{elSl=j@eDStu^@1OQuGl&h1pNv=-vR;aF=@WKaRwGlkXZ?rrhJO=l)4a1ZDwV8R7``E|wNT(&icN^93n;oFA=TQ*>)gt_h6 z=R1O7THXs%1Xm*yQR;3bD*sWS4@uJXvk{dx#3YXAI}AgjOR;U#6WwN z?)$#!)ivR1{$x6%iA+fx8^jG0yCp-vtOfz}c?V?$iQM6>;JX_;STP>*G3eP8?|5xj z%t{loj=#$Ioq9G;w1UhevwS_|cI68D#_JS}O2+&V74cM)^48celMdlN;mj`$LRq$= zwMtG(G?M*AkqEj4mc~GzSp3uwI8JYqWz~Y_Q;el(H9XVUt?>;t%;ZUoAB)>9KfHuQ zUdQxuW!Ipe@8sW)PC*u{As>n=N2f4{l8+`ODKSfTFkJ7wW;n;@@eP4Zt?Yy0Doxxh zgr?N|at+o#U>3xI+IsFr#u+vY%kAIfmCn{oZP8Ao^^`sseq#^R%h%SN9*sxDTT0uf z3ebqmIOR;0kYNDWS{mh2rN0f_kIb>*V+#oolcKWLGs0wQsdb7N(Zch_qdy6^R&>%# zyCsvK7I&P*aClv*$SGb2$d|gryB+5eKcR7`W-_ysx2dhsXcP_KDWPBnS>qXagIBxUiO^UYymKiO(xato^RA*X%U+PU4yFvZ1z#I(CH`&9!QbpEcC zA3RBiv?+HJ)$LZVj_;_p)`HXDt=1r2$F}_JYatq+esY_nxFrN;h((u%T$-G`9D-O7pX29^_M9wd-H!NPA*dX<|nd_icW)4BvZaXCQyl_i`QCe^Uq@i_{HmRMqDIGI?hEc{7SM#EGBTLrj zyH~MHEjH;%VjMs_mCbXIn*rW+k3hVou^2CFaF0NSv4bK$3roMR!r+S$Sdjw^NYOL$L*E zEy)X!&D}e)b57zpvCCpX%u5lgR^tVHi_%)r!9qH?b6)Iu`S_E;pQYN>OKz8!aN*{E z@NcVZK>7tVAKGZ>o6m;r?cT6o=WrHZ9^VE&_jfc+k+G2@k(Tnok?xwr0Y_HHBH-?g zw6u@8F^E7~899O$Gg4tEtDS7xnbOXbRD4cXPEk8AunX&_rP7cIRct|%&|zNu476c3 zcb8-gwlG3oieCgW_^qy-l?qe>&8G}>+q^(29(rHo=D46NBp?@v$c0M~#>jU094@%! zdFMUv`)+zdtlzrjGoXh_+v}K(Vw*TH6G^P=_qxuyIbGaoul1wE*<`|{)5gW1x_Z*= zdu8I1x-vo7$8-+r0yuqzk!v?Y6GzSRa+q6>Z!+sDr5AkJ^X7wrl-EH;aKv+^qY0uhV~j z1wF^zc@q*Ro{S^!6Blw}NQ9_1$ks;pxxG)UnWDV1cfToM7mWke_)^XqlOK2lz;1-PlC;a5q69&VR z6aK&xQt&8;p*+TH6$fH}5e~!i&}Q_!ze!WO@U*+>k_!BH^v<`>dvoIMdL3L;BNbS{ zje$dTpvi6i0a4$7sggzp(*B6MPi|b?++CJ&mhd^kb|duLJLXs&-#69KFTQ>DgVSe^ z)+qbr;N6lu31mEV%nz|(N`oDifT|3BW2%G5RN*??WmYht0O7lw=sWpWAWX0QOzpzZTB zaQZ(UxQ0!s2TEC`pTWS-?cu{D=_TrDP1o$g*}C=AP1;T8!;3tRH*R{{ah@T+)=w>VthTK%l`5TRA!}^9m4y1g?4M1@i)?HHX3N(Aj>h7@`PUYJw;4 zxtr*0M8n3OFWvak(gx!jC5FmoyV-4&65Ft&_0pI6J63J#BBgZDkzM(NtD~EvGEIr} zBm%qmrf(vYGb$!_64}YsDqtRkRJ#V!gDC0ZD5o)z9nCY(dPyhpWd->Uur#Egy0xYY zk*&OT?HTq9uVT|X_#6Qv<~3Mp)hr_v=FL*JPT43uePRQj+h8!fNwY9PZ8B@6X&g_%Hh0&^XmnloW;sw~pqT7cnfx|>0)!vte6>d*(||*3uX@ebNHPRcx{c*pM#jN1`Hk$7n{59YJ_-QQGoEE(4+|`@Z>So!4e`xpkd+@CQ|et zpW~rPBhtmL{B-%1!IXbd`=;4G0@NxvfT6AY#j2l;%#d%FFgN&A@K=QbF^qv0g4aB0z;1Hpl)i*!Wb}yRo4XHWj28@0 ziqL?BQXJ=H^rjr;F?CJGV5CK25vo7Z7hMs_rFaAxa;R1QiZJvSsiLqL&naSOq_vpJ z{!^8GUdGrsC#`}UE%1(z0$tFR^ruMS=TqTxri#IBjRRY%Z=f@}Mf0w;T(29x3q5N( zs7I*8S*3%pjb6f1h+TaghAfG788>O_YWJcz1#*ACQA0B64U;-j3PaOzujYJ$#FWO7 z8s8$dn#QH@23Cb{lPO&l;@EB+Do|LsKXlnE2vj%UTm z^FhPhbME&p*d3_JfSrDJ* z30-|L4M0xfWDYU$63UpIDWXMDW3GTk!GrG&9ldBS5PWp$PSotyYL4oAi1%Ak@_V-Q ztMIe+l0GMAH&U}4u9pA}9KpBO>_-W7deBSuU1?o&`43UWLsU%w4?%@*v0=p+e$0lx zsMmbz?nt{I-Di_cus`-%dGknDLc{E9MP-}MkL$BiYVO9^zsxkH8QTQ2`GUBy* zn50=#>%Y{SQm?!(m0_jRi-&FdKBadhH1p71`hO{tU(8>{cQJn2OOxsnly@n@tdvU5Tk*)hlCf$Rjw^qB079n%@v$sE(;vNL{6XJsd=bRf+M zX-&$`q?mY2zQO@Hi8D$}Nj$E^w8U8@W+a|aVpifwCFaD=OPrJaK$7>34WzLkFTrF{ z?4mT5BnA^~pAow(F?P+#%OEiJoKBzT(wDf$idZmOk$7J6?61n;k=RvfT;Ph$-Mg}r zmv}+!cf^8N)K#nTlB~wd(zvLD=hDHQOJXm{C!hBIDdn~*ZM%3LTCD#I|F()yrTAGi zAKR$!>(Bem?M}a2%ap`#O0s>z7THzufEDAi9wJ7#ltL55%pqvj<4 zt3Z0c)s<6Hf@)zg9ylSo4F;MO4-3w5Gt@~I5|9f-#mXOj_^RudP4>Z(b->y?R1s>&oC za;oJ3OUChSbLkB<&@vRdds%f20Y&nZ)8Ik?hsf`7;VcB^M&(xRw7qS6J+&RRY-&^T zY<3Q8k}l-xwL7||WqnjcSF~{}pbnyLH)aT=p7gB}6skyL=~h+4fqmAEYBtnSD*jA&^mABQQM*+}9B5j10gaff znK!fg&Ej{(+{MTpqjuv7{M0-C2!9z^8VT+Iu*VsxW#Fe@(1?d~G$?GChf9>(7bW9G z_NOG-6k`lwuCt}yvOIwU!B2cZKXA*WYwB^>&3XKl2M-yB;3~BMC;Z^`6MFrV6aK&x zQa~w(zC6Kf83$s29!|vb(2nVOf04R&;XLo9OG@zR!TaAn@9j|t(Cgr$8uh>et_^Ie zQ;lx(H;DStE0xs7Anh&gKDlvzb9YIG83O4D+l|nd@0w$EeAko*Kl}FC>!;5itWoyS z!Mg={8pv?`m>=T9xCTHh0afb##*}-JDZ`z%i$v;H3OZsqq#YGQ^;Wl8w@#s$Vw_8B zwr!KhcM>%`VM>gt!(IoG>UZ~|3UD0vpr6Jmcf~?c&kPwYisTZ`pn(N|25n!Q39aN~~1GcNF>on`mhje=N-@3Og=NHhebQ23duy6+N zZPHG;QBDL0_0)ZPsC!;SO}HUvI?o!ax6u}j182H~=haV6!~qn@-9aNk-i(?Ux)kR9_pd-8DgR6s^gCdQJG$sNI z`MR$oc7KDWV8d6NcWO50?fOA7@J8ytf^ zlW9t{-J3=X33Y9N^oOX(;^(0{8jOm4FpI|A{C-xF`^Oy&=V3us9N?;P3}2z-RCuIG0a=krO9LwmJh)BkHZ*AgH4acgS7Cv!feq0IK+0FC8efEcj`Al8YH&D{?)YP_L%K*&&#(wHNl@|bdO0nsDS(D5k~F8WXK zm2rMrrfr3J@J@}u8#?RN82xS>c^h8lBt_A|*m_${t2wCBX>ndj6H`p(rnP6f%Eo6i z4okO61(nt*M!OV+^^d?;XW_SRpq(^nZh8;Hqx9kWU6i~i)9B_JI8>-(5mKROJxcfe zu*98=@27-jbcmYGQv#e#cvj}G$^J_Wrm_dQ+`P#JOOSmzs4|=KN)$(dw2l#25*Z*h z9xMh#!SjF<MML|j-C7~vEG3aT1J8^8;N3L?Q^Ls5mN3Gwi*2A`}9Cs;8YO>mO| z_(8$kV3K^sdZUq(BkaIj?=!()8LGrE1{w%$Go%5<(V64=vYM2^V~%g`uFDWFA|Mxm z1BoX;%*o(wIm%(`nhe263(P!>a5P1hc_g9y5oE}s&iONf)SskWhwRge;z?=XkxAKq zsIt$<5F4kZF)v56yd$JQ7j!B8$y4~5RQRkZV{lue#Fk?MqK(%YuG0=bKu=tSBkd?G9<0j2+%}x}jxbE)PD#$mTeo{r&Vaz)2Rh&`dnUiR#6VermM2K$3yX55kq4DoJ zX7py^hg>s>21lp>8YLC^qkA4!4(iT^gqa?O;k1fuzo@jLZg`QrE}=Oa&L?g`HJE09}#M}6G7#g{8*6Wi<8 z6C0~7_H483c;U~RHgdLr_oGb;sWu9~NSaz4>$`SpBQ@&by#g==vH0|x`f&n_9CVU> zSGcFe!uRlWz(pC#!bfc0L6fR4sp<1d3zm)x*EstL8#=Zs?wPx*?>)szYT&C}Kr5>) zLk8&ZG1t>{>q)KOg2 Date: Sat, 6 Jul 2019 12:56:36 +0530 Subject: [PATCH 3/9] edit readme --- README.md | 5 +++++ setup.py | 4 ++-- wappalyze/wappalyze.py | 7 +++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9597353..138a1ee 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,8 @@ Run: ## Running the script To run the script, the following command is to be used: `python wappalyze.py` + + +Install from pip + +pip install wappalyze \ No newline at end of file diff --git a/setup.py b/setup.py index f95b6bb..b6844ac 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ install_requires = f.read().splitlines() setuptools.setup( name="wappalyze", - version="1.0", + version="1.1", author="Syed Abuthahir", author_email="developerabu@gmail.com", description="Framework Identifier tool", @@ -21,7 +21,7 @@ url="https://github.com/abuvanth/framework-identifier", packages=setuptools.find_packages(), package_dir={'wappalyze': 'wappalyze'}, - package_data={'wappalyze': ['app.json']}, + package_data={'wappalyze': ['apps.json']}, install_requires=install_requires, scripts=['wappalyze/wappalyze.py'], classifiers=[ diff --git a/wappalyze/wappalyze.py b/wappalyze/wappalyze.py index 2f9da0e..d443736 100644 --- a/wappalyze/wappalyze.py +++ b/wappalyze/wappalyze.py @@ -1,10 +1,13 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- import json import re,argparse,os import warnings import pkg_resources import requests from bs4 import BeautifulSoup - +BASE_DIRECTORY = os.path.split(__file__)[0] +app_path = os.path.join(BASE_DIRECTORY,"apps.json") def _parse_webpage(url): webpage={} if not url.startswith('http'): @@ -112,7 +115,7 @@ def __get_implied_apps(detect, apps): def analyze(target): url = target webpage = _parse_webpage(url) - obj = json.loads(pkg_resources.resource_string(__name__, "apps.json")) + obj = json.loads(open(app_path,'r').read()) apps = obj['apps'] detected = [] for app_name, app in apps.items(): From 2860779201e5bdd3a7113a486a24a9788d32ea1e Mon Sep 17 00:00:00 2001 From: syed abuthahir Date: Sat, 6 Jul 2019 13:06:06 +0530 Subject: [PATCH 4/9] edit readme --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 138a1ee..08dab79 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,9 @@ To run the script, the following command is to be used: Install from pip -pip install wappalyze \ No newline at end of file +pip install wappalyze + +# Usage + +wappalyze.py -u google.com + From 080ceac5e209ed99941a02e8856745490a239982 Mon Sep 17 00:00:00 2001 From: syed abuthahir Date: Sat, 6 Jul 2019 13:35:06 +0530 Subject: [PATCH 5/9] edit Setup file --- README.md | 7 +++++++ setup.py | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 08dab79..e76644f 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,10 @@ pip install wappalyze wappalyze.py -u google.com +# Use as a module + +import wappalyzer + +result wappalyzer.analyze('google.com') + +print(result) \ No newline at end of file diff --git a/setup.py b/setup.py index b6844ac..343fef9 100644 --- a/setup.py +++ b/setup.py @@ -12,13 +12,13 @@ install_requires = f.read().splitlines() setuptools.setup( name="wappalyze", - version="1.1", - author="Syed Abuthahir", - author_email="developerabu@gmail.com", + version="1.2", + author="Shaddy Garg", + author_email="shaddygarg1@gmail.com", description="Framework Identifier tool", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/abuvanth/framework-identifier", + url="https://github.com/shaddygarg/framework-identifier", packages=setuptools.find_packages(), package_dir={'wappalyze': 'wappalyze'}, package_data={'wappalyze': ['apps.json']}, From 3399538455b2a6d478cf50c2673c40d945d58db5 Mon Sep 17 00:00:00 2001 From: syed abuthahir Date: Sat, 6 Jul 2019 13:36:27 +0530 Subject: [PATCH 6/9] edit readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e76644f..eec3ddf 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ wappalyze.py -u google.com # Use as a module -import wappalyzer +import wappalyze -result wappalyzer.analyze('google.com') +result wappalyze.analyze('google.com') print(result) \ No newline at end of file From 7844d939e22c5430fe88d856fcc2bb4540760399 Mon Sep 17 00:00:00 2001 From: syed abuthahir Date: Sat, 6 Jul 2019 13:37:21 +0530 Subject: [PATCH 7/9] edit readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eec3ddf..cfdc766 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,6 @@ wappalyze.py -u google.com import wappalyze -result wappalyze.analyze('google.com') +result = wappalyze.analyze('google.com') print(result) \ No newline at end of file From b1a83a1e3198ea9ca8de1444038e8df161ec9ba4 Mon Sep 17 00:00:00 2001 From: syed abuthahir Date: Sat, 6 Jul 2019 14:16:44 +0530 Subject: [PATCH 8/9] Fixes --- .DS_Store | Bin 6148 -> 6148 bytes README.md | 2 +- setup.py | 4 ++-- wapp | 7 +++++++ wappalyze/__main__.py | 2 ++ wappalyze/wappalyze.py | 7 ++++--- 6 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 wapp create mode 100644 wappalyze/__main__.py diff --git a/.DS_Store b/.DS_Store index 24ff59d51446d73da24aba347815cee64a887aba..bc484c790303c038ba889f17146a4dce2b040cf2 100644 GIT binary patch delta 27 jcmZoMXfc@J&&a Date: Sat, 6 Jul 2019 18:55:07 +0530 Subject: [PATCH 9/9] bug fixes --- .DS_Store | Bin 6148 -> 6148 bytes wappalyze/.DS_Store | Bin 6148 -> 6148 bytes wappalyze/__init__.py | 2 +- wappalyze/__init__.pyc | Bin 148 -> 0 bytes wappalyze/__main__.py | 4 ++-- 5 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 wappalyze/__init__.pyc diff --git a/.DS_Store b/.DS_Store index bc484c790303c038ba889f17146a4dce2b040cf2..04a7446f28de48e5ac6af43e2aa8322015445727 100644 GIT binary patch delta 224 zcmZoMXfc@J&nU1lU^g?Pz+@g4$v7rv3kC)T76v_rbcRfZlH7b3m!zEhB%l~ahoR&y z?~H?vsPZXzF|iz&+{h|EIhcLR!~%`Y>>Pjj0S(7AbpQYW diff --git a/wappalyze/.DS_Store b/wappalyze/.DS_Store index b35f7628659aff99dc849c9216f23af3106eeb22..fd5c91b9d7dca128734eed748eace3c1fad8b881 100644 GIT binary patch delta 248 zcmZoMXfc=|#>B`mu~2NHo}wrV0|Nsi1A_nqLncEBLp%`bF%(R^xV#=D!3`G3WXMC7 zWT^Da$xlwo$xi~R0P15{3B(%z!2rmD>B?nD1nSCz8HuioQ5>jp29hpLp!xzJECxCt zi=kMJA)g@+)grJKWQ%wh!Z%I|XWPuq!OsEo(Z-A4nJ4p$=<CJzu~2NHo}wrt0|NsP3otMwGUPB+GE_07GU!b#RA&cC@Gz8b-oO~n rw)q329OGto4t@@x#?22IzcWwf7t!SeDLDYd43lkmq<iEMW!!y;2mO diff --git a/wappalyze/__init__.py b/wappalyze/__init__.py index 29391ef..5091c86 100644 --- a/wappalyze/__init__.py +++ b/wappalyze/__init__.py @@ -1 +1 @@ -from wappalyze import * \ No newline at end of file +from Wappalyze import * \ No newline at end of file diff --git a/wappalyze/__init__.pyc b/wappalyze/__init__.pyc deleted file mode 100644 index 73dc54861522abfaafe674934b87bf3b3c8a4ac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmZSn%*)kcrx2UW00m4y+5w1*`G7