本文大部分代码取自这里:利用github webhook自动更新hexo
起因
vtuber开播提醒
在去年给QQ机器人加了个检查各个vtuber直播开启提醒的功能,原理是不断对某个接口轮询(接口写法见用openresty(Lua)写一个获取YouTube直播状态的接口)。不过这个的效率很感人,而且感觉有些废资源(因为http接口返回时间有点点常。。。)
上个月的时候,给机器人加上了MQTT
功能。加上之后我就开始着手直播体系改造了,
以前的流程是这样的:
现在改成了这样:
对机器人那端来说变得很简单了,同时只有开播那一刻才会和机器人有数据交互,而之前是每次查询都返回完整的开播信息,比原来更省流量。
服务端使用python,通过cron来实现定时检查,发现开播后立刻发mqtt消息。
问题
这个问题就是,因为GitHub上的数据不是我维护的,监控列表是另一个人在维护,同时因为我懒得更新代码,所以急需一套自动更新代码的逻辑来及时更新监控列表。
配置webhook
由于GitHub自带了push后推webhook的功能,只需要打开就可以了:
配置openresty
在openresty合适的地方加上lua文件的配置:
#检查脚本更新webhook
location /live {
default_type text/plain;
content_by_lua_file /home/xxx/live.lua;
}
然后新建文件加上功能:
local signature = ngx.req.get_headers()["X-Hub-Signature"]
local key = "填上上面webhook设置的secret"
if signature == nil then
return ngx.exit(404)
end
ngx.req.read_body()
local t = {}
for k, v in string.gmatch(signature, "(%w+)=(%w+)") do
t[k] = v
end
local str = require "resty.string"
local digest = ngx.hmac_sha1(key, ngx.req.get_body_data())
if not str.to_hex(digest) == t["sha1"] then
return ngx.exit(404)
end
local result = os.execute("cd /home/xxx/v-live-check/ && git pull")
--local result = os.execute("cd /home/xxx/ && git clone https://github.com/chenxuuu/v-live-check.git")
ngx.say("OK,"..tostring(result))
ngx.exit(200)
注释的那句是因为手动clone下来初始化仓库,会发现openresty没权限。。。所以你可以用openresty来clone仓库,就不会遇到后期pull没权限的问题了。。
测试
手动push一下,看看有没有更新
转载保留版权:晨旭的博客 » 《OpenResty+GitHub WebHook 自动更新代码》如果喜欢可以: 点击右侧上方的邮件订阅,订阅本站