聊天机器人开发(电报+ YouTube)

为什么甚至出现在这里?

最近,我写了一篇有关使用laravel + botman进行电报的php bot开发的文章。 我引用他们写的第一件事是“用大炮朝麻雀射击”。 我同意这一点,甚至在开发过程中就意识到了这一点,但是我对laravel感兴趣。

图片

现在,我正在使用纯PHP(无约束)和电报API开发一个机器人,并且由于有很多关于类似主题的文章,我们将稍微介绍一下Google API(youtube api)。 希望您觉得学习youtube API有趣且有用。

一个小题外话。 目前,我以前端程序员的身份工作,并且仅出于自己的喜好使用php(尽管这是多么的荣幸)。 服务器端可能存在一些愚蠢的错误,但是它可以正常工作,在我接受培训时,这已经足够了。

问题陈述


一天晚上,我想到了将bot和youtube连接起来的想法,当时我什至都不怀疑api google的存在。 它需要一个机器人,当YouTube频道上发布新视频时,它将在我的机器人中推送通知。

原则上,该功能非常简单,但是如何与youtube一起使用? 事实证明google本身可以解决此问题,其名称为google API。 它允许您使用公司的所有应用程序,但是我只对youtube感兴趣。

定制开发


碰巧,在研究youtube api的过程中,找到了针对我的问题的优雅解决方案,该解决方案由api文档本身提供。 但是首先关于api。 要开始使用它,您需要转到Google控制台并选择所需的api选项。 之后,路径仅位于文档中或stackoverflow上。 我必须马上说没有文档的俄语版本,也没有课程。 最好是对英语有最少的了解或通过打字来行动。

看起来像这样。 您进入Google控制台,创建您的项目并选择所需的API。

图片

现在解决问题。 在阅读文档时,我发现了pubsubhubbub.appspot.com/subscribe服务(由Google自己显示),该服务可让您链接youtube和您的应用程序。 如何运作? 它基于webhook原理工作。 您插入要收听的频道的youtube,并在频道上进行任何操作(添加视频,删除,更改),然后将数据接收到脚本中。

图片

回调网址-一个脚本,将从Google接收数据。
主题URL是您要收听的频道。

好的,“模式”字段可让您选择所需的内容,订阅或取消订阅收听。

让我们开始编写代码,首先,让我们设置用于youtube的脚本。 我将所有内容都写在一个文件中 那是一个测试+代码,实际上还远远不够。 提交订阅请求后,需要进行确认。 使用Google搜索,您可以在每个人喜欢的网站上找到答案,有关stackoverflow的评论之一表明。

$video = "null"; if (isset($_GET['hub_challenge'])) { echo $_REQUEST['hub_challenge']; } else { $video = parseYoutubeUpdate(file_get_contents('php://input')); } function parseYoutubeUpdate($data) { $xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA); $video_id = substr((string)$xml->entry->id, 9); $channel_id = substr((string)$xml->entry->author->uri, 32); $published = (string)$xml->entry->published; return array( 'video_id'=>$video_id, 'channel_id'=>$channel_id, 'published'=>$published ); } 

在这里,为了方便起见,我们创建了一个变量,在其中我们需要有关视频的信息。 接下来的两行可让您确定是否可以确认来自pubsubhubbub的请求,如果可以,请确认,如果不是,则意味着数据来自youtube,我们需要对其进行处理。 在parseYoutubeUpdate函数中,我们处理响应,获得所需的所有信息。

在这里值得讨论并讲解一种特殊的(我认为,我可能会误解)YouTube使用(作为答案)的数据形式,据我所知,它称为原子(不要与IDE混淆,或者这是常规的xml ...对其经验很少) 。 看起来像这样(来自youtube的一小部分答案):

 <id>yt:video:eE5mpblYpdY</id> <yt:videoId>eE5mpblYpdY</yt:videoId> <yt:channelId>UCGqKr3O5ub-O7zEKx_qeHUQ</yt:channelId> <title>20b3560a49 1080</title> <link rel="alternate" href="https://www.youtube.com/watch?v=hgCQ378xNus"/> <author> <name>not Epic</name> <uri>https://www.youtube.com/channel/UCGqKr3O5ub-O7zEKx_qeHUQ</uri> </author> <published>2019-07-14T05:10:49+00:00</published> <updated>2019-07-14T05:11:07.600177664+00:00</updated> 

返回parseYoutubeUpdate()。

在一个函数中,我们将响应转换为xml格式。
我们将所需的数据写入变量。
然后我们返回一个包含此数据的数组。

我们通过电报。 首先,我想说的是,****与使用botman相比要容易得多。 如果您只想为电报开发机器人,请不要使用允许您为不同平台开发机器人的库。 这是没有道理的...会有更多的问题。 即使对于刚接触php并且对OOP知识很少的初学者,电报API也是非常清晰和简单的。

因此,更接近要点,更接近代码。 我们需要创建一个机器人并将其绑定到脚本。 我希望您可以创建一个机器人。 我们从漫游器编写令牌并创建一个请求

 const TOKEN = "6826815*******Yme99*****9kjzgVi*****3S******"; $url = 'https://api.telegram.org/bot' . TOKEN . '/sendMessage'; 

现在我们只需要向电报服务器发送请求即可。

 $params = [ 'chat_id' =>712531723, "text" => $linkVideo, ]; $url = $url . '?' . http_build_query($params); 

我们创建了必要的参数,对我来说,这是一个聊天ID(如果它在生产中显示了漫游器,则有必要将数据库中的所有ID保存为垃圾邮件)和一条短信。

您可能已经注意到,我将链接作为简单消息而不是视频传递。 据我了解,电报仅在将视频上传到服务器后才传输视频,否则就不会……+我需要查看视频的预览图片。

现在我们的机器人将收到退出/视频编辑的通知。 看起来像这样:

图片

游戏结束 我都拥有 该代码的最大缺点是它位于单个文件中,但是对我来说,分隔10行代码没有意义。

资料来源-github

Source: https://habr.com/ru/post/zh-CN463207/


All Articles