YouTube用户上传视频时如何调用函数?

Posted

技术标签:

【中文标题】YouTube用户上传视频时如何调用函数?【英文标题】:How to call a function when a YouTube user uploads a video? 【发布时间】:2016-10-21 03:32:34 【问题描述】:

我正在尝试制作一个简单的聊天机器人,只要某个频道上传视频,它就会发送一条消息,最好是带有视频的名称和视频的超链接。

YouTube 的 API 很奇怪,我完全不知道如何处理。

这是我目前所拥有的:

using System;
using System.Linq;
using Google.Apis.Services;
using Google.Apis.YouTube.v3;

YouTubeService service = new YouTubeService(new BaseClientService.Initializer() 
    ApiKey = apiKey,
    ApplicationName = "GoodApp"
);

var getChannel = service.Channels.List("snippet");
getChannel.Id = channelId;

var response = getChannel.Execute();

var channel = response[0]; //now what?

【问题讨论】:

您是否希望它立即发生,或者如果您有一个设置的计时器来检查上传或在页面重新加载时检查上传,它是否仍然有效?如果页面重新加载或计时器正常,那么您可以检查频道的上传数量,看看是否有增加,然后只返回自上次检查以来的新上传。 “检索我的上传”示例可能有用:developers.google.com/youtube/v3/code_samples 您需要将消息发送到哪里?这不是您可以使用 IFTTT 或类似服务实现的吗?见:ifttt.com/channels/youtube/triggers/… 否则,您可以将@31eee384 提到的push notifications 与AWS Lambda 结合起来,以获得免费且无服务器的解决方案(但遗憾的是它不支持C#)。 【参考方案1】:

我放弃了 Google 的 .NET API,因为对于我简单的想法来说,它似乎太神秘了。

相反,我决定使用 RestSharp 直接从 Web 访问 API,并使用 JSON 解析响应。

然后我设置System.Timers.Timer 每 5 分钟检查一次(频道每 30 分钟上传一次,但时间会有所不同)检查尚未检查的视频。

RestClient restClient = new RestClient("https://www.googleapis.com/youtube/v3/");
DateTime lastTimeChecked = DateTime.Now;
Timer timer = new Timer(60 * 5 * 1000);

refreshTimer.Elapsed += CheckVideos;
refreshTimer.Start();

public static void CheckVideos(object source = null, ElapsedEventArgs e = null) 
    var request = new RestRequest(String.Format(
        "search?part=snippet&channelId=0&maxResults=4&order=date&type=video&key=1", 
        channelId, 
        apiKey
    ), Method.GET);

    request.OnBeforeDeserialization = resp =>  resp.ContentType = "application/json"; ;

    var queryResult = restClient.Execute(request);

    YouTubeResponse response = JsonConvert.DeserializeObject<YouTubeResponse>(queryResult.Content);

    foreach (var video in response.items.Reverse<Item>()) 
        if (video.snippet.publishedAt > lastCheckTime)  //actual code to compare is much longer...
            SendMessage(String.Format("Video 0 was uploaded!", video.snippet.title));
        
    

    LastCheckTime = DateTime.Now;

这远非完美,如果视频上传时间不走运,它通常会丢弃视频。显然,基于事件的解决方案将是最佳的。

【讨论】:

看我的问题。【参考方案2】:

使用the YouTube PubSubHubbub service,您可以在频道上传新视频、更改视频标题或更改视频说明时收到推送通知。从该页面引用有关设置的内容:

    设置可以处理传入的 Atom 提要通知的回调服务器。 使用Google 集线器订阅接收推送通知: 将模式设置为subscribe。 (或将模式设置为unsubscribe 以取消订阅。) 将 回调 URL 设置为您在步骤 1 中设置的 URL。 将主题网址设置为https://www.youtube.com/xml/feeds/videos.xml?channel_id=CHANNEL_ID,其中CHANNEL_ID是您要检索其推送通知的YouTube channel ID。 处理发送到您的回调服务器的通知。 [...]

不幸的是,回调服务器不仅仅是几行代码,它取决于您运行的服务器类型。如果您了解 php、AppEngine 或 Go,PubSubHubbub 上的订阅者存储库可能会有所帮助,否则搜索引擎似乎对我有很好的结果。

【讨论】:

以上是关于YouTube用户上传视频时如何调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 从 URL 获取 YouTube 视频 ID

如何使用 PHP 在另一个 youtube 频道上上传一个 youtube 视频

iOS:在我的应用中将视频分享到 youtube

用JAVA调用ffmpeg实现将各种视频格式转为flv时,怎样做出简单操作的界面?

在qthread中停止长时间运行的进程

如何显示 youtube 视频缩略图