Basic call-and-response Slack bot
It is almost never a good idea to catch all exceptions in one block.  If you are using a try block, there are probably certain types of exceptions that you are expecting.  If some exception shows up that you aren't expecting, you want to know about it.  It should be thrown -- stop the program -- let's deal with this.  Make a list of the exceptions that you want to catch.  Add them to your except line with parentheses around them and commas between them.  If you want to print the exception, add as e: to the end and put print e inside the block.  Doing print Exception means this is your output:

&lt;type 'exceptions.Exception'&gt;


I don't think that is what you want.



Getting key-value pairs in a dictionary is so common that Python made it easy.  You can use something like for call, response in self.searches.items(): in filter_speak().  Since you are using Python 2, it would be more memory-efficient to use .iteritems() (In Python 3, .iteritems() was removed and .items() changed to take its place.)



You seem to have a bug.  What if msg does not have the text key, does have the subtype key, but msg['subtype'] does not equal message_changed?  What if msg also has the user key and msg['user'] does not equal self.user_id?  Wheew, that takes a lot.  If all of that happens, your program will have a NameError because you never define body in that first sentence, but it is required in the second.  You need to combine the elif and the if inside it:

if msg['type'] == "message":
    if 'text' in msg:
        body = msg['text']
    elif msg.get('subtype') == "message_changed":
        body = msg['message']['text']
    else:
        ...


Your later if statements can be combined:

if msg.get('user') != self.user_id:
    ...


Ah, the wonderful advantage of dict.get().