| skipped 1 lines |
2 | 2 | | Maigret main module |
3 | 3 | | """ |
4 | 4 | | |
| 5 | + | import aiohttp |
5 | 6 | | import asyncio |
6 | 7 | | import csv |
7 | 8 | | import http.cookiejar as cookielib |
| skipped 2 lines |
10 | 11 | | import os |
11 | 12 | | import platform |
12 | 13 | | import re |
| 14 | + | import requests |
13 | 15 | | import ssl |
14 | 16 | | import sys |
| 17 | + | import tqdm.asyncio |
| 18 | + | import xmind |
| 19 | + | from aiohttp_socks import ProxyConnector |
15 | 20 | | from argparse import ArgumentParser, RawDescriptionHelpFormatter |
16 | 21 | | from http.cookies import SimpleCookie |
17 | | - | |
18 | | - | import aiohttp |
19 | | - | from aiohttp_socks import ProxyConnector |
| 22 | + | from mock import Mock |
20 | 23 | | from python_socks import _errors as proxy_errors |
21 | | - | import requests |
22 | | - | import tqdm.asyncio |
23 | | - | from mock import Mock |
24 | | - | from socid_extractor import parse, extract |
| 24 | + | from socid_extractor import parse, extract, __version__ as socid_version |
25 | 25 | | |
26 | 26 | | from .activation import ParsingActivator |
27 | 27 | | from .notify import QueryNotifyPrint |
| 28 | + | from .report import save_csv_report, save_xmind_report, save_html_report, save_pdf_report, \ |
| 29 | + | generate_report_context, save_txt_report |
28 | 30 | | from .result import QueryResult, QueryStatus |
29 | 31 | | from .sites import MaigretDatabase, MaigretSite |
30 | | - | from .report import save_csv_report, genxmindfile, save_html_pdf_report |
31 | | - | |
32 | | - | import xmind |
33 | 32 | | |
34 | 33 | | __version__ = '0.1.10' |
35 | 34 | | |
| skipped 481 lines |
517 | 516 | | return timeout |
518 | 517 | | |
519 | 518 | | |
520 | | - | async def site_self_check(site, logger, semaphore, db: MaigretDatabase, no_progressbar=False): |
| 519 | + | async def site_self_check(site, logger, semaphore, db: MaigretDatabase, silent=False): |
521 | 520 | | query_notify = Mock() |
522 | 521 | | changes = { |
523 | 522 | | 'disabled': False, |
| skipped 55 lines |
579 | 578 | | if changes['disabled'] != site.disabled: |
580 | 579 | | site.disabled = changes['disabled'] |
581 | 580 | | db.update_site(site) |
582 | | - | action = 'Disabled' if not site.disabled else 'Enabled' |
583 | | - | print(f'{action} site {site.name}...') |
| 581 | + | if not silent: |
| 582 | + | action = 'Disabled' if not site.disabled else 'Enabled' |
| 583 | + | print(f'{action} site {site.name}...') |
584 | 584 | | |
585 | 585 | | return changes |
586 | 586 | | |
587 | 587 | | |
588 | | - | async def self_check(db: MaigretDatabase, site_data: dict, logger): |
| 588 | + | async def self_check(db: MaigretDatabase, site_data: dict, logger, silent=False): |
589 | 589 | | sem = asyncio.Semaphore(10) |
590 | 590 | | tasks = [] |
591 | 591 | | all_sites = site_data |
| skipped 4 lines |
596 | 596 | | disabled_old_count = disabled_count(all_sites.values()) |
597 | 597 | | |
598 | 598 | | for _, site in all_sites.items(): |
599 | | - | check_coro = site_self_check(site, logger, sem, db) |
| 599 | + | check_coro = site_self_check(site, logger, sem, db, silent) |
600 | 600 | | future = asyncio.ensure_future(check_coro) |
601 | 601 | | tasks.append(future) |
602 | 602 | | |
| skipped 9 lines |
612 | 612 | | message = 'Enabled' |
613 | 613 | | total_disabled *= -1 |
614 | 614 | | |
615 | | - | print(f'{message} {total_disabled} checked sites. Run with `--info` flag to get more information') |
| 615 | + | if not silent: |
| 616 | + | print(f'{message} {total_disabled} checked sites. Run with `--info` flag to get more information') |
616 | 617 | | |
617 | 618 | | |
618 | 619 | | async def main(): |
619 | | - | version_string = f"%(prog)s {__version__}\n" + \ |
620 | | - | f"{requests.__description__}: {requests.__version__}\n" + \ |
621 | | - | f"Python: {platform.python_version()}" |
| 620 | + | version_string = '\n'.join([ |
| 621 | + | f'%(prog)s {__version__}', |
| 622 | + | f'Socid-extractor: {socid_version}', |
| 623 | + | f'Aiohttp: {aiohttp.__version__}', |
| 624 | + | f'Requests: {requests.__version__}', |
| 625 | + | f'Python: {platform.python_version()}', |
| 626 | + | ]) |
622 | 627 | | |
623 | 628 | | parser = ArgumentParser(formatter_class=RawDescriptionHelpFormatter, |
624 | 629 | | description=f"Maigret v{__version__}" |
| skipped 2 lines |
627 | 632 | | action="version", version=version_string, |
628 | 633 | | help="Display version information and dependencies." |
629 | 634 | | ) |
630 | | - | parser.add_argument("--info", |
| 635 | + | parser.add_argument("--info", "-vv", |
631 | 636 | | action="store_true", dest="info", default=False, |
632 | 637 | | help="Display service information." |
633 | 638 | | ) |
| skipped 1 lines |
635 | 640 | | action="store_true", dest="verbose", default=False, |
636 | 641 | | help="Display extra information and metrics." |
637 | 642 | | ) |
638 | | - | parser.add_argument("-d", "--debug", |
| 643 | + | parser.add_argument("-d", "--debug", "-vvv", |
639 | 644 | | action="store_true", dest="debug", default=False, |
640 | 645 | | help="Saving debugging information and sites responses in debug.txt." |
641 | 646 | | ) |
642 | | - | parser.add_argument("--folderoutput", "-fo", dest="folderoutput", default="reports", |
643 | | - | help="If using multiple usernames, the output of the results will be saved to this folder." |
644 | | - | ) |
645 | | - | parser.add_argument("--csv", |
646 | | - | action="store_true", dest="csv", default=False, |
647 | | - | help="Create Comma-Separated Values (CSV) File." |
648 | | - | ) |
649 | | - | parser.add_argument("--html", |
650 | | - | action="store_true", dest="html", default=False, |
651 | | - | help="Create HTML report file." |
652 | | - | ) |
653 | 647 | | parser.add_argument("--site", |
654 | 648 | | action="append", metavar='SITE_NAME', |
655 | 649 | | dest="site_list", default=[], |
| skipped 59 lines |
715 | 709 | | dest="tags", default='', |
716 | 710 | | help="Specify tags of sites." |
717 | 711 | | ) |
718 | | - | |
719 | | - | parser.add_argument("-x","--xmind", |
| 712 | + | # reports options |
| 713 | + | parser.add_argument("--folderoutput", "-fo", dest="folderoutput", default="reports", |
| 714 | + | help="If using multiple usernames, the output of the results will be saved to this folder." |
| 715 | + | ) |
| 716 | + | parser.add_argument("-T", "--txt", |
| 717 | + | action="store_true", dest="txt", default=False, |
| 718 | + | help="Create a TXT report (one report per username)." |
| 719 | + | ) |
| 720 | + | parser.add_argument("-C", "--csv", |
| 721 | + | action="store_true", dest="csv", default=False, |
| 722 | + | help="Create a CSV report (one report per username)." |
| 723 | + | ) |
| 724 | + | parser.add_argument("-H", "--html", |
| 725 | + | action="store_true", dest="html", default=False, |
| 726 | + | help="Create an HTML report file (general report on all usernames)." |
| 727 | + | ) |
| 728 | + | parser.add_argument("-X","--xmind", |
720 | 729 | | action="store_true", |
721 | 730 | | dest="xmind", default=False, |
722 | | - | help="Generate an xmind 8 mindmap" |
| 731 | + | help="Generate an XMind 8 mindmap report (one report per username)." |
723 | 732 | | ) |
724 | | - | |
725 | 733 | | parser.add_argument("-P", "--pdf", |
726 | 734 | | action="store_true", |
727 | 735 | | dest="pdf", default=False, |
728 | | - | help="Generate a pdf report" |
| 736 | + | help="Generate a PDF report (general report on all usernames)." |
729 | 737 | | ) |
730 | 738 | | |
731 | 739 | | args = parser.parse_args() |
| skipped 70 lines |
802 | 810 | | else: |
803 | 811 | | print('Updates will be applied only for current search session.') |
804 | 812 | | |
| 813 | + | # Make reports folder is not exists |
| 814 | + | os.makedirs(args.folderoutput, exist_ok=True) |
| 815 | + | report_path = args.folderoutput |
| 816 | + | |
| 817 | + | # Define one report filename template |
| 818 | + | report_filepath_tpl = os.path.join(args.folderoutput, 'report_{username}{postfix}') |
| 819 | + | |
805 | 820 | | # Database consistency |
806 | 821 | | enabled_count = len(list(filter(lambda x: not x.disabled, site_data.values()))) |
807 | 822 | | print(f'Sites in database, enabled/total: {enabled_count}/{len(site_data)}') |
| skipped 47 lines |
855 | 870 | | logger=logger, |
856 | 871 | | forced=args.use_disabled_sites, |
857 | 872 | | ) |
| 873 | + | |
| 874 | + | username_result = (username, id_type, results) |
858 | 875 | | general_results.append((username, id_type, results)) |
859 | 876 | | |
860 | | - | if args.folderoutput: |
861 | | - | # The usernames results should be stored in a targeted folder. |
862 | | - | # If the folder doesn't exist, create it first |
863 | | - | os.makedirs(args.folderoutput, exist_ok=True) |
864 | | - | result_path = os.path.join(args.folderoutput, f"{username}.") |
865 | | - | else: |
866 | | - | result_path = os.path.join("reports", f"{username}.") |
| 877 | + | # TODO: tests |
| 878 | + | for website_name in results: |
| 879 | + | dictionary = results[website_name] |
| 880 | + | # TODO: fix no site data issue |
| 881 | + | if not dictionary: |
| 882 | + | continue |
| 883 | + | new_usernames = dictionary.get('ids_usernames') |
| 884 | + | if new_usernames: |
| 885 | + | for u, utype in new_usernames.items(): |
| 886 | + | usernames[u] = utype |
867 | 887 | | |
| 888 | + | # reporting for a one username |
868 | 889 | | if args.xmind: |
869 | | - | genxmindfile(result_path+"xmind", username, results) |
| 890 | + | filename = report_filepath_tpl.format(username=username, postfix='.xmind') |
| 891 | + | save_xmind_report(filename, username, results) |
| 892 | + | print(f'XMind report for {username} saved in {filename}') |
870 | 893 | | |
| 894 | + | if args.csv: |
| 895 | + | filename = report_filepath_tpl.format(username=username, postfix='.csv') |
| 896 | + | save_csv_report(filename, username, results) |
| 897 | + | print(f'CSV report for {username} saved in {filename}') |
871 | 898 | | |
872 | | - | with open(result_path+"txt", "w", encoding="utf-8") as file: |
873 | | - | exists_counter = 0 |
874 | | - | for website_name in results: |
875 | | - | dictionary = results[website_name] |
876 | | - | # TODO: fix no site data issue |
877 | | - | if not dictionary: |
878 | | - | continue |
879 | | - | new_usernames = dictionary.get('ids_usernames') |
880 | | - | if new_usernames: |
881 | | - | for u, utype in new_usernames.items(): |
882 | | - | usernames[u] = utype |
| 899 | + | if args.txt: |
| 900 | + | filename = report_filepath_tpl.format(username=username, postfix='.txt') |
| 901 | + | save_txt_report(filename, username, results) |
| 902 | + | print(f'TXT report for {username} saved in {filename}') |
883 | 903 | | |
884 | | - | if dictionary.get("status").status == QueryStatus.CLAIMED: |
885 | | - | exists_counter += 1 |
886 | | - | file.write(dictionary["url_user"] + "\n") |
887 | | - | file.write(f"Total Websites Username Detected On : {exists_counter}") |
888 | | - | file.close() |
| 904 | + | # reporting for all the result |
| 905 | + | report_context = generate_report_context(general_results) |
| 906 | + | # determine main username |
| 907 | + | username = report_context['username'] |
889 | 908 | | |
890 | | - | if args.csv: |
891 | | - | save_csv_report(username, results, result_path+"csv") |
| 909 | + | if args.html: |
| 910 | + | filename = report_filepath_tpl.format(username=username, postfix='.html') |
| 911 | + | save_html_report(filename, report_context) |
| 912 | + | print(f'HTML report on all usernames saved in {filename}') |
892 | 913 | | |
893 | | - | pathPDF = None |
894 | | - | pathHTML = None |
895 | | - | if args.html: |
896 | | - | pathHTML = result_path+"html" |
897 | | - | if args.pdf: |
898 | | - | pathPDF = result_path+"pdf" |
| 914 | + | if args.pdf: |
| 915 | + | filename = report_filepath_tpl.format(username=username, postfix='.pdf') |
| 916 | + | save_pdf_report(filename, report_context) |
| 917 | + | print(f'PDF report on all usernames saved in {filename}') |
899 | 918 | | |
900 | | - | if pathPDF or pathHTML: |
901 | | - | save_html_pdf_report(general_results,pathHTML,pathPDF) |
902 | 919 | | |
| 920 | + | # update database |
903 | 921 | | db.save_to_file(args.json_file) |
904 | 922 | | |
905 | 923 | | |
| skipped 10 lines |