日常API之图灵聊天机器人
机器人是什么?可以吃吗?
嗯,他可以和你聊天,不能吃哦。
首先需要到www.tuling123.com注册一只KEY,你才能调用机器人API哦
一、布局
(控制台程序可以跳过这一步)本文以WPF为示例来讲解。
首先我们需要一只聊天界面,大概需要这些组件:
“发送”Button一只 TextBox一条 ScrollViewer和WrapPanel各一只。
这里我把它写成UserControl方便使用,喵。
以下是XAML布局:(ScrollViewer的Style可以删掉(如果报错))
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Lemon_App"
xmlns:Forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" x:Name="userControl" x:Class="Lemon_App.IMBOX"
mc:Ignorable="d" Loaded="UserControl_Loaded" SizeChanged="UserControl_SizeChanged">
<Grid>
<Border Height="1" VerticalAlignment="Bottom" Background="#FFE6E6E6" Margin="0,0,0,90"/>
<TextBox x:Name="textBox1" TextWrapping="Wrap" FontSize="14" BorderThickness="0" BorderBrush="{x:Null}" SelectionBrush="#FF31C27C" KeyDown="textBox1_KeyDown" Height="90" VerticalAlignment="Bottom" Background="{x:Null}"/>
<Border BorderThickness="1" Background="#B2007ACC" CornerRadius="5" HorizontalAlignment="Right" Width="57" Height="30" VerticalAlignment="Bottom" Margin="3">
<Label x:Name="label" Content="发送" Margin="9.919,1.833,4.331,-1" Foreground="White" MouseDown="label_MouseDown" Height="27.167" VerticalAlignment="Top"/>
</Border>
<ScrollViewer x:Name="Sllv" PanningMode="Both" Margin="0,0,0,90" BorderBrush="{x:Null}" Template="{DynamicResource SCS}">
<WrapPanel x:Name="Robot" Height="Auto" SizeChanged="Robot_SizeChanged" Width="{Binding ActualWidth, ElementName=userControl, Mode=OneWay}"/>
</ScrollViewer>
</Grid>
</UserControl>
部分事件处理代码:
public IMBOX()
{
InitializeComponent();
} private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
Robot.Width = this.ActualWidth;
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
label_MouseDown(null, null);
}
} private void Robot_SizeChanged(object sender, SizeChangedEventArgs e)
{
double d = this.Sllv.ActualHeight + this.Sllv.ViewportHeight + this.Sllv.ExtentHeight;
this.Sllv.ScrollToVerticalOffset(d);
} private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
{
Robot.Width = this.ActualWidth;
foreach(var o in Robot.Children)
{
(o as UserControl).Width = this.ActualWidth;
}
}
//以上负责自适应大小
private async void label_MouseDown(object sender, MouseButtonEventArgs e){
//待会处理机器人事件时用到
}
接着是聊天气泡,可以分为机器人(在左边)、自己(在右边)以下是XAML:
机器人:(名称及头像可以自己定义)
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Lemon_App"
x:Class="Lemon_App.Robot"
mc:Ignorable="d" Height="Auto" Width="Auto">
<Grid> <Border x:Name="Image" BorderThickness="0" HorizontalAlignment="Left" Margin="12,12,0,0" Width="30" CornerRadius="50" Height="30" VerticalAlignment="Top">
<Border.Background>
<ImageBrush ImageSource="/Lemon App;component/Page/Lemon App Ico.ico"/>
</Border.Background>
<!--ed:RegularPolygon Fill="White" InnerRadius="0.47211" Margin="5" PointCount="5" Stretch="Fill"/!-->
</Border>
<Border Width="Auto" Height="Auto" Margin="55,35,0,0" CornerRadius="5" VerticalAlignment="Top" HorizontalAlignment="Left" Background="#FF3399FF">
<TextBlock x:Name="Te" Height="Auto" TextWrapping="Wrap" Width="Auto" d:LayoutOverrides="LeftPosition, RightPosition" Cursor="" Margin="6" Foreground="White" FontSize="14" Text="欢迎回来"/>
</Border>
<TextBlock Margin="50,15,40,35.78" TextWrapping="Wrap" Text="小萌机器人" Foreground="#FF2D2D30"/>
<Border HorizontalAlignment="Left" Height="16" Margin="46,38,0,0" VerticalAlignment="Top" Width="10" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-60"/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
<Path Data="M68.2,31.8c-2.3-2.3-6.1-2.3-8.4,0l-56,56C0,91.6,2.7,98,8,98h112c5.3,0,8-6.4,4.2-10.2L68.2,31.8z" Fill="#FF3399FF" Stretch="Fill" Margin="0,0,0,-2.912"/>
</Border> </Grid>
</UserControl>
事件处理代码:
public partial class Robot : UserControl
{
public Robot()
{
InitializeComponent();
RenderOptions.SetBitmapScalingMode(Image, BitmapScalingMode.Fant);
}
public Robot(string Text)
{
InitializeComponent();
Te.Text = Text;
RenderOptions.SetBitmapScalingMode(Image, BitmapScalingMode.Fant);
}
}
接下来是自己的XAML:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Lemon_App"
x:Class="Lemon_App.User"
mc:Ignorable="d" Height="Auto" Width="Auto" Loaded="UserControl_Loaded">
<Grid> <Border x:Name="bd" BorderThickness="0" HorizontalAlignment="Right" Margin="0,12,12,0" Width="30" CornerRadius="50" Height="30" VerticalAlignment="Top" Background="#FF007ACC"/>
<Border Width="Auto" Height="Auto" Margin="0,35,55,0" CornerRadius="5" VerticalAlignment="Top" HorizontalAlignment="Right" Background="#FF3399FF">
<TextBlock x:Name="Te" Height="Auto" TextWrapping="Wrap" Width="Auto" d:LayoutOverrides="LeftPosition, RightPosition" Cursor="" Margin="6" Foreground="White" FontSize="14" Text="啦啦啦"/>
</Border>
<Grid HorizontalAlignment="Right" Height="18" Margin="0,16,45,0" VerticalAlignment="Top" Width="Auto">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="UName" Margin="0,0,1.636,0" TextWrapping="Wrap" Text="小萌机器人" Foreground="#FF2D2D30" HorizontalAlignment="Right" Width="Auto"/>
</Grid>
<Border HorizontalAlignment="Right" Height="16" Margin="0,38,46,0" VerticalAlignment="Top" Width="10" RenderTransformOrigin="0.5,0.5">
<Border.RenderTransform>
<TransformGroup>
<RotateTransform Angle="60"/>
<TranslateTransform/>
</TransformGroup>
</Border.RenderTransform>
<Path Data="M68.2,31.8c-2.3-2.3-6.1-2.3-8.4,0l-56,56C0,91.6,2.7,98,8,98h112c5.3,0,8-6.4,4.2-10.2L68.2,31.8z" Fill="#FF3399FF" Stretch="Fill" Margin="0,0,0,-2.912"/>
</Border> </Grid>
</UserControl>
事件处理代码:
public partial class User : UserControl
{
public User()
{
InitializeComponent();
}
public User(String Text)
{
InitializeComponent();
RenderOptions.SetBitmapScalingMode(bd, BitmapScalingMode.Fant);
Te.Text = Text;
} private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
if (System.IO.File.Exists(He.Settings.UserImage))
{
var image = new System.Drawing.Bitmap(He.Settings.UserImage);
bd.Background = new ImageBrush(image.ToImageSource());
}
UName.Text = He.Settings.RobotName;
}
}
其中的He.Settings.UserImage可以替换成你的图像路径,或直接在XAML中定义
二、编码
我们有了KEY就可以向机器人发送请求惹:
http://www.tuling123.com/openapi/api?key={0}&info={1}&userid={2}
{0} : 你注册的KEY
{1} : 对机器人说的话
{2} :(选填,但最好还是填写,用于辨认用户)用户名称或ID
接下来就要对机器人发回的数据进行解码
首先要识别他发回的是什么类型的:(简单的文本或链接)
状态码位于json数据的["code"]处
简单的文本处理:
if ((string)obj["code"] == "" || obj["code"].ToString() == "")
{
User U = new User(textBox1.Text)
{
Width = Robot.ActualWidth,Opacity =
};
Robot Rb = new Robot((string)obj["text"])
{
Width = Robot.ActualWidth, Opacity =
};
Robot.Children.Add(U);
Robot.Children.Add(Rb);
var b = new DoubleAnimation(, TimeSpan.FromSeconds(0.2));
U.BeginAnimation(OpacityProperty, b);
Rb.BeginAnimation(OpacityProperty, b);
}
链接处理:
else if ((string)obj["code"] == "")
{
string i = (string)obj["text"];
User Uu = new User(textBox1.Text)
{
Opacity = ,
Width = Robot.ActualWidth
};
Lemon_App.Robot Rbu = new Lemon_App.Robot((string)obj["url"] + i)
{
Opacity = ,
Width = Robot.ActualWidth,
ToolTip = (string)obj["url"].ToString()
};
Rbu.MouseDown += Rbu_MouseDown;
Robot.Children.Add(Uu);
Robot.Children.Add(Rbu);
var b = new DoubleAnimation(, TimeSpan.FromSeconds(0.2));
Uu.BeginAnimation(OpacityProperty, b);
Rbu.BeginAnimation(OpacityProperty, b);
}
附一只事件处理代码,用于处理用户点击链接时打开浏览器:
private void Rbu_MouseDown(object sender, MouseButtonEventArgs e)
{
Process.Start((sender as Grid).ToolTip.ToString());
}
这样我们就完成了编码工作。
三、测试
接下来就可以和机器人愉快地聊天啦o(* ̄▽ ̄*)ブ
测试成功!( •̀ ω •́ )y
已更新
本教程示例代码(WPF):https://github.com/TwilightLemon/Lime
这次的教程到这里就结束啦,如果喜欢就快快关注我吧!
日常API之图灵聊天机器人的更多相关文章
- 使用图灵机器人api搭建微信聊天机器人php实现
之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...
- 【Python+postman接口自动化测试】(8)以青云客机聊天器人和图灵聊天机器人接口示范python发送get和post
以青云客机器人和图灵机器人接口示范python发送get和post 发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests. Python3自带的http.client和 ...
- vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)
使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...
- 使用图灵机器人API实现聊天机器人
使用图灵机器人的API需要先注册,获取key才行,这我就不说了,自己到http://www.tuling123.com/注册一个账号即可. 下面就是一个简单的python调用API实现聊天机器人的简易 ...
- QQ 聊天机器人API
QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称. 都说小Q妹妹聪明好学,我们能够教她说话.也能够请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. ...
- 微信的自动回复&接入聊天机器人
今天偶尔发现了一个有趣的python库--itchat,可以实现微信的自动回复.防撤回,结合图灵机器人还能实现聊天机器人的作用 简单介绍一下配置与工具 win7旗舰版 pycharm python ...
- Python进阶开发之网络编程,socket实现在线聊天机器人
系列文章 √第一章 元类编程,已完成 ; √第二章 网络编程,已完成 ; 本文目录 什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战 ...
- 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享
福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...
- QQ 聊天机器人小薇 2.1.0 发布!
本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...
随机推荐
- 谈谈关键字new
1.在情人节那天,无意间看到空间有人说,没有对象就new一个,然后就可以........ 程序中我们常用到X a=new X(), new在这里是创建一个对象,也可以叫做创建一个实例,我们先谈谈后半部 ...
- 12、ABPZero系列教程之拼多多卖家工具 拼团提醒功能登录拼多多实现
上篇文章已经完成了整个拼多多拼团提醒功能,本篇继续完成拼多多帐号登录,拼多多帐号登录的目的是为了获取拼团商品的SKU和订单号,便于商家备货. 以下是拼多多官方的后台登录,要实现的功能并不是直接在这里登 ...
- Angular02 通过angular-cli来搭建web前端项目
利用angular-cli的常见命令: npm i --save 包名 -> 软件依赖 npm i --save-dev 包名 -> 开发依赖 ng new 项 ...
- 模板层(template)
模板: 什么是模板? html+模板语法 模板语法: 1 变量:{{}} 深度查询: 通过句点符号 . 过滤器 filter {{var|filter_name}} 2 标签: {% tag %} f ...
- sql针对某一字段去重,并且保留其他字段
今天客户提了一个小需求,希望我能提供一条sql语句,帮助他对数据中 _field 这个字段的值去重,并且保留其他字段的数据.第一反应是select distinct,但这种语句在对某个字段去重时,无法 ...
- dijk
.....................用矩阵存..................... 1 int mp[N][N]; bool p[N]; int dist[N]; void dijk(int ...
- python数据类型(二)
一.List(列表) List(列表) 是 Python 中使用最频繁的数据类型. 列表可以完成大多数集合类的数据结构实现.列表中元素的类型可以不相同,它支持数字,字符串甚至可以包含列表(所谓嵌套). ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- 安装Ubuntu16.04失败
原本安装的是Ubuntu14,但是在使用caffe时总是出错,所以干脆将Ubuntu从14升级到16,结果整出一堆麻烦.在解决这些麻烦的过程也学习了不少系统启动的细节.印证了那句话"如何没有 ...
- 浅析@Deprecated,调用方法时出现横线划掉样式
Deprecated 这个注释是一个标记注释.所谓标记注释,就是在源程序中加入这个标记后,并不影响程序的编译,但有时编译器会显示一些警告信息. 那么Deprecated注释是什么意思呢?如果你经常使用 ...