用Flutter实现小Q聊天机器人(一)
用Flutter实现小Q聊天机器人(二)
用Flutter实现小Q聊天机器人(三)
用Flutter实现小Q聊天机器人(四)
用Flutter实现小Q聊天机器人(五)

GitHub:https://github.com/baiyuliang/Qrobot_Flutter

前几篇我们基本实现了一个简单的聊天界面,也基本掌握了如何通过Flutter去完成这样一个布局及功能的实现,但离我们标题所需要实现的还差那么一步,既然是聊天机器人,那就不能只做本地的聊天了,网络请求+机器人API是必须的啦!

首先说一下本项目用到的机器人API是腾讯AI平台:https://ai.qq.com/doc/nlpchat.shtml,大家可以到这里申请,然后会得到APP_ID和APP_KEY,就可以调用它的API并带入参数请求机器人回复了。

Dart网络请求需要引入一个库:http: ^0.12.0

具体写法:

import 'package:http/http.dart' as http;http.get(Uri.parse(url), headers:{}).then((res){ }).catchError((error){ });
http.post(Uri.parse(url), headers:{},body:).then((res){ }).catchError((error){ });

http常用的get、post、put、delete方法全部都有提供,根据接口类型使用不同方法,headers根据需要传入,格式如headers: {'Content-Type': 'application/x-www-form-urlencoded'},then就是请求结果回调,res就是请求结果,catchError是请求异常捕获,另外post请求时参数需要用body传入,如:body:params,params是key1=value1&key2=value2&…的String类型,这样一个网络请求就完成了,是不是好简单!

那我们 就来先试着请求一下机器人API,文档中已经给出API的url为:https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat
,我们先忽略参数,直接去请求一下,来实验一下上述http请求方法是否可用:

import 'package:http/http.dart' as http;main() {http.post("https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat").then((res) {print(res.body);});
}

运行结果:

{"ret": 4096,"msg": "paramter invalid","data": {"session": "","answer": ""}
}

网络请求没毛病,只是接口返回了错误信息:参数错误!那么接下来我们就要看文档,看这个接口到底需要怎样的参数:

其中最主要的就是“sign”这个参数,点击接口鉴权,看看如何生成sign:

第一步:参数升序:

这个很简单,参数已知的,我们按顺序排列一下就行了:app_id,nonce_str,question,session,time_stamp;

第二步:拼接并编码:

按上述顺序进行键值对拼接,并且value部分需要URL编码,其实除了question参数是我们输入的,大部分为中文,需要去编码外,其它的都不需要编码,因此只对question编码即可;我们知道,在java中,直接调用系统方法URLEncoder.encode()方法编码即可,那在dart中用什么呢?这个需要dart提供的Uri这个类的Uri.encodeFull方法就可以了;

第三步:拼接appkey:

将&app_key=xxx继续拼接在第二步拼接的参数后面;

第四步:MD5后大写:

dart中md5方法需要导入两个库:

crypto: ^2.0.6
utf: ^0.9.0+5

然后就可以调用md5.convert方法,但convert需要传入的参数为字节数组,那么就需要先对参数进行编码utf8.encode(params)得到字节数组后再传入:

var sign = md5.convert(utf8.encode(params));

最后一步转换为大写,就很简单了,直接调用String的方法:sign.toString().toUpperCase()就行了!

另外,Flutter中获取当前时间可以用DateTime:

DateTime.now().millisecondsSinceEpoch

得到的是毫秒,类似于安卓的:

System.currentTimeMillis()

由于参数中需要传入秒,那么就需要/1000:

DateTime.now().millisecondsSinceEpoch/1000

但其并不会像java一样结果为整数,而是一个double类型,因此我们需要强制转换,dart中强制转化也不像java中直接在代码前面加转换类型,而是用到as

DateTime.now().millisecondsSinceEpoch/1000 as int

其可以简化为:

DateTime.now().millisecondsSinceEpoch ~/ 1000

“~”这个符号是不是很神奇?

好了,参数算完,我们就来试验一下效果:

import 'dart:convert';
import 'package:crypto/crypto.dart';
import 'package:http/http.dart' as http;var url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat";
var app_id = "";//填入自己申请的appid
var app_key = "";//填入自己申请的appkeymain() {getText("你好");
}getText(question) {var params ="app_id=$app_id&nonce_str=fa577ce340859f9fe&question=${Uri.encodeFull(question)}&session=10000&time_stamp=${DateTime.now().millisecondsSinceEpoch ~/ 1000}";http.post(Uri.parse(url),headers: {'Content-Type': 'application/x-www-form-urlencoded'},body: params + "&sign=" + getSign(params)).then((res) {print(res.body);}).catchError((error) {print(error);});
}//获取签名
getSign(params) {params += "&app_key=$app_key";var sign = md5.convert(utf8.encode(params));return sign.toString().toUpperCase();
}

运行结果:

注意:appid和appkey需要填入你自己申请的!

既然有接口请求,那么就要有json解析转换了,安卓中我们常用的是谷歌的GSON,很方便,而Dart中需要用到上面的一个库:dart:convert

jsonDecode(json)

需要注意的是,这个方法解析后得到的是一个map,比如我要取字段ret,就要这么写:

jsonDecode(json)['ret']

最终,我们将其封装为一个类:

import 'dart:convert';class RobotMessage {int ret;var msg;RobotData data;RobotMessage(json) {var map = jsonDecode(json);ret = map['ret'];msg = map['msg'];var _data = map['data'];data = RobotData(_data);}
}class RobotData {var session;String answer;RobotData(data) {session = data['session'];answer = data['answer'];}
}

那么在接口请求完成后,我们就可以直接用:

RobotMessage robotMessage = RobotMessage(res.body);

来解析并转换为RobotMessage 对象了!

UI和接口都完成了,那么结合起来后就基本上实现了一个简单的聊天机器人的应用了!

另外,在安卓中我们常用EventBus来进行通信,在Dart中也可以使用的,引入库:event_bus: ^1.0.3,使用方法:

1.初始化:
初始化需要在你生命的Event类中初始化,如:

EventBus eventBus=EventBus();class EventTest{}

一定要注意,初始化代码要写在class之外;

2.发送Event:

 eventBus.fire(EventTest());

3.接收Event:

   eventBus.on<EventTest>().listen((event) {});

用Flutter实现小Q聊天机器人(五)相关推荐

  1. 用Flutter实现小Q聊天机器人(二)

    用Flutter实现小Q聊天机器人(一) 用Flutter实现小Q聊天机器人(二) 用Flutter实现小Q聊天机器人(三) 用Flutter实现小Q聊天机器人(四) 用Flutter实现小Q聊天机器 ...

  2. 用Flutter实现小Q聊天机器人(四)

    用Flutter实现小Q聊天机器人(一) 用Flutter实现小Q聊天机器人(二) 用Flutter实现小Q聊天机器人(三) 用Flutter实现小Q聊天机器人(四) 用Flutter实现小Q聊天机器 ...

  3. 用Flutter实现小Q聊天机器人(三)

    用Flutter实现小Q聊天机器人(一) 用Flutter实现小Q聊天机器人(二) 用Flutter实现小Q聊天机器人(三) 用Flutter实现小Q聊天机器人(四) 用Flutter实现小Q聊天机器 ...

  4. 用React实现小Q聊天机器人

    前几篇讲过用Vue实现小Q聊天机器人,既然用了Vue,那React自然也是少不了的,本项目实现效果与vue实现的效果完全一样: GitHub源码:https://github.com/baiyulia ...

  5. 用Vue实现小Q聊天机器人(二)

    GitHub:https://github.com/baiyuliang/Qrobot_Vue 项目完整结构: 接下来,开始着手修改刚刚创建完成的项目! 打开main.js,引入相关插件,本项目的网络 ...

  6. NLP微信小程序聊天机器人

    今天把两年前大二时候的小程序又拿来玩了一下,决定开源这个小项目 一个NLP微信小程序聊天机器人,前端就一个页面,后端是php的,可以接图灵等等各种api,也可以自己写个python的接口做NLP算法测 ...

  7. 使用TensorFlow.js的AI聊天机器人五:创建电影对话聊天机器人

    目录 设置UpTensorFlow.js代码 康奈尔电影报价数据集 通用句子编码器 电影聊天机器人在行动 终点线 下一步是什么? 下载项目文件-9.9 MB TensorFlow+JavaScript ...

  8. 10分钟构建人人都能学会的个性化聊天机器人-使用AIML(王小草博客)

    本文主要介绍什么是aiml, 如何python环境安装aiml,如何使用与制作一个属于自己的聊天机器人 1 aiml初识 1.1 demo展示 用aiml写了一个简单的微信聊天机器人的demo,暂且叫 ...

  9. 聊天机器人是一场真正的革命?未来将成为私人小秘书

    著名的网络媒体"BackChanel"日前撰文称,聊天机器人作为一项热门的技术,将会颠覆手机应用(APP),在个人生活.公司客服.政府服务方面都有很好的应用. 文章将此称为即将到来 ...

最新文章

  1. android 打开wifi并链接到制定ip,当设备连接到Android中的WiFi时,如何获取蜂窝网络的IP地址...
  2. DLINK DES3828三层交换机配置实例
  3. 如何将catia装配件附材料_在网上买的快餐桌椅如何安装?餐厅快餐桌椅安装顺序与流程知识...
  4. 蒙昧的意思_蒙昧的意思
  5. 二级联动菜单ajax刷新,jquery json ajax 二级联动菜单实例
  6. 2021.NET大会日程首发!行程亮点全曝光!
  7. Spring boot 上传文件大小限制
  8. 精通ASP.NET MVC ——路由
  9. Laravel系列教程一:安装及环境配置
  10. sqlserver 建表语句
  11. 面试明明聊的很开心,为什么要挂我!
  12. javascript 模块加载器——coolie
  13. word怎么显示计算机数字,在word中输入数字时为什么出现符号
  14. matlab八节点六面体程序,八节点六面体等参数元计算程序
  15. Excel如何实现间隔插入空白行
  16. Java 程序员们值得一看的好书推荐
  17. win10左右声道音量不一致的解决方法
  18. python 求平方根
  19. matlab 沃尔什矩阵,压缩感知——沃尔什-哈达玛(WHT)变换与逆变换的Matlab代码实现...
  20. Qt 之 QDateEdit 和 QTimeEdit

热门文章

  1. 从ABC模式入手的合理情绪疗法
  2. django - migrate 重置
  3. 理财通app的设计与实现(二)
  4. docker 安装clickhouse-server+clickhouse-client+Tabix
  5. 2021SC@SDUSC-PALISADE(九)BGV的API分析
  6. 循环定时器HMI(宏指令)实现(附源代码)
  7. 用纯CSS3绘制萌系漫画人物动态头像
  8. 【FI模块学习笔记】 资本公积概述
  9. VMware 安装 银河麒麟高级服务器操作系统 V10 + QT 开发环境搭建
  10. 【WEB】解决两个图像重叠的问题