Skip to content

Instantly share code, notes, and snippets.

@e000
Created May 11, 2011 21:29
Show Gist options
  • Save e000/967404 to your computer and use it in GitHub Desktop.
Save e000/967404 to your computer and use it in GitHub Desktop.
from Core.ZalgoUtil.CancellableClient import getPage
from twisted.python.util import OrderedDict
from urllib import quote
from hashlib import md5
from Core.ZalgoUtil.ModUtil import xhtml_unescape, utf8
import re
class AlreadyRunningError(Exception):
pass
def urlencode(d):
return utf8('&'.join((quote(k)+'='+quote(v) for k, v in d.iteritems())))
class CleverBot:
deferred = None
_keys = ['stimulus','start','sessionid','vText8','vText7','vText6','vText5',
'vText4','vText3','vText2','icognoid','icognocheck','prevref',
'emotionaloutput','emotionalhistory','asbotname','ttsvoice',
'typing','lineref','sub','islearning','cleanslate']
_values = ['','y','','','','','','','','','wsf','','','','','','','','','Say','1','false']
_regex = re.compile('<INPUT NAME=(.+?) TYPE=hidden VALUE="(.*?)">', re.IGNORECASE | re.MULTILINE)
def __init__(self, bindAddress = None):
self.session = OrderedDict(zip(self._keys, self._values))
self.bindAddress = bindAddress
def cancelRequest(self):
"""
Cancels the active request to CleverBot
"""
if self.deferred:
self.deferred.cancel()
self.deferred = None
def getPage(self):
if not self.deferred:
self.session['icognocheck'] = md5(urlencode(self.session)[9:29]).hexdigest()
self.deferred = getPage('http://www.cleverbot.com/webservicefrm', method = 'POST',
headers = {
'Origin': 'http://cleverbot.com',
'Referer': 'http://cleverbot.com/',
'User-Agent': 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.45 Safari/534.16',
'Content-Type': 'application/x-www-form-urlencoded',
'Cache-Control': 'no-cache'
}, postdata = urlencode(self.session), bindAddress = self.bindAddress)
return self.deferred
def resetDeferred(self, data):
self.deferred = None
return data
def _parseMessage(self, data):
if '<!--too busy-->' in data:
return self.getPage().addCallback(self.resetDeferred).addCallback(self._parseMessage)
else:
self.session.update(dict(self._regex.findall(data)))
self.session['emotionaloutput'] = ''
response = data[data.find('<!-- Begin Response !-->')+25:data.find('<!-- End Response !-->')-1]
try:
return xhtml_unescape(response)
except:
return xhtml_unescape
def say(self, message):
if self.deferred:
raise AlreadyRunningError()
else:
self.session['stimulus'] = message
return self.getPage().addBoth(self.resetDeferred).addCallback(self._parseMessage)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment