def create_client(self): """Creates and returns a TelegramClient""" loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) api_id = secrets.get_var('API_ID') api_hash = secrets.get_var('API_HASH') # TODO # proxy=(socks.SOCKS5, '127.0.0.1', 4444) if LOCALHOST: session = 'karim/bot/persistence/{}'.format(self.user_id) else: session_string = os.environ.get('session:{}'.format(self.user_id)) if not session_string: try: # Falling Back to RedisSession print('LOADING REDIS SESSION') connector = redis.from_url(os.environ.get('REDIS_URL')) string = connector.get('session:{}'.format(self.user_id)) print('SESSION STRING OUTPUTTED') if string: # Session is stored in Redis decoded_string = string.decode("utf-8") session = StringSession(decoded_string) else: session = StringSession() connector.close() except Exception as error: # No Session Error print('Error in session_manager.create_client(): ', error) raise error else: try: session = StringSession(session_string) except Exception as error: print('Error in session_manager.create_client(): ', error) raise error try: client = TelegramClient(session, api_id, api_hash, loop=loop) #proxy = proxy except Exception as error: print('Error in session_manager.create_client(): ', error) raise error print('TELEGRAM CLIENT WITH SESSION CREATED') return client
def report_error(self, error=None, send_screenshot=False, screenshot_name=''): string = str(secrets.get_var('DEVS')).replace('[', '') string = string.replace(']', '') string = string.replace(' ', '') devs = list(string.split(',')) for dev in devs: if send_screenshot: self.send_photo(chat_id=int(dev), photo=open('{}.png'.format(screenshot_name), 'rb'), caption='There was an error with the Karim Luman bot: \n{}'.format(error)) else: self.send_message(chat_id=int(dev), text='There was an error with the Karim Luman bot: \n{}'.format(error))
def request_code(self): client = self.create_client() client.connect() print('SENT CODE TO PHONE') #if not request_again: try: sent_code = client( functions.auth.SendCodeRequest( phone_number=self.phone, api_id=int(secrets.get_var('API_ID')), api_hash=secrets.get_var('API_HASH'), settings=types.CodeSettings(allow_flashcall=True, current_number=True, allow_app_hash=True))) except PhoneNumberFloodError as error: print('Error in session_manager.request_code(): ', error) raise error except PhonePasswordFloodError as error: print('Error in session_manager.request_code(): ', error) raise error except PhonePasswordProtectedError as error: print('Error in session_manager.request_code(): ', error) raise error except Exception as error: print('Error in session_manager.request_code(): ', error) raise error """ else: try: sent_code = client(ResendCodeRequest(self.phone, self.phone_code_hash)) except PhoneNumberInvalidError as error: print('Error in session_manager.request_code(): ', error) raise error except Exception as error: print('Error in session_manager.request_code(): ', error) raise error """ print('SENT CODE REQUEST!') self.phone_code_hash = sent_code.phone_code_hash self.code_tries += 1 client.disconnect() return sent_code
def auth(): creds_string = secrets.get_var('GSPREAD_CREDS') if creds_string == None: # use creds to create a client to interact with the Google Drive API scope = [ 'https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/drive.file', 'https://www.googleapis.com/auth/drive' ] # CREDENTIALS HAVE NOT BEEN INITIALIZED BEFORE client_secret = os.environ.get('GCLIENT_SECRET') if LOCALHOST: # CODE RUNNING LOCALLY print('DATABASE: Resorted to local JSON file') with open('karim/secrets/client_secret.json') as json_file: client_secret_dict = json.load(json_file) else: # CODE RUNNING ON SERVER client_secret_dict = json.loads(client_secret) creds = ServiceAccountCredentials.from_json_keyfile_dict( client_secret_dict, scope) creds_string = jsonpickle.encode(creds) secrets.set_var('GSPREAD_CREDS', creds_string) creds = jsonpickle.decode(creds_string) client = gspread.authorize(creds) # IF NO SPREADSHEET ENV VARIABLE HAS BEEN SET, SET UP NEW SPREADSHEET if secrets.get_var('SPREADSHEET') == None: spreadsheet = set_sheet(client) return spreadsheet else: SPREADSHEET = secrets.get_var('SPREADSHEET') spreadsheet = client.open_by_key(SPREADSHEET) return spreadsheet
def error(update, context): """Log the error and send a telegram message to notify the developer.""" # Log the error before we do anything else, so we can see it even if something breaks. logger.error(msg="Exception while handling an update:", exc_info=context.error) # traceback.format_exception returns the usual python message about an exception, but as a # list of strings rather than a single string, so we have to join them together. tb_list = traceback.format_exception(None, context.error, context.error.__traceback__) tb = ''.join(tb_list) # Build the message with some markup and additional information about what happened. # You might need to add some logic to deal with messages longer than the 4096 character limit. message = ('<b>An exception was raised while handling an update</b>\n' '<pre>{}</pre>').format(html.escape(tb)) # Finally, send the message devs = secrets.get_var('DEVS') for dev in devs: context.bot.send_message(chat_id=dev, text=message, parse_mode=ParseMode.HTML)
def set_sheet(client: Client): """ Setup spreadsheet database if none exists yet. Will save the spreadsheet ID to Heroku Env Variables or to secrets.json file The service email you created throught the Google API will create the new spreadsheet and share it with the email you indicated in the GDRIVE_EMAIL enviroment variable. You will find the spreadsheet database in your google drive shared folder. Don't change the order of the worksheets or it will break the code. :param client: GSpread client to utilize :type client: Client :return: The newly created spreadsheet :rtype: Spreadsheet """ # CREATE SPREADSHEET spreadsheet: Spreadsheet = client.create('KARIM NEWSLETTER') secrets.set_var('SPREADSHEET', spreadsheet.id) # CREATE GROUP CHATS SHEET subscribers = spreadsheet.add_worksheet(title="Subscribers", rows="150", cols="1") scraped = spreadsheet.add_worksheet(title='IG Scraped', rows='150', cols='3') # CREATE LOGS SHEET logs = spreadsheet.add_worksheet(title="Logs", rows="500", cols="3") logs.append_row(["TIMESTAMP", "USER ID", "ACTION"]) # DELETE PRE-EXISTING SHEET sheet = spreadsheet.get_worksheet(0) spreadsheet.del_worksheet(sheet) # SHARE SPREADSHEET spreadsheet.share(value=secrets.get_var('GDRIVE_EMAIL'), perm_type="user", role="owner") return spreadsheet
LOCALHOST = True queue = None if os.environ.get('PORT') in (None, ""): # Code running locally LOCALHOST = True if not os.path.exists('karim/bot/persistence'): os.makedirs('karim/bot/persistence') else: LOCALHOST = False queue = Queue(connection=conn) # Initialize Bot from karim.secrets import secrets BOT_TOKEN = secrets.get_var('BOT_TOKEN', localhost=LOCALHOST) URL = secrets.get_var('SERVER_APP_DOMAIN', localhost=LOCALHOST) PORT = int(os.environ.get('PORT', 5000)) from karim.bot import telebot # set connection pool size for bot request = Request(con_pool_size=8) q = mq.MessageQueue(all_burst_limit=3, all_time_limit_ms=3000) telegram_bot = MQBot(BOT_TOKEN, request=request, mqueue=q) updater = Updater(bot=telegram_bot, use_context=True) # SET UP BOT COMMAND HANDLERS telebot.setup(updater)