interactive bots: create a google bot.
This commit is contained in:
parent
1b31a16d13
commit
054db19ad9
101
contrib_bots/lib/googlesearch.py
Normal file
101
contrib_bots/lib/googlesearch.py
Normal file
|
@ -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()
|
||||
|
Loading…
Reference in a new issue