用openresty(Lua)写一个获取YouTube直播状态的接口
文章原发布于: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 luarocks或yum 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直播状态的接口的更多相关文章
- 我为什么要再给lua写一个json模块
最近要给自己编写的服务器加上json解析模块.根据我当前的项目,可以预测服务器中使用json的地方: 通信.由于与客户端通信使用google protocolbuffer,仅在与SDK通信中使用jso ...
- 微信小程序 写一个获取验证码 及setInterval 使用基本方法
<!--index.wxml--> <view class="container"> <view class="container_cont ...
- 用 js 写一个获取随机颜色的程序
function getColor(){ var color="#"; for(var i=0;i<6;i++){ color+=(Math.random()*16 | 0) ...
- android 开发 写一个RecyclerView布局的聊天室,并且添加RecyclerView的点击事件
实现思维顺序: 1.首先我们需要准备2张.9的png图片(一张图片为左边聊天泡泡,一个图片为右边的聊天泡泡),可以使用draw9patch.bat工具制作,任何图片导入到drawable中. 2.需要 ...
- 不用任何第三方,写一个RTMP直播推流器
2016年是移动直播爆发年,不到半年的时间内无数移动直播App掀起了全民直播的热潮.然而个人觉得直播的门槛相对较高,从推流端到服务端器到播放端,无不需要专业的技术来支撑,仅仅推流端就有不少需要学习的知 ...
- Cordova webapp实战开发:(6)如何写一个iOS下获取APP版本号的插件?
上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取 ...
- 写一个Windows上的守护进程(8)获取进程路径
写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...
- 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;
考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...
- 原生写一个一键获取所有DOM元素的方法
一天挺一个朋友去面试要做一个获取dom元素到数组中 主要用到一个递归算法,通过节点的childNodes属性--代码如下: function getAllNode() { var nodes = do ...
随机推荐
- 并发编程-epoll模型的探索与实践
前言 我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,sele ...
- FCC---Create Movement Using CSS Animation---设计一个盒子上下左右移动,结合animation, @keyframe, position (上下左右的offset)
When elements have a specified position, such as fixed or relative, the CSS offset properties right, ...
- MD5 加密工具类MD5Util
我们在使用MD5 在线加密的时候,会发现下面情况,大小写的区别就不说啦,那么16位和32位有啥区别呢,其实16 位实际上是从 32 位字符串中,取中间的第 9 位到第 24 位的部分,就是str.su ...
- [20191013]oracle number类型存储转化脚本.txt
[20191013]oracle number类型存储转化脚本.txt --//测试看看是否可以利用bc obase=100的输出解决问题.另外以前脚本忘记考虑尾数的四舍五入问题.--//也许编程就是 ...
- [20190918]shrink space与ORA-08102错误.txt
[20190918]shrink space与ORA-08102错误.txt 1.环境:SCOTT@test01p> @ ver1PORT_STRING V ...
- 访问rabbitmq-server失败
测试项目正常运行突然访问不了,各项目启动失败,查看日志发现是RabbitMQ拒绝连接. 重启后依然失败,看var/log/rabbitmq/startup_err 发现什么错误信息也没有,后查看磁盘空 ...
- Flask request接口获取参数
Flask request接口获取参数 request.form.get("key", type=str, default=None) 获取表单数据, request.args ...
- mysql里字符集的配置
[client]default-character-set=utf8[mysqld]character-set-server = utf8[mysql]default-character-set=ut ...
- 如何调用.so动态库中的函数,如何把自己的函数导出为.so的动态库函数供别人调用
调用.so中的函数和平常的函数没有区别,只是在编译连接时加上-lxxxx就行了.要生成.so库,则编译时用下面的语句:gcc -shared -Wl,-soname,libmyfun.so -o li ...
- DOM的重绘和回流及代码性能优化
1.DOM的重绘和回流Repaint&Reflow 1.1重绘:元素样式的改变(但宽高.大小.位置等不变) 如outline.visibility.color.background-color ...