2个聊天机器人

原创 2014年02月04日 12:31:08

2014/06/28修改.

       修改小黄鸡模块, 小i就不改了, 没什么用。。。


新版小黄鸡模块(只写了个ask函数, teach还没写, 后面应该会继续修改。。)


#coding=utf-8

import json;
import urllib;
import urllib.request;
from urllib.parse import urlencode;

URL_SIMSIMI = "http://www.simsimi.com/talk.htm";
URL_ASKSIMSIMI = "http://www.simsimi.com/func/reqN?";
URL_TEACHSIMSIMI = "";

talkHeader = {
    "Cookie":"simsimi_uid=53294991; simsimi_uid=53294991; isFirst=1; isFirst=1; sid=s%3AXcqIfaDZ5P4biUHi4Xw8TdFE.CYYochQc23%2B%2BvPjDw5HH4yg5MTN%2FSnBtskGXJHEX8f4; AWSELB=150F676708F2639057F41EA6CD9115064C58E864E4D5FE3F62AF683EB3CA54C1A44837308BAB86F4F48D2BA2A2B01B0AEA34FBA3D92BA7AB89083051C189504CF5589F0BF7; teach_btn_url=talk; teach_btn_url=talk; Filtering=0.0; Filtering=0.0; popup_ad_InMobi=1; popup_ad_InMobi=1; menuType=web; menuType=web; selected_nc=ch; selected_nc=ch; __utma=119922954.2134471962.1398783865.1403874641.1403877970.3; __utmb=119922954.23.9.1403880508342; __utmc=119922954; __utmz=119922954.1403874641.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)",
    "Referer":"http://www.simsimi.com/talk.htm", 
    "User-Agent":"Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166  Safari/535.19",
}

class Simsimi:
    def __init__(self):
        self._opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor());
        
    def ask(self, q):
        data = {
            "lc":"ch",
            "ft":"0.0",
            "req":q,
            "fl":"http://www.simsimi.com/talk.htm",
        };
        request = urllib.request.Request(URL_ASKSIMSIMI + urlencode(data), headers = talkHeader);
        ret = json.loads(self._opener.open(request).read().decode("utf-8"));
        if(ret["result"] == 200 and ret["sentence_link_id"] != 1):
            return ret["sentence_resp"];
        return None;
        
    def teach(self, q, asw):
        pass;
        
def main():
    robot = Simsimi();
    print(robot.ask("sb"));
    
if(__name__ == "__main__"):
    main();





#----------------------------------------------------------------------------------(分割线, 以下内容已失效。。。)--------------------------------------------------------------------------------------------------


大笑找了2个接口,,,用来做聊天机器人(后面应该会写一个贴吧自动回复的机器人。所以先弄下这个),,,有需要就拿去用吧。


小i机器人的。。。。(已失效);

# coding=gbk

import urllib;
import urllib.request;
import hashlib;
import random;
from urllib.parse import urlencode;

realm = "xiaoi.com";
menthod = "POST";
uri = "/robot/ask.do";
string = "abcdefghijklmnopqrstuvwxyz0123456789";

#请求头;
headers = {
        "User-agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 LBBROWSER",
        "Cache-Control": "no-cache",
        "Pragma":"no-cache",
        "Host":"nlp.xiaoi.com",
        "Connection":"Keep-Alive",
        "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
        "X-Requested-With":"XMLHttpRequest",
        "X-Auth":"",
        };

#请求的问题;
data = {
        "question":"",
        "userId":"sen506",
        "type":"0",
        };

#生成指定位数的随机数;
def createRand(length):  
    rndStr = ""
    for i in range(0, length):
        rndStr += random.choice(string);
    return rndStr;

#生成X-Auth请求头;
def createXAuth(appKey, secretKey):
    nonce = createRand(40);

    sha1 = hashlib.sha1();
    sha1.update("{0}:{1}:{2}".format(appKey, realm, secretKey).encode("utf-8"))
    ha1 = sha1.hexdigest();

    sha2 = hashlib.sha1();
    sha2.update("{0}:{1}".format(menthod, uri).encode("utf-8"));
    ha2 = sha2.hexdigest();

    sha3 = hashlib.sha1();
    signature = sha3.update("{0}:{1}:{2}".format(ha1, nonce, ha2).encode("utf-8"));
    signature = sha3.hexdigest();

    return "app_key=\"{0}\",nonce=\"{1}\",signature=\"{2}\"".format(appKey, nonce, signature);


class xiaoi:
    def __init__(self, appKey = "", secretKey = ""):
        self.setAppKey(appKey);
        self.setSecretKey(secretKey);
        self._request = urllib.request.Request("http://nlp.xiaoi.com/robot/ask.do", headers);

    def ask(self, qs):
        self._request.headers["X-Auth"] = createXAuth(self._appKey, self._secretKey);

        data["question"] = qs;
        try:
            return urllib.request.urlopen(self._request, urlencode(data).encode("utf-8")).read().decode("utf-8");
        except:
            return "Error";

    def setAppKey(self, appKey):
        self._appKey = appKey;

    def setSecretKey(self, secretKey):
        self._secretKey = secretKey;

def main():
    robot = xiaoi("", "");
    for i in range(1, 100):
        print("问:", end = "");
        question = input();
        print("答:" + robot.ask(question));


if __name__ == "__main__":
    main();

main函数中的xiaoi("", "")引号里面需要传入2个参数,一个是appKey,另一个是secretKey,,这2个注册一个帐号就有了。。地址 小i智能云平台



效果图。。


个人感觉小i机器人有点弱。。。。。。。


小黄鸡的。。。。(这个是网页版的。。收费的api实在用不起。。。)(已失效)

# -*- coding: gbk -*-

import urllib;
import urllib.request;
import json;
from urllib.parse import urlencode;

# 请求头
simsimiHeaders = {
                    "Connection":"keep-alive",
                    "Content-Type":"application/json; charset=utf-8",
                    "Host":"www.simsimi.com",
                    "Referer":"",
                    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36 LBBROWSER",
                    "X-Requested-With":"XMLHttpRequest",
                  };

# 调教内容
data = {
        "req":"",
        "resp":"",
        "lc":"ch"
        };

class simsimiWeb:
    def __init__(self):
        self.setOpener();

    def ask(self, qs):
        if(not qs.startswith("teach") and not qs.endswith("teach")):
            return self._ask(qs);
        else:
            return self._teach(qs);

    def _ask(self, qs):
        self._setType("ask");
        request = urllib.request.Request("http://www.simsimi.com/func/req?{0}&lc=ch&ft=0.0".format(urlencode({"msg":qs})), headers = simsimiHeaders);
        result = json.loads(urllib.request.urlopen(request).read().decode("utf-8"));
        if(result["result"] == 100):
            return result["response"];
        elif(result["result"] == 404):
            return """
            这是SimSimi不懂的话! 你可以教我哦.
            example:
                teach|问题|回答|teach
            """;
        else:
            print(result);
            return "Error";

    def _teach(self, word):
        string, qs, asw, string = word.split("|");
        if(string == "" or qs == "" or asw == ""):
            return "格式错误,或者问题、回答为空!";
        self._setType("teach");
        request = urllib.request.Request("http://www.simsimi.com/func/teach", headers = simsimiHeaders);
        data["req"] = qs;
        data["resp"] = asw;
        result = json.loads(urllib.request.urlopen(request, json.dumps(data).encode("utf-8")).read().decode("utf-8"));
        if(result["result"] == 200):
            return result["msg"];
        else:
            print(result);
            return "教的过程中出现错误。。。";        

    def _setType(self, type):
        if(type == "ask"):
            simsimiHeaders["Referer"] = "http://www.simsimi.com/talk.htm";
        elif(type == "teach"):
            simsimiHeaders["Referer"] = "http://www.simsimi.com/teach.htm";

    def setOpener(self):
        opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor());
        urllib.request.install_opener(opener);

def main():
    simsimiRobot = simsimiWeb();
    for i in range(0, 1000):
        print("问:", end = "");
        question = input();
        print("答:" + simsimiRobot.ask(question));

if(__name__ == "__main__"):
    main();

效果图。。(带调教功能。。)




有一个14位数。由 2个1 2个2 2个3 2个4 2个5 2个6 2个7组成!其中,两个1中有一个数字,2个2中有2个数字……2个7中有7个数字入:73625324765141

// 2016/2/21 10:32 准备再次解答这个问题了。小学的时候使用人工枚举方法,这个我不擅长!现在决定用程序来解决了! // 2016/2/21 23:31 初步解决了!!!! ...
  • wb4916
  • wb4916
  • 2016年02月21日 23:33
  • 419

求一些随机数中连续的数(2个或者2个以上)的和

求一些随机数中连续的数(2个或者2个以上)的和 比如{1,2,7,3,4,5,9,0,2,3},则连续的数(2个或者2个以上)的和Sum为:Sum=(1+2)+(3+4+5)+(2+3)=20; ...
  • zyh900906
  • zyh900906
  • 2013年10月12日 17:13
  • 380

C# 将2个foreach循环转为2个for循环

首先,需要转化的foreach循环如下 foreach (WSSyd syd in wssydj.Syds) { int yaopinind...
  • fu222cs98
  • fu222cs98
  • 2013年06月08日 22:14
  • 1302

100层楼扔2个鸡蛋、3个鸡蛋……

原题目 现有2个鸡蛋,楼高100层,假设从n层楼及以上扔下会摔碎,n层以下不会,那么怎样扔能以最小的次数得到n? 分析 最先想起来的是二分法的题目:100层最少需要扔多少次鸡蛋才能求得n?答案是cei...
  • caozhankui
  • caozhankui
  • 2014年04月16日 03:12
  • 17557

如何判断2个线段相交

判断 2 个线段相交有很多方法,最直接的方法就是直接计算两条直线的交点,然后看看交点是否分别在这两条线段上。这样的方法很容易理解,但是代码实现比较麻烦。还有一种常用的方法是通过向量叉积来判断的,这种方...
  • qq826309057
  • qq826309057
  • 2017年04月29日 00:02
  • 177

实现2个按钮的程序

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class TwoButtons { JFrame ...
  • leafinsnowfield
  • leafinsnowfield
  • 2015年08月09日 11:12
  • 194

收藏2个常用的进度条

免积分下载代码activity_main.xml主页布局就2个button,分别弹出不同效果的2个进度条...
  • u013210620
  • u013210620
  • 2016年08月12日 13:25
  • 356

《4》Http的2个例子

一个用HttpURLConnection上传文件的例子 第一步:为了符合Http的报头规则,我们要获取,浏览器进行上传行为的标准报头 用html...
  • qq_25778369
  • qq_25778369
  • 2016年01月27日 14:39
  • 151

2个半小时 学PERL

http://qntm.org/files/perl/perl.html   2个半小时 学PERL Perl是一个动态的,动态类型,高级,脚本(解释)语言与PHP和Python语...
  • zhaoyangjian724
  • zhaoyangjian724
  • 2015年01月08日 14:56
  • 687

WAMP橙色 1/2个服务正在运行 80端口正常

今天使用wampserver 在启动的时候居然一直停留在黄色的server offline 状态 1。 启动 CMD 将 \wampServer\bin\apache\Apache2.2.21\b...
  • liuchi2985682
  • liuchi2985682
  • 2017年11月06日 01:43
  • 375
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2个聊天机器人
举报原因:
原因补充:

(最多只允许输入30个字)