Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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(
Ejemplo n.º 4
0
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")
Ejemplo n.º 5
0
    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))
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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()
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
##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
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
                        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)