From ead113d956ed1fb72f669b0107e5679be33bbf37 Mon Sep 17 00:00:00 2001 From: Datalux Date: Thu, 20 Aug 2020 11:25:52 +0200 Subject: [PATCH 1/8] fix: changed banner output --- src/Osintgram.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Osintgram.py b/src/Osintgram.py index 5f051829..204f14b2 100644 --- a/src/Osintgram.py +++ b/src/Osintgram.py @@ -88,10 +88,11 @@ def __get_comments__(self, media_id): def __printTargetBanner__(self): pc.printout("\nLogged as ", pc.GREEN) pc.printout(self.api.username, pc.CYAN) - pc.printout(" (" + str(self.api.authenticated_user_id) + ") ") - pc.printout("target: ", pc.GREEN) + pc.printout(". Target: ", pc.GREEN) pc.printout(str(self.target), pc.CYAN) - pc.printout(" (private: " + str(self.is_private) + ")") + pc.printout(" [" + str(self.target_id) + "] ") + if self.is_private: + pc.printout("[PRIVATE PROFILE]", pc.RED) print('\n') def change_target(self): From 959814ed349fdf61ceac9454c58b10edf1c8ff50 Mon Sep 17 00:00:00 2001 From: Datalux Date: Fri, 21 Aug 2020 17:02:52 +0200 Subject: [PATCH 2/8] feat: added cached login --- src/Osintgram.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/Osintgram.py b/src/Osintgram.py index 5f051829..cf96931a 100644 --- a/src/Osintgram.py +++ b/src/Osintgram.py @@ -2,9 +2,13 @@ import json import sys import urllib +import os +import codecs from geopy.geocoders import Nominatim from instagram_private_api import Client as AppClient +from instagram_private_api import ClientCookieExpiredError, ClientLoginRequiredError + from prettytable import PrettyTable from src import printcolors as pc @@ -25,7 +29,7 @@ def __init__(self, target, is_file, is_json): u = self.__getUsername__() p = self.__getPassword__() print("\nAttempt to login...") - self.api = AppClient(auto_patch=True, authenticate=True, username=u, password=p) + self.login(u, p) self.setTarget(target) self.writeFile = is_file self.jsonDump = is_json @@ -907,3 +911,50 @@ def set_json_dump(self, flag): pc.printout("\n") self.jsonDump = flag + + def login(self, u, p): + try: + settings_file = "config/settings.json" + if not os.path.isfile(settings_file): + # settings file does not exist + print('Unable to find file: {0!s}'.format(settings_file)) + + # login new + self.api = AppClient(auto_patch=True, authenticate=True, username=u, password=p, + on_login=lambda x: self.onlogin_callback(x, settings_file)) + + else: + with open(settings_file) as file_data: + cached_settings = json.load(file_data, object_hook=self.from_json) + #print('Reusing settings: {0!s}'.format(settings_file)) + + # reuse auth settings + self.api = AppClient( + username=u, password=p, + settings=cached_settings, + on_login=lambda x: self.onlogin_callback(x, settings_file)) + + except (ClientCookieExpiredError, ClientLoginRequiredError) as e: + print('ClientCookieExpiredError/ClientLoginRequiredError: {0!s}'.format(e)) + + # Login expired + # Do relogin but use default ua, keys and such + self.api = AppClient(auto_patch=True, authenticate=True, username=u, password=p, + on_login=lambda x: self.onlogin_callback(x, settings_file)) + + def to_json(self, python_object): + if isinstance(python_object, bytes): + return {'__class__': 'bytes', + '__value__': codecs.encode(python_object, 'base64').decode()} + raise TypeError(repr(python_object) + ' is not JSON serializable') + + def from_json(self, json_object): + if '__class__' in json_object and json_object['__class__'] == 'bytes': + return codecs.decode(json_object['__value__'].encode(), 'base64') + return json_object + + def onlogin_callback(self, api, new_settings_file): + cache_settings = api.settings + with open(new_settings_file, 'w') as outfile: + json.dump(cache_settings, outfile, default=self.to_json) + #print('SAVED: {0!s}'.format(new_settings_file)) From 961e8b5dfd3aed2f4c1695f8e86c0594e2646a4c Mon Sep 17 00:00:00 2001 From: Datalux Date: Sat, 22 Aug 2020 11:09:22 +0200 Subject: [PATCH 3/8] chore: added ClientError exception handler --- src/Osintgram.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Osintgram.py b/src/Osintgram.py index cf96931a..c9903238 100644 --- a/src/Osintgram.py +++ b/src/Osintgram.py @@ -7,7 +7,7 @@ from geopy.geocoders import Nominatim from instagram_private_api import Client as AppClient -from instagram_private_api import ClientCookieExpiredError, ClientLoginRequiredError +from instagram_private_api import ClientCookieExpiredError, ClientLoginRequiredError, ClientError from prettytable import PrettyTable @@ -942,6 +942,10 @@ def login(self, u, p): self.api = AppClient(auto_patch=True, authenticate=True, username=u, password=p, on_login=lambda x: self.onlogin_callback(x, settings_file)) + except ClientError as e: + print('ClientError {0!s} (Code: {1:d}, Response: {2!s})'.format(e.msg, e.code, e.error_response)) + exit(9) + def to_json(self, python_object): if isinstance(python_object, bytes): return {'__class__': 'bytes', From 85e390b6fb6558929c0dc1f32eb25b563b5fb7c5 Mon Sep 17 00:00:00 2001 From: Datalux Date: Wed, 26 Aug 2020 11:31:17 +0200 Subject: [PATCH 4/8] fix: error handler --- src/Osintgram.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Osintgram.py b/src/Osintgram.py index c9903238..669688a9 100644 --- a/src/Osintgram.py +++ b/src/Osintgram.py @@ -943,7 +943,10 @@ def login(self, u, p): on_login=lambda x: self.onlogin_callback(x, settings_file)) except ClientError as e: - print('ClientError {0!s} (Code: {1:d}, Response: {2!s})'.format(e.msg, e.code, e.error_response)) + #pc.printout('ClientError {0!s} (Code: {1:d}, Response: {2!s})'.format(e.msg, e.code, e.error_response), pc.RED) + error = json.loads(e.error_response) + pc.printout(error['message'], pc.RED) + pc.printout("\n") exit(9) def to_json(self, python_object): From 44b7534c237b925f723dbebbbd5fc75f90e7f475 Mon Sep 17 00:00:00 2001 From: Datalux Date: Wed, 26 Aug 2020 11:41:24 +0200 Subject: [PATCH 5/8] fix: likes and comments posts counter --- src/Osintgram.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Osintgram.py b/src/Osintgram.py index a9e7bb97..bc8a17ca 100644 --- a/src/Osintgram.py +++ b/src/Osintgram.py @@ -245,6 +245,7 @@ def get_total_comments(self): for post in data: comments_counter += post['comment_count'] + posts += 1 if self.writeFile: file_name = "output/" + self.target + "_comments.txt" @@ -493,6 +494,7 @@ def get_total_likes(self): for post in data: like_counter += post['like_count'] + posts += 1 if self.writeFile: file_name = "output/" + self.target + "_likes.txt" From 75b23d7bd5b364f1f1ad6622baf13b032aca37f1 Mon Sep 17 00:00:00 2001 From: Datalux Date: Wed, 26 Aug 2020 11:46:58 +0200 Subject: [PATCH 6/8] chore: updated version --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 434b0c58..c90a6333 100644 --- a/main.py +++ b/main.py @@ -15,7 +15,7 @@ def printlogo(): pc.printout("\_______ /____ >__|___| /__| \___ /|__| (____ /__|_| /\n", pc.YELLOW) pc.printout(" \/ \/ \/ /_____/ \/ \/ \n", pc.YELLOW) print('\n') - pc.printout("Version 0.6 - Developed by Giuseppe Criscione - 2019\n\n", pc.YELLOW) + pc.printout("Version 0.7 - Developed by Giuseppe Criscione - 2019\n\n", pc.YELLOW) pc.printout("Type 'list' to show all allowed commands\n") pc.printout("Type 'FILE=y' to save results to files like '_.txt (deafult is disabled)'\n") pc.printout("Type 'FILE=n' to disable saving to files'\n") From c2c3c3e5f758c168a9418206cb4b296ae7b5f31e Mon Sep 17 00:00:00 2001 From: Datalux Date: Wed, 26 Aug 2020 11:51:06 +0200 Subject: [PATCH 7/8] feat: added CTRL+C handler --- main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/main.py b/main.py index c90a6333..942c1888 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,7 @@ import argparse from src import printcolors as pc import sys +import signal def printlogo(): @@ -63,6 +64,13 @@ def cmdlist(): print("Get a list of user who commented target's photos") +def signal_handler(sig, frame): + pc.printout("\nGoodbye!\n", pc.RED) + sys.exit(0) + + +signal.signal(signal.SIGINT, signal_handler) + printlogo() parser = argparse.ArgumentParser(description='Osintgram is a OSINT tool on Instagram. It offers an interactive shell ' From 0515130742b5fdc937575af5935ad4b3dc5bee7a Mon Sep 17 00:00:00 2001 From: Datalux Date: Wed, 26 Aug 2020 12:04:07 +0200 Subject: [PATCH 8/8] doc: update docs --- changelog.md => CHANGELOG.md | 13 +++++++++++++ README.md | 6 +++--- 2 files changed, 16 insertions(+), 3 deletions(-) rename changelog.md => CHANGELOG.md (78%) diff --git a/changelog.md b/CHANGELOG.md similarity index 78% rename from changelog.md rename to CHANGELOG.md index 2413a11e..11e9c9e4 100644 --- a/changelog.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [0.7](https://github.com/Datalux/Osintgram/releases/tag/0.7) + +**Enhancements** +- banner now show target ID (#30) +- persistent login (#33) +- error handler (85e390b) +- added CTRL+C handler (c2c3c3e) + +**Bug fixes** +- fix likes and comments posts counter bug (44b7534) + + + ## [0.6](https://github.com/Datalux/Osintgram/releases/tag/0.6) **Enhancements** diff --git a/README.md b/README.md index 913b2f4c..9172cf49 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![](https://img.shields.io/badge/version-0.6-green)](https://github.com/Datalux/Osintgram/releases/tag/0.6) +[![](https://img.shields.io/badge/version-0.7-green)](https://github.com/Datalux/Osintgram/releases/tag/0.7) [![](https://img.shields.io/badge/license-GPLv3-blue)](https://img.shields.io/badge/license-GPLv3-blue) [![](https://img.shields.io/badge/language-Python3-red)](https://img.shields.io/badge/language-Python3-red) @@ -30,8 +30,8 @@ Osintgram offers an interactive shell to perform analysis on Instagram account o ``` You can find detailed commands usage [here](commands.md). -[**Latest version**](https://github.com/Datalux/Osintgram/releases/tag/0.6) | -[CHANGELOG](changelog.md) +[**Latest version**](https://github.com/Datalux/Osintgram/releases/tag/0.7) | +[CHANGELOG](CHANGELOG.md) ## Tools