diff --git a/contrib_bots/lib/googlesearch.py b/contrib_bots/lib/googlesearch.py new file mode 100644 index 0000000..3a3f8f2 --- /dev/null +++ b/contrib_bots/lib/googlesearch.py @@ -0,0 +1,101 @@ +# See zulip/contrib_bots/lib/readme.md for instructions on running this code. +from __future__ import print_function +import logging +import http.client +from six.moves.urllib.request import urlopen +from google import search + +# Uses Google's Client Library +# pip install --upgrade google-api-python-client + +def get_google_result(original_content): + search_keywords = original_content.strip().split(' ', 1)[1] + if search_keywords == 'help': + help_message = "To use this bot start message with @google \ + followed by what you want to search for. If \ + found, Zulip will return the first search result \ + on Google. An example message that could be sent is:\ + '@google zulip' or '@google how to create a chatbot'." + return help_message + else: + try: + urls = search(search_keywords, stop=20) + urlopen('http://216.58.192.142', timeout=1) + except http.client.RemoteDisconnected as er: + logging.exception(er) + return 'Error: No internet connection. {}.'.format(er) + except Exception as e: + logging.exception(e) + return 'Error: Search failed. {}.'.format(e) + + if not urls: + return "No URLs returned by google." + + url = next(urls) + + return 'Success: {}'.format(url) + +class GoogleSearchHandler(object): + ''' + This plugin allows users to enter a search + term in Zulip and get the top URL sent back + to the context (stream or private) in which + it was called. It looks for messages starting + with @google. + ''' + + def usage(self): + return ''' + This plugin will allow users to search + for a given search term on Google from + Zulip. Use '@google help' to get more + information on the bot usage. Users + should preface messages with @google. + ''' + + def triage_message(self, message, client): + # return True if we want to (possibly) respond to this message + + original_content = message['content'] + + # This next line of code is defensive, as we + # never want to get into an infinite loop of posting google + # search links. + if message['display_recipient'] == 'google': + return False + + return original_content.startswith('@google') + + def handle_message(self, message, client, state_handler): + original_content = message['content'] + original_sender = message['sender_email'] + result = get_google_result(original_content) + + if message['type'] == 'private': + client.send_message(dict( + type='private', + to=original_sender, + content=result, + )) + else: + client.send_message(dict( + type=message['type'], + to=message['display_recipient'], + subject=message['subject'], + content=result, + )) + +handler_class = GoogleSearchHandler + +def test(): + try: + urlopen('http://216.58.192.142', timeout=1) + print("Success") + return True + except http.client.RemoteDisconnected as e: + print('Error: {}'.format(e)) + return False + +if __name__ == '__main__': + test() +