interactive bots: create a google bot.
ADD
contrib_bots/lib/googlesearch.py
+# 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()
+

interactive bots: create a google bot.