121 lines
3.5 KiB
Python
121 lines
3.5 KiB
Python
# from jessi bot
|
|
import urllib2
|
|
import hashlib
|
|
import re
|
|
import unicodedata
|
|
from util import hook
|
|
|
|
# these are just parts required
|
|
# TODO: Merge them.
|
|
|
|
arglist = ['', 'y', '', '', '', '', '', '', '', '', 'wsf', '',
|
|
'', '', '', '', '', '', '', '0', 'Say', '1', 'false']
|
|
|
|
always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
'abcdefghijklmnopqrstuvwxyz'
|
|
'0123456789' '_.-')
|
|
|
|
headers = {'X-Moz': 'prefetch', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
|
|
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1)Gecko/20100101 Firefox/7.0',
|
|
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'Referer': 'http://www.cleverbot.com',
|
|
'Pragma': 'no-cache', 'Cache-Control': 'no-cache, no-cache', 'Accept-Language': 'en-us;q=0.8,en;q=0.5'}
|
|
|
|
keylist = ['stimulus', 'start', 'sessionid', 'vText8', 'vText7', 'vText6',
|
|
'vText5', 'vText4', 'vText3', 'vText2', 'icognoid',
|
|
'icognocheck', 'prevref', 'emotionaloutput', 'emotionalhistory',
|
|
'asbotname', 'ttsvoice', 'typing', 'lineref', 'fno', 'sub',
|
|
'islearning', 'cleanslate']
|
|
|
|
MsgList = list()
|
|
|
|
|
|
def quote(s, safe='/'): # quote('abc def') -> 'abc%20def'
|
|
s = s.encode('utf-8')
|
|
s = s.decode('utf-8')
|
|
print "s= " + s
|
|
print "safe= " + safe
|
|
safe += always_safe
|
|
safe_map = dict()
|
|
for i in range(256):
|
|
c = chr(i)
|
|
safe_map[c] = (c in safe) and c or ('%%%02X' % i)
|
|
try:
|
|
res = map(safe_map.__getitem__, s)
|
|
except:
|
|
print "blank"
|
|
return ''
|
|
print "res= " + ''.join(res)
|
|
return ''.join(res)
|
|
|
|
|
|
def encode(keylist, arglist):
|
|
text = str()
|
|
for i in range(len(keylist)):
|
|
k = keylist[i]
|
|
v = quote(arglist[i])
|
|
text += '&' + k + '=' + v
|
|
text = text[1:]
|
|
return text
|
|
|
|
|
|
def Send():
|
|
data = encode(keylist, arglist)
|
|
digest_txt = data[9:29]
|
|
new_hash = hashlib.md5(digest_txt).hexdigest()
|
|
arglist[keylist.index('icognocheck')] = new_hash
|
|
data = encode(keylist, arglist)
|
|
req = urllib2.Request('http://www.cleverbot.com/webservicemin',
|
|
data, headers)
|
|
f = urllib2.urlopen(req)
|
|
reply = f.read()
|
|
return reply
|
|
|
|
|
|
def parseAnswers(text):
|
|
d = dict()
|
|
keys = ['text', 'sessionid', 'logurl', 'vText8', 'vText7', 'vText6',
|
|
'vText5', 'vText4', 'vText3', 'vText2', 'prevref', 'foo',
|
|
'emotionalhistory', 'ttsLocMP3', 'ttsLocTXT', 'ttsLocTXT3',
|
|
'ttsText', 'lineRef', 'lineURL', 'linePOST', 'lineChoices',
|
|
'lineChoicesAbbrev', 'typingData', 'divert']
|
|
values = text.split('\r')
|
|
i = 0
|
|
for key in keys:
|
|
d[key] = values[i]
|
|
i += 1
|
|
return d
|
|
|
|
|
|
def ask(inp):
|
|
arglist[keylist.index('stimulus')] = inp
|
|
if MsgList:
|
|
arglist[keylist.index('lineref')] = '!0' + str(len(
|
|
MsgList) / 2)
|
|
asw = Send()
|
|
MsgList.append(inp)
|
|
answer = parseAnswers(asw)
|
|
for k, v in answer.iteritems():
|
|
try:
|
|
arglist[keylist.index(k)] = v
|
|
except ValueError:
|
|
pass
|
|
arglist[keylist.index('emotionaloutput')] = str()
|
|
text = answer['ttsText']
|
|
MsgList.append(text)
|
|
return text
|
|
|
|
|
|
@hook.command("cb")
|
|
def cleverbot(inp, reply=None):
|
|
reply(ask(inp))
|
|
|
|
|
|
''' # TODO: add in command to control extra verbose per channel
|
|
@hook.event('PRIVMSG')
|
|
def cbevent(inp, reply=None):
|
|
reply(ask(inp))
|
|
|
|
@hook.command("cbver", permissions=['cleverbot'])
|
|
def cleverbotverbose(inp, notice=None):
|
|
if on in input
|
|
'''
|