from webwhatsapi.objects.message import Message, MediaMessage ## Que puede hacer el bot ## logging.basicConfig(filename='logfile.txt', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logging.info('PCBot WhatsApp_Bot Iniciando....') try: os.environ["SELENIUM"] except KeyError: print ("Please set the environment variable SELENIUM to Selenium URL") sys.exit(1) ## Carga Driver y conecta con Whatsapp Web ## driver = WhatsAPIDriver(client='remote', command_executor=os.environ["SELENIUM"]) #, profile='/home/aplicaciones/.mozilla/firefox/81yyy19w.whatsapp') status = driver.get_status() if status == "NotLoggedIn" or status == "Unknown": logging.info('No esta logueado') driver.get_qr() logging.info('Esperando codigo QR') driver.wait_for_login() else: logging.info('Ya esta logueado') # driver.save_firefox_profile(remove_old=True) ## Driver subio, carga diccionarios internos ## # driver.send_message_to_id(id_whatsapp_soporte,'Bot Iniciando....') # logging.info('Actualizacion inicial data helpdesk iniciada....') # driver.send_message_to_id(id_whatsapp_soporte,'Actualizacion data helpdesk iniciada....') # apphd = helpdesk(usuario=api_helpdesk_usuario, clave=api_helpdesk_clave, authenticate_url=api_helpdesk_url_authenticate) # data_helpdesk = apphd.maestros(api_helpdesk_url)
driver = WhatsAPIDriver(client='remote', command_executor=os.environ["SELENIUM"]) print("Waiting for QR") qr = qrtools.QR() qr.decode("horn.png") data = qr.decode(driver.get_qr()) print(data) # prints "Version 2" driver.wait_for_login() print("Bot started") while True: time.sleep(3) print 'Checking for more messages, status', driver.get_status() for contact in driver.get_unread(): for message in contact.messages: print(json.dumps(message.get_js_obj(), indent=4)) print 'class', message.__class__.__name__ print 'message', message print 'id', message.id print 'type', message.type print 'timestamp', message.timestamp print 'chat_id', message.chat_id print 'sender', message.sender print 'sender.id', message.sender.id print 'sender.safe_name', message.sender.get_safe_name() if message.type == 'chat': print '-- Chat' print 'safe_content', message.safe_content
print("Waiting for QR") driver.wait_for_login() print("Bot started") start_time = datetime.datetime.now() try: while True: time.sleep(3) # Checks for new messages every 3 secs. pinger = pinger + 1 if (pinger % 600) == 0: # Notification every 30 min. (600 * 3 sec = 1800 sec) pinger = 0 send_message_to_master( "Resetting counter to {pingcount}. Driver status is '{status}'".format( pingcount=pinger, status=driver.get_status() ) ) print( "Checking for more messages, status. Pinger={pingcount}".format( pingcount=pinger ), driver.get_status(), ) for contact in driver.get_unread(include_me=True, include_notifications=True): for message in contact.messages: print(json.dumps(message.get_js_obj(), indent=4)) # Log full JSON to general log f = open("generallog.log", "a+", encoding="utf-8") f.write( "\n\n==========================================================================\nMessage received at {timestamp}\n".format(
def runReminder(): from webwhatsapi import WhatsAPIDriver print("Environment", os.environ) try: os.environ["SELENIUM"] except KeyError: print("Please set the environment variable SELENIUM to Selenium URL") sys.exit(1) from PIL import Image from resizeimage import resizeimage ##Save session on "/firefox_cache/localStorage.json". ##Create the directory "/firefox_cache", it's on .gitignore ##The "app" directory is internal to docker, it corresponds to the root of the project. ##The profile parameter requires a directory not a file. from pyzbar.pyzbar import decode dir_path = os.path.dirname(os.path.realpath(__file__)) print(")(AFYN)(ANY*FU(A*UKFA(E*FU*****************************)))") print(")(AFYN)(ANY*FU(A*UKFA(E*FU*****************************)))") print(")(AFYN)(ANY*FU(A*UKFA(E*FU*****************************)))") print(")(AFYN)(ANY*FU(A*UKFA(E*FU*****************************))),", dir_path) returned_value = os.system('export PATH="' + dir_path + ':$PATH"') # returns the exit code in unix profiledir = os.path.join(".", "firefox_cache") if not os.path.exists(profiledir): os.makedirs(profiledir) driver = WhatsAPIDriver(profile=profiledir, client="remote", command_executor=os.environ["SELENIUM"]) profiledir = os.path.join(".", "firefox_cache") if not os.path.exists(profiledir): os.makedirs(profiledir) driver = WhatsAPIDriver(profile=profiledir, client="remote", command_executor=os.environ["SELENIUM"]) import timg obj = timg.Renderer() print("Waiting for QR") driver.wait_for_login() print("Saving session") # from qrtools import qrtools # from PIL import Image # import zbarlight # qr = qrtools.QR() # # from PIL import Image # import os # import numpy as np # import pyboof as pb # # pb.init_memmap() #Optional # # class QR_Extractor: # # Src: github.com/lessthanoptimal/PyBoof/blob/master/examples/qrcode_detect.py # def __init__(self): # self.detector = pb.FactoryFiducial(np.uint8).qrcode() # # def extract(self, img_path): # if not os.path.isfile(img_path): # print('File not found:', img_path) # return None # image = pb.load_single_band(img_path, np.uint8) # self.detector.detect(image) # qr_codes = [] # for qr in self.detector.detections: # qr_codes.append({ # 'text': qr.message, # 'points': qr.bounds.convert_tuple() # }) # return qr_codes # qr_scanner = QR_Extractor() print("AAA") c = 0 s = 60 status = "NotLoggedIn" while status is not "LoggedIn": c += 1 print("status", status) # print("Checking qr, status", driver.get_status()) print("AAAAAAAAAAAAA") # img = driver.get_qr("static/img/newQR.png") im_path = os.path.join("newQR.png") pathlib.Path().absolute() os.system("cp newQR.png sample/static/img/newQR.png") img = driver.get_qr("newQR.png") # from PIL import Image print("BBBBBBBBBBBBBBB") decoded = decode(Image.open(im_path)) # print(decoded, "#######################") # print(decoded, "#######################") # print(decoded, "#######################") # print(decoded, "#######################") # print(decoded, "#######################") # print(decoded, "#######################") # print(decoded, "#######################") for barcode in decoded: print("@@@@@@@@@@@@@@@@@@@") # the barcode data is a bytes object so if we want to draw it # on our output image we need to convert it to a string first barcodeData = barcode.data.decode("utf-8") barcodeType = barcode.type # draw the barcode data and barcode type on the image text = "{} ({})".format(barcodeData, barcodeType) print(text) print("@@@@@@@@@@@@@@@@@@@") printQR(barcodeData) print("@@@@@@@@@@@@@@@@@@@X") status = driver.get_status() # output = qr_scanner.extract(img) # print(output,"!!!!!!!!!!!!!!!!WDIOUSICNOIUCJ)(Z*UCINJ)(ZP*DFJYUF)((P*SUD)(UASIDMUJ))") # print(qr.decode(img)) # print(qr.data) # print("BBBB2") # with open(img, 'r+b') as f: # with Image.open(f) as image: # cover = resizeimage.resize_cover(image, [57, 57]) # cover.save(img, image.format) # # # qr.decode(img) # print (qr.data) # print(retval,"!!!!!!!!!!!!!!!!!!!") # # print("CCC",img) # obj.load_image_from_file(img) # obj.resize(s,s) # s-=1 # print(obj) # obj.render(timg.Ansi24HblockMethod) # print("DDD",s,s,s,s) # time.sleep(10) # driver.save_firefox_profile(remove_old=False) # time.sleep(3) # try: # driver.reload_qr() # except: # print("refresh finised") print("Bot started") while True: time.sleep(.71) print("Checking for more messages, status", driver.get_status()) for contact in driver.get_unread(): for message in contact.messages: print(json.dumps(message.get_js_obj(), indent=4)) sender = message.get_js_obj( )["chat"]["contact"]["formattedName"] for contact in driver.get_contacts(): # print("CCCC",contact.get_safe_name() ) if sender in contact.get_safe_name(): chat = contact.get_chat() chat.send_message("Hi " + sender + " !!!*" + message + "*") print() print() print(sender) print() print() print("class", message.__class__.__name__) print("message", message) print("id", message.id) print("type", message.type) print("timestamp", message.timestamp) print("chat_id", message.chat_id) print("sender", message.sender) print("sender.id", message.sender.id) print("sender.safe_name", message.sender.get_safe_name()) if message.type == "chat": print("-- Chat") print("safe_content", message.safe_content) print("content", message.content) # contact.chat.send_message(message.safe_content) elif message.type == "image" or message.type == "video": print("-- Image or Video") print("filename", message.filename) print("size", message.size) print("mime", message.mime) print("caption", message.caption) print("client_url", message.client_url) message.save_media("./") else: print("-- Other")
print("Please set the environment variable SELENIUM to Selenium URL") sys.exit(1) profiledir = os.path.join(".", "firefox_cache") if not os.path.exists(profiledir): os.makedirs(profiledir) driver = WhatsAPIDriver(profile=profiledir, client="remote", command_executor=os.environ["SELENIUM"]) print("Waiting for QR") driver.wait_for_login() print("Saving session") driver.save_firefox_profile(remove_old=False) print("Bot started") while True: time.sleep(3) print("Checking for more messages, status", driver.get_status()) for contact in driver.get_unread(): for message in contact.messages: if isinstance(message, Message): # Currently works for text messages only. new_contact = sh_action.addShContact(chat_id=message.sender.id, phone="хуй там пока что") if new_contact: msgs = sh_action.getMsgFromShBot() for msg in msgs: contact.chat.send_message(msg) time.sleep(0.100 * len(msg))
class Master(object): shares = [] db = { "masters":["972512170493", "972547932000"], "users":{"id":{"services":{"groupID":None}}}, "services":{"Reminders":{"dbID":None,"incomingTarget":None},"Proxy":{"dbID":None,"incomingTarget":None},"Danilator":{"dbID":None,"incomingTarget":None}}, "groups": {"id":"service"}, "id":"*****@*****.**"} services = {} ''' start master driver and log in ''' def __init__(self, profileDir = "/app/session/rprofile2"): Master.shares.append(self) self.db = Master.db # self.services = ServiceLoader.LoadServices(self) self.status = "INIT" self.lastQR = 0 self.driver = None self.masterService = None asyncInit = Thread(target = self.initAsync,args = [profileDir]) asyncInit.start() def initAsync(self, profileDir = "/app/session/rprofile2"): ''' init driver variables ''' if len(Master.shares) > 1: profileDir += "-"+str(len(Master.shares)) chrome_options = webdriver.ChromeOptions() chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36") chrome_options.add_argument("user-data-dir="+profileDir); chrome_options.add_argument('--profile-directory='+profileDir) if not runLocal: self.driver = WhatsAPIDriver(profile = profileDir, client='chrome', chrome_options=chrome_options,username="******") else: self.driver = WhatsAPIDriver(username="******",profile=None) driver = self.driver ''' RUNNING MASTER SERVICE ''' self.masterService = MasterService(runLocal, self.db, self.services, self.driver, self) print(''' ::: waiting for login ::: ''') driver.wait_for_login() try: self.status = status = driver.get_status() except Exception as e: print(" ::: ERROR - Status Init ::: ","\n",e,e.args,"\n") ''' preping for qr ''' if status is not "LoggedIn": img = None triesCount = 0 maxtries = 40 while status is not "LoggedIn" and triesCount < maxtries: triesCount+=1 print("-------------------------------") print("status:",status,"tries:",triesCount,"/",maxtries) print("-------------------------------") self.lastQR += 1 try: img = driver.get_qr("static/img/QR"+str(self.lastQR)+".png") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ",str(img)[17:130]) except Exception as e: print(" ::: ERROR - QR Fetching ::: ","\n",e,e.args,"\n") # im_path = os.path.join("static/img/newQR.png") print(''' ::: rechecking status ::: ''') try: self.status = status = driver.get_status() except Exception as e : self.status = status = "XXXXXXXX" print(" ::: ERROR - Status Fetching ::: ","\n",e,e.args,"\n") if status is "LoggedIn": print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::: ::::: ''') print(''' :::: MASTER IS LOGGED IN! ::::: ''') print(''' :::: ::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') # if runLocal: # self.driver.save_firefox_profile(remove_old=False) ''' load DB ''' ## overwrite to init db initOverwrite = True if initOverwrite: self.backup(now = True) # driver.updateDB(self.db,number=self.db["id"]) lastDB = self.loadDB() self.db = lastDB self.db["init"] = time.time() self.db["backupInterval"] = 10*60 if runLocal: self.db["backupInterval"] = 0 self.db["backupDelay"] = 10 if runLocal: self.db["backupDelay"] = 3 self.db["lastBackup"] = 0 self.db["lastBackupServices"] = 0 self.backup() print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::: ::::: ''') print(''' :::: DATABASE LOADED ::::: ''') print(''' :::: ::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(self.db) print() self.services = ServiceLoader.LoadServices(self.send, self.backupService) self.initServicesDB() print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::: ::::: ''') print(''' :::: SERVICES LOADED ::::: ''') print(''' :::: ::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(self.services) print() # # ''' Load Services ''' # # print("SSSSSSSSSSSSSSSSSSSSs") # self.LoadServices() # # print("SSSSSSSSSSSSSSSSSSSSs") ''' process incoming ''' process = Thread(target = self.ProcessIncoming, args=[None]) process.start() else: print(" ::: ERROR - COULD NOT LOG IN ::: ","\n") def send(self, api, service, target, content): print("!!!!!!!!!!!!") if service in self.services: if self.services[service]["api"] is api: if target in self.db["groups"] and service.lower() == self.db["groups"][target].lower(): return self.driver.sendMessage(target,content) def Process(self,contact): for message in contact.messages: print("MMMMMMMMMM",message) if runLocal: chatID = message.chat_id["_serialized"] else: chatID = message.chat_id try: chat = self.driver.get_chat_from_id(chatID) except Exception as e: print(" ::: ERROR - _serialized chatID ::: "+chatID+" ::: ","\n",e,e.args,"\n") ''' incoming from: ''' ''' Personal Chat ''' senderName = message.get_js_obj()["chat"]["contact"]["formattedName"] senderID = message.sender.id fromGroup = False if "c" in chatID: ''' SEND TO MASTER SERVICE ''' self.masterService.Process(message) # # print( # ''' # =================================== # Incoming Messages from '''+senderID+" "+senderName+''' # =================================== # ''' # ) # if message.type == "chat": # text = message.content # # print("TTTTTXXXXXXXXXTTTTTTT",text) # ''' subscribe to service ''' # # ''' SENT FROM GROUP CHAT ''' # # if "%%%!%%%" in text: # target = text.split(u"%%%!%%%")[1] # self.driver.sendMessage(chatID,"Adding Service to DB: "+target) # self.db["services"][target] = {"dbID":None,"incomingTarget":None} # self.LoadServices() # # self.serviceFuncs["services"][target] = None # # self.backup(now = True) # else: # print("XXXXXXXXXXXXXXXXXXX") # print("XXXXXXXXXXXXXXXXXXX") # print("XXXXXXXXXXXXXXXXXXX") # # if text[0] is "=": # ''' person registering service with =''' # target = text[1:] # dbChanged = False # now = False # # ''' check target service in db ''' # serviceFound = False # for service in self.services: # print("______________ ----------"+service) # print("") # if not serviceFound and target.lower() == service.lower(): # target = service # ''' service found ''' # serviceFound = True # # if chatID not in self.db["users"]: # self.db["users"][chatID] = {} # dbChanged = True # ''' first time user ''' # # self.db["users"][senderID] = {'services': {'Reminders': {'groupID': None}}} # else: # pass # ''' known user ''' # # # foundChat = None # if service in self.db["users"][chatID]: # # serviceChat = self.db["users"][chatID][service] # # # self.driver.sendMessage(senderID,"You are already subscirbed to: "+target+" \nYou can unsubscribe with -"+target.lower()) # if serviceChat is not None: # try: # foundChat = self.driver.get_chat_from_id(serviceChat) # except: # print('chat could not be found') # # # chatName = target # welcome = "Thank you for Subscribing to "+target # try: # chatName = self.services[service]["obj"].name # welcome = "Thank you for Subscribing to "+chatName # welcome = self.services[service]["obj"].welcome # except: # pass # # if foundChat is not None: # check_participents = False # if check_participents: # if senderID in foundChat.get_participants_ids() or True: # '''##### check that user is participant ''' # self.driver.sendMessage(senderID,"You are already subscirbed to: "+chatName+" \nYou can unsubscribe with -"+target.lower()) # self.driver.sendMessage(serviceChat,"subscirbed to: "+chatName) # else: # foundChat = None # else: # self.driver.sendMessage(senderID,"You are already subscirbed to:\n"+chatName+" \n<Link>\nYou can unsubscribe with -"+target.lower()) # self.driver.sendMessage(serviceChat,"subscirbed to: "+chatName) # # # ''' create new group ''' # if foundChat is None: # groupName = service # if service in self.services and "obj" in self.services[service] and self.services[service]["obj"] is not None: # groupName = self.services[service]["obj"].name # # newGroup = self.driver.newGroup(newGroupName = groupName, number = "+"+senderID.split("@")[0], local = runLocal) # newGroupID = newGroup.id # self.newG = newGroupID # # self.db["users"][chatID][service] = newGroupID # self.db["groups"][newGroupID] = target # dbChanged = True # now = True # print( # ''' # =============================================== # ''' + senderID +" is NOW SUBSCRIBED TO "+ target +" :D "+''' # =============================================== # ''' # ) # # self.driver.sendMessage(senderID,"Thank you! you are now subscribed to: "+chatName+" \n<Link>\nPlease check your new group :)") # self.driver.sendMessage(newGroupID,welcome) # # self.driver.sendMessage(serviceChat,"subscirbed to: "+target) # # if not serviceFound: # self.driver.sendMessage(chatID,target+" : is not recognized as a service "+target) # print( # ''' # =============================================== # SERVICE '''+ target +" IS NOT AVAILABLE"+''' # =============================================== # ''' # ) # if dbChanged: # self.backup(now=now) # ''' Group Chat ''' elif "g" in chatID: fromGroup = True print( ''' =============================================== Incoming Messages in Group \"'''+senderName+" from "+senderID+''' =============================================== ''' ) if message.type == "chat": text = message.content ''' GOT REGISTRATION COMMAND ''' if text[0] is "=": foundService = None target = text[1:] ''' register group to service ''' for service in self.services: if target.lower() == service.lower(): foundService = service foundChat = False if chatID in self.db["groups"]: targetService = self.db["groups"][chatID] print("TTTTTTTTTTTTTTTTTTTT") print(targetService, service) if targetService is not None: if targetService.lower() == service.lower(): foundChat = True self.driver.sendMessage(chatID,"You are already subscirbed to: "+target+" \nYou can unsubscribe with -"+target.lower()) if not foundChat: print("SSSSSSSSSSSSSSSSSSSSSSsxxxxx") print("SSSSSSSSSSSSSSSSSSSSSSsxxxxx") print("SSSSSSSSSSSSSSSSSSSSSSsxxxxx") self.driver.sendMessage(chatID,"Subscribing to service: "+service) self.db["groups"][chatID] = service self.backup() if foundService is None: self.driver.sendMessage(chatID,"service: "+target+" Not Found") ''' Chat is not registered first time''' if chatID not in self.db["groups"]: # print("SSSSSSSSSSSSSSSSSSSSSS") self.driver.sendMessage(chatID,"This chat is not registered with any service yet\nYou can register it by sending =service_name") # print("JJJJJJJJJJJJJJ") self.db["groups"][chatID] = None # print("SSSSSSSSSSSSSSSSSSSSSS") self.backup() if self.db["groups"][chatID] is not None: ''' Chat is known ''' target = self.db["groups"][chatID] print("MMMMMMMMMMMMMMMM",target) ''' adding new user to service from group''' foundService = None for service in self.services: if target.lower() == service.lower(): foundService = service ''' CHAT IS REGISTERED TO SERVICE! ''' ''' PROCESS INCOMNG MESSAGE in SERVICE ''' if foundService is not None and text[0] is not "=": ''' this is where the magic happens - send to service''' if "obj" in self.services[foundService]: obj = self.services[foundService]["obj"] if obj is not None: #Get Nicknames self.ProcessServiceAsync(obj,{"origin":chatID, "user":senderID, "content":text}) # obj.process({"origin":chatID, "user":senderID, "content":text}) # self.ProcessServiceAsync(service,chatID,text) if foundService is None: self.driver.sendMessage(chatID,target+" : is not recognized as a service "+target) def ProcessIncoming(self, data): print( ''' =================================== Processing Incoming Messages =================================== ''' ) lastm = None loopc = 0 delay = 0.5 while True: # try: if True: if loopc % 20 == 0: ''' ::: rechecking status ::: ''' try: self.status = status = self.driver.get_status() print(" ::: status is",status,"::: ") except Exception as e: self.status = status = "XXXXXXXX" print(" ::: ERROR - Status Fetching ::: ","\n",e,e.args,"\n") ''' all unread messages ''' for contact in self.driver.get_unread(): self.Process(contact) ''' lastm = message print(json.dumps(message.get_js_obj(), indent=4)) for contact in self.driver.get_contacts(): # print("CCCC",contact.get_safe_name() ) if sender in contact.get_safe_name(): chat = contact.get_chat() # chat.send_message("Hi "+sender+" !!!*"+message.content+"*") print() print() print(sender) print() print() print("class", message.__class__.__name__) print("message", message) print("id", message.id) print("type", message.type) print("timestamp", message.timestamp) print("chat_id", message.chat_id) print("sender", message.sender) print("sender.id", message.sender.id) print("sender.safe_name", message.sender.get_safe_name()) if message.type == "chat": print("-- Chat") print("safe_content", message.safe_content) print("content", message.content) # Manager.process(message.sender.id,message.content) # contact.chat.send_message(message.safe_content) elif message.type == "image" or message.type == "video": print("-- Image or Video") print("filename", message.filename) print("size", message.size) print("mime", message.mime) print("caption", message.caption) print("client_url", message.client_url) message.save_media("./") else: print("-- Other type:",str(message.type)) print("PROCESSING MESSAGE:",message) ''' else: pass # except Exception as e: # print(" ::: ERROR - CHECKING MESSAGES ::: ","\n",e,e.args,"\n") loopc += 1; loopc = loopc % 120 time.sleep(delay) # class Master0(object): # print( # ''' # ::::::::::::::::::::::::::::::::: # ::::::::::::::::::::::::::::::::: # :::: :::: # :::: MASTER DRIVER :::: # :::: :::: # ::::::::::::::::::::::::::::::::: # ::::::::::::::::::::::::::::::::: # ''' # ) def initServicesDB(self): for service in self.services: # try: if True: if "servicesDB" not in self.db: self.db["servicesDB"] = {} if service not in self.db["servicesDB"]: self.db["servicesDB"][service] = {} if "dbID" not in self.db["servicesDB"][service]: self.db["servicesDB"][service]["dbID"] = None dbID = self.db["servicesDB"][service]["dbID"] ''' create new db group ''' db = {} if dbID is None: print("-------------------------------") print(" CREATING NEW DB GROUP "+service) print("-------------------------------") groupName = service newGroup = self.driver.newGroup(newGroupName = service+"_DB", number = "+"+self.db["masters"][1], local = runLocal) newGroupID = newGroup.id self.db["servicesDB"][service]["dbID"] = newGroupID db = {"init":True} self.driver.sendMessage(newGroupID, json.dumps(db)) self.backup() else: db = self.loadDB(dbID) print("-------------------------------") print("service: ",service," dbID: ",dbID) print("-------------------------------") print(db) # while() self.services[service]["obj"].updateDB(db) # except Exception as e: else: print(" ::: ERROR - LOAD SERVICES ::: ","\n",e,e.args,"\n") def LoadServices0(self): # load list of services for service in self.db["services"]: if "reminders".lower() == service.lower(): print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") ReminderService.go(sendDelegate=self.driver.sendMessage,backupDelegate=self.backupService) self.serviceFuncs["services"][service]=ReminderService.process groupName = "🔔 Reminders 🔔" self.serviceGroupNames[service] = groupName self.db["services"][service]["welcome"] = ReminderService.welcome self.db["services"][service]["groupName"] = groupName # self.serviceGroupNames[service] = "Reminders" if "danilator".lower() == service.lower(): print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") print("FFFFFFFFFFFFFFFFFFFFFFFFFFF") DanilatorService.go(sendDelegate=self.driver.sendMessage,backupDelegate=self.backupService) self.serviceFuncs["services"][service]=DanilatorService.process groupName = "💚 Danilator 💚" self.serviceGroupNames[service] = groupName self.db["services"][service]["welcome"] = DanilatorService.welcome self.db["services"][service]["groupName"] = groupName # self.serviceGroupNames[service] = "Danilator" try: if "dbID" not in self.db["services"][service]: self.db["services"][service]["dbID"] = None dbID = self.db["services"][service]["dbID"] ''' create new db group ''' if dbID is None: print("-------------------------------") print(" CREATING NEW DB GROUP "+service) print("-------------------------------") groupName = service newGroup = self.driver.newGroup(newGroupName = service+"_DB", number = "+"+self.db["masters"][1], local = runLocal) newGroupID = newGroup.id self.db["services"][service]["dbID"] = newGroupID self.driver.sendMessage(newGroupID, json.dumps({"init":True})) self.backup() else: print("-------------------------------") print("service: ",service," dbID: ",dbID) print("-------------------------------") except Exception as e: print(" ::: ERROR - LOAD SERVICES ::: ","\n",e,e.args,"\n") def initAsync0(self, profileDir = "/app/session/rprofile2"): ''' init driver variables ''' if len(Master.shares) > 1: profileDir += "-"+str(len(Master.shares)) chrome_options = webdriver.ChromeOptions() chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") chrome_options.add_argument("--headless") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36") chrome_options.add_argument("user-data-dir="+profileDir); chrome_options.add_argument('--profile-directory='+profileDir) if not runLocal: self.driver = WhatsAPIDriver(profile = profileDir, client='chrome', chrome_options=chrome_options,username="******") else: self.driver = WhatsAPIDriver(username="******",profile=None) driver = self.driver self.masterService = MasterService(runLocal, self.db, self.services, self.driver, self) print(''' ::: waiting for login ::: ''') driver.wait_for_login() try: self.status = status = driver.get_status() except Exception as e: print(" ::: ERROR - Status Init ::: ","\n",e,e.args,"\n") ''' preping for qr ''' if status is not "LoggedIn": img = None triesCount = 0 maxtries = 40 while status is not "LoggedIn" and triesCount < maxtries: triesCount+=1 print("-------------------------------") print("status:",status,"tries:",triesCount,"/",maxtries) print("-------------------------------") self.lastQR += 1 try: img = driver.get_qr("static/img/QR"+str(self.lastQR)+".png") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ") print("QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ",str(img)[17:130]) except Exception as e: print(" ::: ERROR - QR Fetching ::: ","\n",e,e.args,"\n") # im_path = os.path.join("static/img/newQR.png") print(''' ::: rechecking status ::: ''') try: self.status = status = driver.get_status() except Exception as e : self.status = status = "XXXXXXXX" print(" ::: ERROR - Status Fetching ::: ","\n",e,e.args,"\n") if status is "LoggedIn": print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::: ::::: ''') print(''' :::: MASTER IS LOGGED IN! ::::: ''') print(''' :::: ::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') # if runLocal: # self.driver.save_firefox_profile(remove_old=False) ''' load DB ''' ## overwrite to init db initOverwrite = False if initOverwrite: self.backup(now = True) # driver.updateDB(self.db,number=self.db["id"]) lastDB = self.loadDB() self.db = lastDB self.db["init"] = time.time() self.db["backupInterval"] = 10*60 if runLocal: self.db["backupInterval"] = 0 self.db["backupDelay"] = 10 if runLocal: self.db["backupDelay"] = 3 self.db["lastBackup"] = 0 self.db["lastBackupServices"] = 0 self.backup() print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::: ::::: ''') print(''' :::: DATABASE LOADED ::::: ''') print(''' :::: ::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(''' :::::::::::::::::::::::::::::::::::: ''') print(self.db) print() # ''' Load Services ''' # print("SSSSSSSSSSSSSSSSSSSSs") self.LoadServices() # print("SSSSSSSSSSSSSSSSSSSSs") ''' process incoming ''' process = Thread(target = self.ProcessIncoming, args=[None]) process.start() else: print(" ::: ERROR - COULD NOT LOG IN ::: ","\n") def loadDB(self, number = None): if number is None: number = self.db["id"] return self.driver.loadDB(number = number) def backupService(self, db = None, service = None, api = None): data = [db,service] # self.backupServiceAsync(data) if service in self.services: if self.services[service]["api"] is api: bT = Thread(target = self.backupServiceAsync,args = [data]) bT.start() def backupServiceAsync(self,data): time.sleep(self.db["backupDelay"]) db, service = data print("SSSSSSSSS",service,db) if time.time() - self.db["lastBackupServices"] < self.db["backupInterval"]: return False if service is None or len(service) == 0: return None backupChat = None if service in self.db["servicesDB"]: chatID = self.db["servicesDB"][service]["dbID"] if chatID is not None: bchat = None try: bchat = self.driver.getChat(chatID) except Exception as e: print(" ::: ERROR - COULD NOT GET BACKUPCHAT",e," ::: ","\n") if bchat is not None: print("FFFFFFFFFFFFFFFUCKKK") # self.driver.sendMessage(chatID,"FFFFFFFFFFFFFFFUCKKK") backupChat = chatID else: print(" ::: ERROR - SERVICE HAS NO BACKUPCHAT"+" ::: ","\n") if backupChat is not None: if db is not None: return self.driver.updateDB(db,number=backupChat) else: return self.loadDB(backupChat) else: print(" ::: ERROR - BackupChat NOT FOUND for :"+service+": service ::: \n") self.db["lastBackupServices"] = time.time() def backup(self, now = None): bT = Thread(target = self.backupAsync,args = [now]) bT.start() def backupAsync(self,data): now = data if now is None: time.sleep(self.db["backupDelay"]) if time.time() - self.db["lastBackup"] < self.db["backupInterval"]: return False self.db["lastBackup"] = time.time() return self.driver.updateDB(self.db,number=self.db["id"]) def ProcessServiceAsync(self, obj, info): serviceT = Thread(target = self.ProcessService, args = [[obj,info]]) serviceT.start() def ProcessService(self, data): # try: # service, chatID, text = data obj, info = data obj.process(info) # self.serviceFuncs["services"][service](chatID, text) # except Exception as e: # print(" ::: ERROR - Processing Service ::: ",serice,":::",chatID,":::",text,":::","\n",e,e.args,"\n") def ProcessIncoming0(self, data): print( ''' =================================== Processing Incoming Messages =================================== ''' ) lastm = None loopc = 0 delay = 0.5 while True: # try: if True: if loopc % 20 == 0: ''' ::: rechecking status ::: ''' try: self.status = status = self.driver.get_status() print(" ::: status is",status,"::: ") except Exception as e: self.status = status = "XXXXXXXX" print(" ::: ERROR - Status Fetching ::: ","\n",e,e.args,"\n") ''' all unread messages ''' for contact in self.driver.get_unread(): # print("MMMMMMMMMMXXX",contact) # print("MMMMMMMMMMXXX",contact) # print("MMMMMMMMMMXXX",contact) # print("MMMMMMMMMMXXX",contact) # print("MMMMMMMMMMXXX",contact) for message in contact.messages: print("MMMMMMMMMM",message) # print("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII") # pprint(vars(contact)) # print("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII") # pprint(vars(message)) # print("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII") # print("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII") # print("IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII") if runLocal: chatID = message.chat_id["_serialized"] else: chatID = message.chat_id try: chat = self.driver.get_chat_from_id(chatID) except Exception as e: print(" ::: ERROR - _serialized chatID ::: "+chatID+" ::: ","\n",e,e.args,"\n") ''' incoming from: ''' ''' Personal Chat ''' senderName = message.get_js_obj()["chat"]["contact"]["formattedName"] senderID = message.sender.id fromGroup = False if "c" in chatID: print( ''' =================================== Incoming Messages from '''+senderID+" "+senderName+''' =================================== ''' ) # ''' Group Chat ''' elif "g" in chatID: fromGroup = True print( ''' =============================================== Incoming Messages from \"'''+senderID+" in "+senderName+'''\" GROUP =============================================== ''' ) if message.type == "chat": text = message.content print("TTTTTXXXXXXXXXTTTTTTT",text) ''' subscribe to service ''' ''' SENT FROM GROUP CHAT ''' if "%%%!%%%" in text: print("YYYYYYYYYYYYYYYYYYYY") print("YYYYYYYYYYYYYYYYYYYY") print("YYYYYYYYYYYYYYYYYYYY") target = text.split(u"%%%!%%%")[1] self.driver.sendMessage(chatID,"Adding Service to DB: "+target) self.db["services"][target] = {"dbID":None,"incomingTarget":None} self.LoadServices() # self.serviceFuncs["services"][target] = None self.backup(now = True) else: print("XXXXXXXXXXXXXXXXXXX") print("XXXXXXXXXXXXXXXXXXX") print("XXXXXXXXXXXXXXXXXXX") if fromGroup is True: ''' GOT REGISTRATION COMMAND ''' if text[0] is "=": foundService = None target = text[1:] ''' register group to service ''' for service in self.db["services"]: if target.lower() == service.lower(): foundService = service foundChat = False if chatID in self.db["groups"]: targetService = self.db["groups"][chatID] print("TTTTTTTTTTTTTTTTTTTT") print(targetService, service) if targetService is not None: if targetService.lower() == service.lower(): foundChat = True self.driver.sendMessage(chatID,"You are already subscirbed to: "+target+" \nYou can unsubscribe with -"+target.lower()) if not foundChat: print("SSSSSSSSSSSSSSSSSSSSSSsxxxxx") print("SSSSSSSSSSSSSSSSSSSSSSsxxxxx") print("SSSSSSSSSSSSSSSSSSSSSSsxxxxx") self.driver.sendMessage(chatID,"Subscribing to service: "+service) self.db["groups"][chatID] = service self.backup() if foundService is None: self.driver.sendMessage(chatID,"service: "+target+" Not Found") ''' Chat is not registered first time''' if chatID not in self.db["groups"]: # print("SSSSSSSSSSSSSSSSSSSSSS") self.driver.sendMessage(chatID,"This chat is not registered with any service yet\nYou can register it by sending =service_name") # print("JJJJJJJJJJJJJJ") self.db["groups"][chatID] = None # print("SSSSSSSSSSSSSSSSSSSSSS") self.backup() elif self.db["groups"][chatID] is not None: ''' Chat is known ''' target = self.db["groups"][chatID] print("MMMMMMMMMMMMMMMM",target) ''' adding new user to service from group''' foundService = None for service in self.db["services"]: if target.lower() == service.lower(): foundService = service ''' CHAT IS REGISTERED TO SERVICE! ''' ''' PROCESS INCOMNG MESSAGE in SERVICE ''' if foundService is not None and text[0] is not "=": # self.driver.sendMessage(chatID,text+" ::: GONNA BE PROCESSED BY "+target) ''' this is where the magic happens - send to service''' self.ProcessServiceAsync(service,chatID,text) if foundService is None: self.driver.sendMessage(chatID,target+" : is not recognized as a service "+target) else: ''' service is None ''' self.driver.sendMessage(chatID,"You can register this chat by sending =service_name") elif text[0] is "=": ''' person registering service with =''' target = text[1:] dbChanged = False now = False ''' check target service in db ''' serviceFound = False for service in self.db["services"]: print("______________ ----------"+service) print("") if not serviceFound and target.lower() == service.lower(): ''' service found ''' serviceFound = True if chatID not in self.db["users"]: self.db["users"][chatID] = {'services': {}} dbChanged = True ''' first time user ''' # self.db["users"][senderID] = {'services': {'Reminders': {'groupID': None}}} else: ''' known user ''' foundChat = None if service in self.db["users"][chatID]["services"]: serviceChat = self.db["users"][chatID]["services"][service] # self.driver.sendMessage(senderID,"You are already subscirbed to: "+target+" \nYou can unsubscribe with -"+target.lower()) try: foundChat = self.driver.get_chat_from_id(serviceChat) except: print('chat could not be found') chatName = target welcome = "Thank you for Subscribing to "+target try: chatName = self.db["services"][service]["groupName"] welcome = "Thank you for Subscribing to "+chatName welcome = self.db["services"][service]["welcome"] except: pass if foundChat is not None: check_participents = False if check_participents: if senderID in foundChat.get_participants_ids() or True: '''##### check that user is participant ''' self.driver.sendMessage(senderID,"You are already subscirbed to: "+chatName+" \nYou can unsubscribe with -"+target.lower()) self.driver.sendMessage(serviceChat,"subscirbed to: "+chatName) else: foundChat = None else: self.driver.sendMessage(senderID,"You are already subscirbed to:\n"+chatName+" \nYou can unsubscribe with -"+target.lower()) self.driver.sendMessage(serviceChat,"subscirbed to: "+chatName) ''' create new group ''' if foundChat is None: groupName = service if service in self.serviceGroupNames: groupName = self.serviceGroupNames[service] newGroup = self.driver.newGroup(newGroupName = groupName, number = "+"+senderID.split("@")[0], local = runLocal) newGroupID = newGroup.id self.newG = newGroupID self.db["users"][chatID]['services'][service] = newGroupID self.db["groups"][newGroupID] = target dbChanged = True now = True print( ''' =============================================== ''' + senderID +" is NOW SUBSCRIBED TO "+ target +" :D "+''' =============================================== ''' ) self.driver.sendMessage(senderID,"Thank you! you are now subscribed to: "+chatName+" \nPlease check your new group :)") self.driver.sendMessage(newGroupID,welcome) # self.driver.sendMessage(serviceChat,"subscirbed to: "+target) if not serviceFound: self.driver.sendMessage(chatID,target+" : is not recognized as a service "+target) print( ''' =============================================== SERVICE '''+ target +" IS NOT AVAILABLE"+''' =============================================== ''' ) if dbChanged: self.backup(now=now) ''' lastm = message print(json.dumps(message.get_js_obj(), indent=4)) for contact in self.driver.get_contacts(): # print("CCCC",contact.get_safe_name() ) if sender in contact.get_safe_name(): chat = contact.get_chat() # chat.send_message("Hi "+sender+" !!!*"+message.content+"*") print() print() print(sender) print() print() print("class", message.__class__.__name__) print("message", message) print("id", message.id) print("type", message.type) print("timestamp", message.timestamp) print("chat_id", message.chat_id) print("sender", message.sender) print("sender.id", message.sender.id) print("sender.safe_name", message.sender.get_safe_name()) if message.type == "chat": print("-- Chat") print("safe_content", message.safe_content) print("content", message.content) # Manager.process(message.sender.id,message.content) # contact.chat.send_message(message.safe_content) elif message.type == "image" or message.type == "video": print("-- Image or Video") print("filename", message.filename) print("size", message.size) print("mime", message.mime) print("caption", message.caption) print("client_url", message.client_url) message.save_media("./") else: print("-- Other type:",str(message.type)) print("PROCESSING MESSAGE:",message) ''' else: pass # except Exception as e: # print(" ::: ERROR - CHECKING MESSAGES ::: ","\n",e,e.args,"\n") loopc += 1; loopc = loopc % 120 time.sleep(delay) def quit(self): self.driver.quit() def Nothing(data): print(":::Nothign::: DATA=",data)
driver = WhatsAPIDriver(username='******', loadstyles=True, profile=config('PROFILE_PATH')) print("Waiting for QR") driver.wait_for_login() driver.save_firefox_profile(remove_old=True) print("Bot started") start_time = datetime.datetime.now() try: while True: time.sleep(3) # Checks for new messages every 3 secs. pinger = pinger + 1 if ((pinger % 600) == 0): # Notification every 30 min. (600 * 3 sec = 1800 sec) pinger = 0 send_message_to_master("Resetting counter to {pingcount}. Driver status is '{status}'".format( pingcount=pinger, status=driver.get_status())) print('Checking for more messages, status. Pinger={pingcount}'.format(pingcount=pinger), driver.get_status()) for contact in driver.get_unread(include_me=False, include_notifications=True): for message in contact.messages: print(json.dumps(message.get_js_obj(), indent=4)) # Log full JSON to general log f = open("generallog.log", "a+", encoding="utf-8") f.write("\n\n==========================================================================\nMessage received at {timestamp}\n".format( timestamp=str(datetime.datetime.now()))) try: f.write(json.dumps(message.get_js_obj(), indent=4)) except: f.write('ERROR!! Unprintable JSON!') send_message_to_master("Unprintable JSON! Please check!") f.write("\n") f.close()
print("Bot started") try: while True: time.sleep(3) # Just a keep alive pinger in order to know everytinhg's still running pinger = pinger + 1 if ( (pinger % 600) == 0 ): # Set this to what you want. Now this is 600 * 3sec = 1800 sec = 30 min. Every 30min a message to the master numbers will say everything's ok pinger = 0 send_message_to_master( "Work work. Resetting counter to {pingcount}. Status is '{status}'" .format(pingcount=pinger, status=driver.get_status())) safe_print( 'Checking messages. Status is {status}. Counter={pingcount}'. format(pingcount=pinger, status=driver.get_status())) for contact in driver.get_unread(include_me=True, include_notifications=True): for message in contact.messages: safe_print_and_log(json.dumps(message.get_js_obj(), indent=4)) # Log full JSON to general log safe_print_and_log( "\n\n==========================================================================\nMessage received at {timestamp}\n" .format(timestamp=str(datetime.datetime.now()))) safe_print('class', message.__class__.__name__) safe_print('message', message) safe_print('id', message.id) safe_print('type', message.type)
##Save session on "/firefox_cache/localStorage.json". ##Create the directory "/firefox_cache", it's on .gitignore ##The "app" directory is internal to docker, it corresponds to the root of the project. ##The profile parameter requires a directory not a file. profiledir=os.path.join(".","firefox_cache") if not os.path.exists(profiledir): os.makedirs(profiledir) driver = WhatsAPIDriver(profile=profiledir, client='remote', command_executor=os.environ["SELENIUM"]) print("Waiting for QR") driver.wait_for_login() print("Saving session") driver.save_firefox_profile(remove_old=False) print("Bot started") while True: time.sleep(3) print 'Checking for more messages, status', driver.get_status() for contact in driver.get_unread(): for message in contact.messages: print(json.dumps(message.get_js_obj(), indent = 4)) print 'class', message.__class__.__name__ print 'message', message print 'id', message.id print 'type', message.type print 'timestamp', message.timestamp print 'chat_id', message.chat_id print 'sender', message.sender print 'sender.id', message.sender.id print 'sender.safe_name', message.sender.get_safe_name() if message.type == 'chat': print '-- Chat' print 'safe_content', message.safe_content
class WPChannelBot(): def __init__(self): self.model = WPChannelBotModel() self.data = self.model.get_all() self.convs = self.model.get_convs() self.convs_state = self.model.get_convs_state() self.simple_steps = True self.log_file = "log/chatbot.log" self.cmd_wait_from = None self.cmd_wait = False self.profile = "profile" self.driver = None def start(self): print("Iniciando bot...") self.driver = WhatsAPIDriver(profile=self.profile) time.sleep(3) if not self.driver.get_status() == "LoggedIn": print("Carregando QRCode") self.driver.get_qr("qrcode.png") print("Escaneie o QRCode no arquivo qrcode.png") self.driver.wait_for_login() print("Bot iniciado") self.driver.save_firefox_profile() while True: time.sleep(1) for contact in self.driver.get_unread(include_me=False, include_notifications=True, use_unread_count=True): if len(contact.messages) == 1: for message in contact.messages: if isinstance(message, Message): self.new_message(message.content, contact) self.driver.chat_send_seen(contact.chat.id) time.sleep(3) else: contact.chat.send_message( "Fico confuso com muitas mensagens :S Por favor, envie uma de cada vez e espere eu responder tá?" ) contact.chat.send_message(CHANNEL_ASK_KEYWORD) def new_message(self, message, contact): if not self._is_cmd(message): if self.cmd_wait and contact.chat.id == self.cmd_wait_from: self._cmd_envio(message, contact.chat) elif not contact.chat.id in self.convs: self._proc_etapa(contact.chat.id, message, contact.chat, 2) else: for conv in self.convs_state: if conv['id'] == contact.chat.id: e = self._proc_etapa(contact.chat.id, message, contact.chat, conv['etapa']) conv['etapa'] = e self.model.conv_update(contact.chat.id, e) else: print("ADMINISTRADOR") self._run_cmd(message, contact.chat) def shutdown(self): print("Desconectando...") self.driver.close() time.sleep(3) print("Desconectado") def _already_user(self, id, chat): if isinstance(self.model.get(id), dict): chat.send_message( "Olá, você já está cadastrado neste canal. Assim que tiver novidade você vai receber!" ) return True else: return False def _is_keyword(self, content, chat): if content.lower() == CHANNEL_KEYWORD: return True else: chat.send_message(CHANNEL_ASK_KEYWORD) return False def _proc_etapa(self, id, content, chat, etapa): if etapa == 2: if not self._already_user(id, chat) and self._is_keyword( content, chat): # Efetua registros self.convs.append(id) self.convs_state.append({"id": id, "etapa": 4}) self.model.conv_add(id, 4) # Introdução do canal - Solicita nome chat.send_message(CHANNEL_INTRO) chat.send_message(CHANNEL_MSGS[0]) self._to_log("Iniciando cadastro: %s" % id) elif etapa == 4: # Armazena nome - Solicita cidade if self.simple_steps: self.data.append({"id": id, "nome": content}) # Salva no banco de dados self.model.add(id, content) chat.send_message((CHANNEL_MSGS[3] % content)) self._remove_convs(id) self._to_log("Finalizado cadastro: %s - %s" % (id, content)) else: self.data.append({ "id": id, "nome": content, "cidade": "", "bairro": "" }) chat.send_message(CHANNEL_MSGS[1]) # Salva no banco de dados self.model.add(id, content) self._to_log("Registrado nome: %s - %s" % (id, content)) return 6 elif etapa == 6: # Implementar veficação de validade de cidade # Verifica cidade - volta ao 5 : armazena cidade - solicita bairro ou passo for obj in self.data: if obj["id"] == id: obj["cidade"] = content self.model.update(id=id, cidade=content) chat.send_message(CHANNEL_MSGS[2]) self._to_log("Registrado cidade: %s - %s" % (id, content)) return 7 elif etapa == 7: # Implementar veficação de validade de bairro if content == "passo": # Finaliza caso não seja informado bairro chat.send_message((CHANNEL_MSGS[3] % self._get_conv_nome(id))) self._remove_convs(id) self._to_log("Finalizado cadastro: %s - %s" % (id, content)) else: # Armazena bairro - Finaliza cadastro for obj in self.data: if obj["id"] == id: obj["bairro"] = content self.model.update(id=id, bairro=content) chat.send_message( (CHANNEL_MSGS[3] % self._get_conv_nome(id))) self._remove_convs(id) self._to_log("Finalizado cadastro: %s - %s" % (id, content)) def _to_log(self, log): file = open(self.log_file, "a") file.write("\n>> %s " % log) file.close() return def _get_conv_nome(self, id): for obj in self.data: if obj["id"] == id: return obj["nome"] def _remove_convs(self, id): self.convs.remove(id) for conv in self.convs_state: if conv["id"] == id: self.convs_state.remove(conv) self.model.conv_delete(id) def _is_cmd(self, content): if content[:4] == "/cmd": return True else: return False def _run_cmd(self, content, chat): cmd = content[5:] if not self.model.check_admin(chat.id) == False: if cmd == "usuarios": self._cmd_usuarios(chat) elif cmd == "envio": self.cmd_wait = True self.cmd_wait_from = chat.id chat.send_message( "*ENVIE A SEGUIR A MENSAGEM A SER ENVIADA PARA O CANAL*") else: chat.send_message("*COMANDO NÃO RECONHECIDO*") elif self.model.check_admin(id=None, all=True) == False and cmd[:5] == "admin": print("Cadastrando novo admin") self.model.add_admin(chat.id, content[11:]) chat.send_message("*ADMINISTRADOR CADASTRADO*") else: chat.send_message(CHANNEL_ASK_KEYWORD) def _cmd_usuarios(self, chat): response = "*USUÁRIOS CADASTRADOS*\n\n" i = 0 users = self.model.get_all() for user in users: i += 1 response += "\n%d) %s - %s" % (i, user['id'], user['nome']) chat.send_message(response) def _cmd_envio(self, content, chat): i = 0 users = self.model.get_all() for user in users: i += 1 self.driver.send_message_to_id(user['id'], content) self.cmd_wait_from = None self.cmd_wait = False chat.send_message("*MENSAGEM ENVIADA PARA %d USUÁRIOS DO CANAL*" % i)
command_executor=os.environ["SELENIUM"]) print('Pedira el qr') name = uuid4().hex + '.png' if os.path.exists(name): os.remove(name) driver.get_qr(name) print('Guarda el qr') os.rename('./' + name, '/app/files/qr/' + name) print("Waiting for QR") driver.wait_for_login() while True: time.sleep(30) driver.send_message_to_id("*****@*****.**", "hola") print(" Bateria ", driver.get_battery_level()) print(" Number ", driver.get_phone_number()) print(" Status ", driver.get_status()) name = uuid4().hex + '.png' if os.path.exists(name): os.remove(name) driver.screenshot(name) print('Guarda foto') os.rename('./' + name, '/app/files/qr/' + name) # print("chats whit messages not read", driver.get_chats_whit_messages_not_read()) # for chat in driver.get_chats_whit_messages_not_read(): # print(driver.get_all_messages_in_chat(chat[0])) # for message in driver.get_all_messages_in_chat(chat[0]): # print(message)