机器人是什么?可以吃吗?

嗯,他可以和你聊天,不能吃哦。

首先需要到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之图灵聊天机器人的更多相关文章

  1. 使用图灵机器人api搭建微信聊天机器人php实现

    之前通过hook技术实现了微信pc端发送消息功能,如果在结合图灵机器人就能实现微信聊天机器人. 代码下载:http://blog.yshizi.cn/131.html 逻辑如下: 下面我简单介绍一下步 ...

  2. 【Python+postman接口自动化测试】(8)以青云客机聊天器人和图灵聊天机器人接口示范python发送get和post

    以青云客机器人和图灵机器人接口示范python发送get和post 发送请求,我们这里主要使用Python的一个第三方包(需要先安装):requests. Python3自带的http.client和 ...

  3. vue-miniQQ——基于Vue2实现的仿手机QQ单页面应用(接入了聊天机器人,能够进行正常对话)

    使用Vue2进行的仿手机QQ的webapp的制作,作品由个人独立开发,源码中进行了详细的注释. 由于自己也是初学Vue2,所以注释写的不够精简,请见谅. 项目地址 https://github.com ...

  4. 使用图灵机器人API实现聊天机器人

    使用图灵机器人的API需要先注册,获取key才行,这我就不说了,自己到http://www.tuling123.com/注册一个账号即可. 下面就是一个简单的python调用API实现聊天机器人的简易 ...

  5. QQ 聊天机器人API

    QQ机器人是腾讯陆续推出的的人工智能聊天机器人的总称. 都说小Q妹妹聪明好学,我们能够教她说话.也能够请他帮忙查询邮编.手机号,或者解释成语.翻译成语,据说她还会查询手机号码归属地.应用科学计算器. ...

  6. 微信的自动回复&接入聊天机器人

    今天偶尔发现了一个有趣的python库--itchat,可以实现微信的自动回复.防撤回,结合图灵机器人还能实现聊天机器人的作用 简单介绍一下配置与工具 win7旗舰版  pycharm  python ...

  7. Python进阶开发之网络编程,socket实现在线聊天机器人

    系列文章 √第一章 元类编程,已完成 ; √第二章 网络编程,已完成 ; 本文目录 什么是socket?创建socket客户端创建socket服务端socket工作流程图解socket公共函数汇总实战 ...

  8. 【Python撩妹合集】微信聊天机器人,推送天气早报、睡前故事、精美图片分享

    福利时间,福利时间,福利时间 如果你还在为不知道怎么撩妹而烦恼,不知道怎么勾搭小仙女而困惑,又或者不知道怎么讨女朋友欢心而长吁短叹. 那么不要犹豫徘徊,往下看.接下来我会分享怎么使用 Python 实 ...

  9. QQ 聊天机器人小薇 2.1.0 发布!

    本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...

随机推荐

  1. [转]-nohup-真正的Shell后台运行

    &方式: Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行. 比如我们要运行mysql在后台: /usr/local/mysql/bin/ ...

  2. 基础Linux命令总结

    简单命令Linux ls 列出当前文件目录下的文件(只显示文件名) pwd 显示当前操作的路径 cd 跳转路径 ls -a 可以把隐藏的文件显示出来 ,另外,创建隐藏文件的命令是 touch.123. ...

  3. 在 .NET 中,扫描局域网服务的实现

    在最近负责的项目中,需要实现这样一个需求:在客户端程序中,扫描当前机器所在网段中的所有机器上是否有某服务启动,并把所有已经启动服务的机器列出来,供用户选择,连接哪个服务.注意:这里所说的服务事实上就是 ...

  4. Flask中的单例模式

    1,基于文件的单例模式: import pymysql import threading from DBUtils.PooledDB import PooledDB class SingletonDB ...

  5. Sql的基础知识提升(二)

    二.提升 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access 可用) 法一:select * into b from a where 1<>1(仅用于 SQlServe ...

  6. 二分查找c++简单模板

    //数组a[]中有n各元素,已经按升序排序,待查找的元素x sort(a,a+n); //升序排序 template<class Type> int BinarySearch(Type a ...

  7. 用gcc编译c语言程序以及其编译过程

    对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!! 1.预编译 --> 2.编译 --> 3.汇编 --> 4.链接- ...

  8. solr6.5的安装与配置

    环境介绍 solr 6.5 tomcat8 jdk1.8 win7系统 一.下载solr安装包 下载地址:http://www.apache.org/dyn/closer.lua/lucene/sol ...

  9. Linux文件链接hard link与symbolic link

    Linux中文件链接有两种方式,一种是hard link,又称为硬链接:另一种是symbolic link,又称为符号链接.要区分两者的不同要回顾Linux常用的ext2文件系统.这种文件系统使用in ...

  10. CMD命令操作MySql数据库详解

    第一:mysql服务的启动和停止 1.  net stop mysql 2.  net start mysql 第二:登录 mysql –u用户名 [–h主机名或者IP地址] –p密码 例如:mysq ...