Nextcloud需要访问国外网站接口,所以导致国内机器获取失败或者超时。
用国外服务器
使用代理
查看配置文件
[root@bj-a-web Service]# pwd /data/nextcloud/apps/weather_status/lib/Service [root@bj-a-web Service]# ls WeatherStatusService.php WeatherStatusService.php
相关的URL
https://nominatim.openstreetmap.org/reverse https://api.opentopodata.org/v1/srtm30m https://api.met.no/weatherapi/locationforecast/2.0/compact
改成
http://nominatim.openstreetmap.9421.ltd/reverse http://api.opentopodata.9421.ltd/v1/srtm30m http://api.met.9421.ltd/weatherapi/locationforecast/2.0/compact
因为改写后的接口是好的,所以可以直接用了。
nginx(openresty) + lua
[root@TKY ~]# cat /usr/local/openresty/nginx/conf/www/proxy.conf
server {
listen 80;
server_name nominatim.openstreetmap.9421.ltd api.opentopodata.9421.ltd api.met.9421.ltd ;
default_type application/json;
access_log logs/proxy_access.log main;
error_log logs/proxy_error.log;
location / {
# 代替 nginx 响应正文
content_by_lua '
local ngx_host = ngx.var.host -- 获取当前请求的域名
local ngx_uri = ngx.var.request_uri -- 获取url后面的路径参数
local curl_host = "" -- 设置一个变量
if ( ngx_host == "nominatim.openstreetmap.9421.ltd" ) -- 判断当前域名
then
curl_host = "https://nominatim.openstreetmap.org" -- 改写curl_host 变量
elseif ( ngx_host == "api.opentopodata.9421.ltd" )
then
curl_host = "https://api.opentopodata.org"
elseif ( ngx_host == "api.met.9421.ltd" )
then
curl_host = "https://api.met.no"
else
ngx.exit(ngx.ERROR) -- 按照逻辑 这步应该不会出现 除非 nginx 配置出错了
end
local next_url = curl_host .. ngx_uri -- 拼接URL
local shell_cmd_1 = [[curl -A "NextcloudWeatherStatus/1.5.0 nextcloud.com" "]] -- 拼接 shell 命令
local shell_cmd_2 = [["]]
local shell_cmd = shell_cmd_1 .. next_url .. shell_cmd_2 -- 最终拼接好的 shell 命令
local cmd_ini = io.popen(shell_cmd) -- 使用 io.popen 这个方法 执行shell 命令 可以获取到执行结果
local resp = cmd_ini:read("*all") -- 获取执行结果
ngx.say(resp) -- ngx 网页输出
';
}
}