文章原发布于:https://www.chenxublog.com/2019/08/29/openresty-get-youtube-live-api.html

之前在QQ机器人上面加了个虚拟主播开播提醒的功能(群261037783),我直接用caddy反代来获取YouTube页面的信息。由于是定时轮询一大堆人,而且是下载整个页面的内容,所以延迟极高。

被某人调侃的群名:

所以我决定写一个接口,直接由服务器来判断状态,并把结果传给机器人,这样会省下很多时间和流量。

网页接口选择有不少,可以直接php,也可以搞python或者.net来写,不过经过多方面的考虑,我决定使用OpenResty来实现这个功能。

OpenResty

实际上这个反代就是在nginx的基础上,加上了Lua功能。也正是因为这样,我可以直接用Lua脚本来写一个接口,完全不需要使用后端的东西,而且资源占用极低。。

开搞

配置

新建一个虚拟主机,往里面扔上自己lua脚本的设置:

	#youtube接口
location /api {
default_type application/json;
content_by_lua_file /www/wwwroot/xxx.xxx.com/api.lua;
}

然后去改这个脚本文件就好了

安装lua依赖

由于需要https下载功能来获取页面信息,我们直接用luarocks装两个东西就好了

如果你没装过luarocks,请自行使用apt-get install luarocksyum install luarocks进行安装

我们需要安装下面两个组件:

luarocks install luaSec
luarocks install httpclient

然后还需要一个json库,随便找一个就好了,放到合适的目录下面,例如下载下面这个脚本:

https://github.com/chenxuuu/receiver-meow/blob/master/appdata/lua/require/JSON.lua

写功能

写功能就很随意了,我现在写的是,传入一个c=xxx的值,xxx为频道号,返回开播信息的json信息即可:

package.path = package.path..";/www/wwwroot/xxx.xxx.com/?.lua"
--包位置,用来引用json库
json = require("JSON") channel = ngx.req.get_uri_args()["c"]
if not channel then ngx.say(json:encode({error = "no c found"})) return end hc = require('httpclient').new()
res = hc:get("https://www.youtube.com/channel/"..channel.."/live")
if not res.body then ngx.say(json:encode({error = res.err})) return end if ngx.req.get_uri_args()["debug"] == "on" then
ngx.say(res.body)
return
end local ytplayer_config = res.body:match("ytplayer.config *= *(.-});")
if not ytplayer_config then ngx.say(json:encode({error = "no this channel"})) return end
local info = json:decode(json:decode(ytplayer_config)['args']['player_response']) local result = {}
result.live = info.videoDetails.isLive
result.title = info.videoDetails.title
result.url = "https://youtu.be/"..info.videoDetails.videoId
result.thumbnail = info.videoDetails.thumbnail.thumbnails[#info.videoDetails.thumbnail.thumbnails].url
result.channel = info.videoDetails.channelId ngx.say(json:encode(result))

使用

效果相当好嘛:

检测每个频道的时间,由之前的十几秒或者几十秒,缩短到了一秒多

用openresty(Lua)写一个获取YouTube直播状态的接口的更多相关文章

  1. 我为什么要再给lua写一个json模块

    最近要给自己编写的服务器加上json解析模块.根据我当前的项目,可以预测服务器中使用json的地方: 通信.由于与客户端通信使用google protocolbuffer,仅在与SDK通信中使用jso ...

  2. 微信小程序 写一个获取验证码 及setInterval 使用基本方法

    <!--index.wxml--> <view class="container"> <view class="container_cont ...

  3. 用 js 写一个获取随机颜色的程序

    function getColor(){ var color="#"; for(var i=0;i<6;i++){ color+=(Math.random()*16 | 0) ...

  4. android 开发 写一个RecyclerView布局的聊天室,并且添加RecyclerView的点击事件

    实现思维顺序: 1.首先我们需要准备2张.9的png图片(一张图片为左边聊天泡泡,一个图片为右边的聊天泡泡),可以使用draw9patch.bat工具制作,任何图片导入到drawable中. 2.需要 ...

  5. 不用任何第三方,写一个RTMP直播推流器

    2016年是移动直播爆发年,不到半年的时间内无数移动直播App掀起了全民直播的热潮.然而个人觉得直播的门槛相对较高,从推流端到服务端器到播放端,无不需要专业的技术来支撑,仅仅推流端就有不少需要学习的知 ...

  6. Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?

    上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取 ...

  7. 写一个Windows上的守护进程(8)获取进程路径

    写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...

  8. 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;

    考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...

  9. 原生写一个一键获取所有DOM元素的方法

    一天挺一个朋友去面试要做一个获取dom元素到数组中 主要用到一个递归算法,通过节点的childNodes属性--代码如下: function getAllNode() { var nodes = do ...

随机推荐

  1. NetCore 下使用 DataTable 以及可视化工具

    DtatTable 在命名空间System.Data下,NetCore2.0及以上支持.但是2017DataTable没有可视化工具,我也没有深研究直接下载的VS2019.然后在网上早了个SQLHel ...

  2. go-面向对象编程(上)

    一个程序就是一个世界,有很多对象(变量) Golang 语言面向对象编程说明 1) Golang 也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对 象语言.所以我们说 ...

  3. Python爬虫:设置Cookie解决网站拦截并爬取蚂蚁短租

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Eastmount PS:如有需要Python学习资料的小伙伴可以加 ...

  4. Flask(Jinja2) 服务端模板注入漏洞(SSTI)

    flask Flask 是一个 web 框架.也就是说 Flask 为你提供工具,库和技术来允许你构建一个 web 应用程序.这个 wdb 应用程序可以使一些 web 页面.博客.wiki.基于 we ...

  5. C# 运行时的关系

    简介 记录c#对象在托管堆中运行时的相互关系,如下记录了一个方法在执行时候的生命周期,当方法在之前,CLR会先执行将方法里面所有用到的局部变量.参数对应的内存地址等全部存放当前线程栈当中,并且会将所有 ...

  6. CSP认证201812

    201812-1 #include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long l ...

  7. Ubuntu18.04 安装TensorFlow 和 Keras

    TensorFlow和Keras是当前两款主流的深度学习框架,Keras被采纳为TensorFlow的高级API,平时做深度学习任务,可以使用Keras作为深度学习框架,并用TensorFlow作为后 ...

  8. 1. Go语言—初始

    一.golang语言特性 1. 垃圾回收 内存自动回收,再也不需要开发人员管理内存 开发人员专注业务实现,降低了心智负担 只需要new分配内存,不需要释放 2. 天然并发 从语言层面支持并发,非常简单 ...

  9. unittest执行顺序,使用unittest.main()按照test开头,由0-9,A-Z,a-z的顺序执行; 可使用TestSuite类的addTest方法改变执行顺序;

    import unittestclass Study(unittest.TestCase): # def setUp(self): # print('start') # def tearDown(se ...

  10. 4. jenkins 构建任务

    这边说一下 ,服务器的分布.  因为我这边 测试环境的项目比较多,不能修改主机名 1号机器 节点机器(node) 最终项目发布到这台机器 2号机器  jenkins jenkins的部署,发布 3号机 ...