From 537a26b4e0a329c5f8edcde7dbb3788b7309c6a2 Mon Sep 17 00:00:00 2001 From: Remy Moll <mollator2@gmail.com> Date: Wed, 13 May 2020 15:42:37 +0200 Subject: [PATCH] Ok, features kicking in --- .google-cookie | 5 + main.py | 350 +++++++++++++++++++++++++++++-------------------- 2 files changed, 215 insertions(+), 140 deletions(-) create mode 100644 .google-cookie diff --git a/.google-cookie b/.google-cookie new file mode 100644 index 0000000..9decb19 --- /dev/null +++ b/.google-cookie @@ -0,0 +1,5 @@ +#LWP-Cookies-2.0 +Set-Cookie3: 1P_JAR="2020-05-13-15"; path="/"; domain=".google.com"; path_spec; domain_dot; secure; expires="2020-06-12 15:07:25Z"; version=0 +Set-Cookie3: NID="204=n_wUpdR_TRFItRjyHxZ36B0EybjpBvLOa2ZsmpYnFPdVyLkmIaHc86rv9Ne06Ky5XEPRNNnsIHNzfmZc0NVnCf3HujqVbmYxN9OocwqASX0dYmH4B8Iy9UdLmvAUUfKC5FB3EkMMi_Q491lUiFSSbznjktAAMgcuHvJ7MBFAC7w"; path="/"; domain=".google.com"; path_spec; domain_dot; expires="2020-11-12 15:07:25Z"; HttpOnly=None; version=0 +Set-Cookie3: CGIC=""; path="/complete/search"; domain=".google.com"; path_spec; domain_dot; expires="2020-11-09 15:07:25Z"; HttpOnly=None; version=0 +Set-Cookie3: CGIC=""; path="/search"; domain=".google.com"; path_spec; domain_dot; expires="2020-11-09 15:07:25Z"; HttpOnly=None; version=0 diff --git a/main.py b/main.py index ed6404d..5cb0319 100644 --- a/main.py +++ b/main.py @@ -8,174 +8,244 @@ import datetime import googlesearch import emoji -chat_members = {} -base_url = "https://api.telegram.org/bot" + telegram_api + "/" -chat_id = "" -offset = 0 -start_time = datetime.datetime.now() -message_read = 0 -message_sent = 0 +class ChatBot(): + + def __init__(self, name, api_key, version): + """Inits the Bot with a few conf. vars + Args: -> name:str - Name of the bot + -> api_key:str - t.me api-key + -> version:str - Version number + """ + + self.base_url = "https://api.telegram.org/bot" + api_key + "/" + self.version = version + self.name = name + + # Counters + self.start_time = datetime.datetime.now() + self.message_read = 0 + self.message_sent = 0 + self.log = [] + + # Dynamic variables for answering + self.chat_id = "" + self.offset = 0 + + # People in use + self.chat_members = {} + + # Available commands + self.commands = { + "help" : self.bot_show_help, + "status" : self.bot_print_status, + "log" : self.bot_print_log, + "lorem" : self.bot_print_lorem, + "weather" : self.bot_show_weather, + "google" : self.bot_google_search, + "events" : self.bot_print_events, + "emojify" : self.bot_emojify, + "wikipedia" : self.bot_show_wikipedia, + } + + self.message_loop() -def bot_print_lorem(params): - send_message("Lorem ipsum dolor sit amet....") - -def bot_print_status(params): - delta = str(datetime.datetime.now() - start_time) - message = "<pre>Status: Running \nUptime: " + delta + "\nMessages read: " + str(message_read) + "\nMessages sent: " + str(message_sent) + "</pre>" - send_message(message) - -def bot_show_weather(params): - if len(params) != 1: - send_message("Invalid Syntax, please give one parameter, the location") - return - send_message("Probably sunny I guess? Yes yes I'm still learning") - -def bot_google_search(params): - if len(params) < 1: - send_message("Please tell me what to look for") - return - param_string = "" - for word in params: - param_string += word + "+" - param_string = param_string[:-1] - search_url = "https://google.com/search?q=" + param_string - try: - res = googlesearch.search(param_string.replace("+"," ") ,num=5,start=0,stop=5) - send_string = "Google search for <b>" + param_string.replace("+"," ") + "</b>:\n" - for url in res: - print(url) - send_string += url + "\n\n" - send_string += "Search url:\n" + search_url - except: - send_string = "Search url:\n" + search_url - send_message(send_string) + def message_loop(self): + """""" + while(True): + result = self.fetch_updates() + if len(result) == 0: + time.sleep(5) + else: + self.handle_result(result) + time.sleep(5) -def bot_print_events(params): - events = { - "anniversary" : datetime.date(datetime.datetime.now().year,12,7), - "valentine's day": datetime.date(datetime.datetime.now().year,2,14), - "Marine's birthday": datetime.date(datetime.datetime.now().year,8,31), - "Remy's birthday": datetime.date(datetime.datetime.now().year,3,25), - } - send_string = "Upcoming events: \n" - for key in events: - delta = events[key] - datetime.date.today() - if delta < datetime.timedelta(0): - delta += datetime.timedelta(days = 365) - send_string += key + ": " + str(delta.days) + " days \n" - - send_message(send_string) + def fetch_updates(self): + """""" + update_url = self.base_url + "getUpdates" + data = {"offset":self.offset} + result = requests.post(update_url,data=data) + try: + result = result.json()["result"] + except: + result = "" + return result -def bot_emojify(params): + def handle_result(self, result): + """Inspects the message and reacts accordingly. Can easily be extended""" + for message_data in result: + self.message_read += 1 + self.offset = message_data["update_id"] + 1 + message = message_data["message"] + self.chat_id = message["chat"]["id"] + author = message["from"] - if len(params) < 2: - send_message(emoji.emojize("Please send a separator as the first argument, and the text afterwards.\nExample:\n/emojify :heart: Example text")) - sep = params[0] - emoji_dict = {"a" : ":regional_indicator_symbol_letter_a:","b" : ":regional_indicator_symbol_letter_b:","c" : ":regional_indicator_symbol_letter_c:","d" : ":regional_indicator_symbol_letter_d:","e" : ":regional_indicator_symbol_letter_e:","f" : ":regional_indicator_symbol_letter_f:","g" : ":regional_indicator_symbol_letter_g:","h" : ":regional_indicator_symbol_letter_h:","i" : ":regional_indicator_symbol_letter_i:","j" : ":regional_indicator_symbol_letter_j:","k" : ":regional_indicator_symbol_letter_k:","l" : ":regional_indicator_symbol_letter_l:","m" : ":regional_indicator_symbol_letter_m:","n" : ":regional_indicator_symbol_letter_n:","o" : ":regional_indicator_symbol_letter_o:","p" : ":regional_indicator_symbol_letter_p:","q" : ":regional_indicator_symbol_letter_q:","r" : ":regional_indicator_symbol_letter_r:","s" : ":regional_indicator_symbol_letter_s:","t" : ":regional_indicator_symbol_letter_t:","u" : ":regional_indicator_symbol_letter_u:","v" : ":regional_indicator_symbol_letter_v:","w" : ":regional_indicator_symbol_letter_w:","x" : ":regional_indicator_symbol_letter_x:","y" : ":regional_indicator_symbol_letter_y:","z" : ":regional_indicator_symbol_letter_z:"," " : sep} + if author["id"] not in self.chat_members: + self.chat_members[author["id"]] = author["first_name"] + " " + author["last_name"] + self.send_message("Welcome to this chat " + self.chat_members[author["id"]] + " !") - prep_string = "" - for i in params[1:]: - prep_string += i.lower() + " " - out_string = "" - for i in prep_string[:-1]: - if i in emoji_dict: - out_string += emoji_dict[i] + " " + if "text" in message: + print("Chat said: ", emoji.demojize(message["text"])) + + if "entities" in message: + for entry in message["entities"]: + if entry["type"] == "bot_command": + self.handle_command(message["text"][1:]) + + elif "photo" in message: + print("Photo received, what do I do?") + + + def handle_command(self, command): + """Handles commands and stuff, using a bash-like syntax: + /[command] [argument 1] [argument 2] ... + """ + full = command.split(" ") + if full[0] in self.commands: + self.commands[full[0]](full[1:]) else: - out_string += i - send_message(emoji.emojize(out_string)) + self.send_message("Command <code>" + full[0] + "</code> not found. Please try again.") + def send_message(self, message): + print("SENDING: " + emoji.demojize(message)) + + data = {'chat_id': self.chat_id, 'text': message, "parse_mode": "HTML"} + send_url = self.base_url + "sendMessage" + try: + r = requests.post(send_url, data=data) + except: + self.log.append(str(datetime.datetime.now()) + " - did not send:\n" + message) + self.message_sent += 1 + + ############################################################################ + """Command-implementation""" + + def bot_print_lorem(self, params): + """Prints a placeholder text""" + self.send_message("Lorem ipsum dolor sit amet....") -commands = { - "status" : bot_print_status, - "lorem" : bot_print_lorem, - "weather" : bot_show_weather, - "google" : bot_google_search, - "events" : bot_print_events, - "emojify" : bot_emojify, -} + def bot_print_status(self, params): + """Prints the bots current status and relevant information""" + delta = str(datetime.datetime.now() - self.start_time) + message = "<pre>Status: Running \n" + message += "Uptime: " + delta + "\n" + message += "Messages read: " + str(self.message_read) + "\n" + message += "Messages sent: " + str(self.message_sent) + "</pre>" + self.send_message(message) + def bot_show_weather(self, params): + """Shows a weather-forecast for a given location""" + if len(params) != 1: + self.send_message("Invalid Syntax, please give one parameter, the location") + return + self.send_message("Probably sunny I guess? Yes yes I'm still learning") + def bot_google_search(self, params): + """Does a google search and shows relevant links""" + if len(params) < 1: + self.send_message("Please tell me what to look for") + return + + param_string = "" + for word in params: + param_string += word + "+" + param_string = param_string[:-1] + search_url = "https://google.com/search?q=" + param_string + + try: + res = googlesearch.search(param_string.replace("+"," ") ,num=5,start=0,stop=5) + send_string = "Google search for <b>" + param_string.replace("+"," ") + "</b>:\n" + for url in res: + send_string += url + "\n\n" + send_string += "Search url:\n" + search_url + except: + send_string = "Search url:\n" + search_url + self.send_message(send_string) + def bot_print_events(self, params): + """Shows a list of couple-related events and a countdown""" + events = { + "anniversary" : datetime.date(datetime.datetime.now().year,12,7), + "valentine's day": datetime.date(datetime.datetime.now().year,2,14), + "Marine's birthday": datetime.date(datetime.datetime.now().year,8,31), + "Remy's birthday": datetime.date(datetime.datetime.now().year,3,25), + } + send_string = "Upcoming events: \n" + for key in events: + delta = events[key] - datetime.date.today() + if delta < datetime.timedelta(0): + delta += datetime.timedelta(days = 365) + send_string += key + ": " + str(delta.days) + " days \n" + + self.send_message(send_string) -def fetch_updates(): - update_url = base_url + "getUpdates" - data = {"offset":offset} - result = requests.post(update_url,data=data) - try: - result = result.json()["result"] - except: - result = "" - return result + def bot_emojify(self, params): + """Converts a string to emojis""" -def send_message(message): - print("SENDING: " + emoji.demojize(message)) - global message_sent - data = {'chat_id': chat_id, 'text': message, "parse_mode": "HTML"} - send_url = base_url + "sendMessage" - r = requests.post(send_url, data=data) - message_sent += 1 + if len(params) < 2: + self.send_message(emoji.emojize("Please send a separator as the first argument, and the text afterwards.\nExample:\n/emojify :heart: Example text")) + sep = params[0] + emoji_dict = {"a" : ":regional_indicator_symbol_letter_a:","b" : ":regional_indicator_symbol_letter_b:","c" : ":regional_indicator_symbol_letter_c:","d" : ":regional_indicator_symbol_letter_d:","e" : ":regional_indicator_symbol_letter_e:","f" : ":regional_indicator_symbol_letter_f:","g" : ":regional_indicator_symbol_letter_g:","h" : ":regional_indicator_symbol_letter_h:","i" : ":regional_indicator_symbol_letter_i:","j" : ":regional_indicator_symbol_letter_j:","k" : ":regional_indicator_symbol_letter_k:","l" : ":regional_indicator_symbol_letter_l:","m" : ":regional_indicator_symbol_letter_m:","n" : ":regional_indicator_symbol_letter_n:","o" : ":regional_indicator_symbol_letter_o:","p" : ":regional_indicator_symbol_letter_p:","q" : ":regional_indicator_symbol_letter_q:","r" : ":regional_indicator_symbol_letter_r:","s" : ":regional_indicator_symbol_letter_s:","t" : ":regional_indicator_symbol_letter_t:","u" : ":regional_indicator_symbol_letter_u:","v" : ":regional_indicator_symbol_letter_v:","w" : ":regional_indicator_symbol_letter_w:","x" : ":regional_indicator_symbol_letter_x:","y" : ":regional_indicator_symbol_letter_y:","z" : ":regional_indicator_symbol_letter_z:"," " : sep} -def handle_command(command): - """Handles commands and stuff, using a bash-like syntax: - /[command] [argument 1] [argument 2] ... - """ - full = command.split(" ") - if full[0] in commands: - commands[full[0]](full[1:]) - else: - send_message("Command <code>" + full[0] + "</code> not found. Please try again.") + prep_string = "" + for i in params[1:]: + prep_string += i.lower() + " " + out_string = "" + for i in prep_string[:-1]: + if i in emoji_dict: + out_string += emoji_dict[i] + " " + else: + out_string += i + self.send_message(emoji.emojize(out_string)) -def handle_result(result): - """Inspects the message and reacts accordingly. Can easily be extended""" - print("handling") - for message_data in result: - global chat_id - global offset - global message_read - message_read += 1 - offset = message_data["update_id"] + 1 - message = message_data["message"] - chat_id = message["chat"]["id"] - author = message["from"] + def bot_show_help(self, params): + """Shows a list of all commands and their description""" + send_text = "Hello, this is " + self.name + ", V." + self.version + "\n" + send_text += "Here is a list of the available commands:\n" + for entry in self.commands: + send_text += "<code>" + entry + "</code> - " + send_text += self.commands[entry].__doc__ + "\n\n" + self.send_message(send_text) - if author["id"] not in chat_members: - chat_members[author["id"]] = author["first_name"] + " " + author["last_name"] - send_message("Welcome to this chat " + chat_members[author["id"]] + " !") + def bot_print_log(self, params): + """Shows an error-log, mostly of bad api-requests""" + send_text = "" + for event in self.log: + send_text += event + "\n" + if send_text == "": + send_text += "No errors up to now" + self.send_message(send_text) - if "text" in message: - print("Chat said: ", emoji.demojize(message["text"])) + def bot_show_wikipedia(self,params): + """Shows the wikipedia entry for a given therm""" + if len(params) > 2 or len(params) == 0: + self.send_message("Please only search for one word at a time. 1rst param is for language (de or fr or en or ...)") + return - if "entities" in message: - for entry in message["entities"]: - if entry["type"] == "bot_command": - handle_command(message["text"][1:]) - - elif "photo" in message: - print("Photo received, what do I do?") - - - - - -def message_loop(): - while(True): - result = fetch_updates() - if len(result) == 0: - print("Nada") - time.sleep(5) + if len(params) == 2: + url = "https://" + params[0] + ".wikipedia.org/wiki/" + params[1] else: - handle_result(result) - time.sleep(5) + url = "https://en.wikipedia.org/wiki/" + params[0] -message_loop() + try: + r = requests.get(url) + except: + url = "https://en.wikipedia.org/wiki/" + params[0] + r = requests.get(url) + if r.status_code == 404: + self.send_message("No result found for query") + return + self.send_message(url) + + +bot = ChatBot("ChatterBot", telegram_api, version="1.0")