Created
May 11, 2011 21:29
-
-
Save e000/967404 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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