从ipify.org运行API来获取公共IP



我已经使用Lua好几个月了,我觉得这是一种非常糟糕的语言,不容易解决常见的问题。我使用的是Debian 11,我看到我已经安装了lua,如下所示:

$ lua
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
所以,现在我继续尝试从ipify.org运行一个简单的代码来获取我的公共IP:

我创建了一个名为ip.lua的文件,其中包含以下从ipify.org获得的内容:

http.Fetch("https://api.ipify.org", function(body) print("My ip is: " .. body ) end

然后输入chmod +x ip.lua

现在,我用下面的命令运行它:

lua ip.lua

,我得到以下错误:

lua: ip.lua:2: ')' expected (to close '(' at line 1) near <eof>

我不知道那是什么意思。我的目标是使用ipify.org从我的计算机获取公共IP。这里有一个示例代码:

因此,我使用以下代码(我期望复制粘贴以下代码将工作):
local url = require "socket.url"
local http = require "socket.http"
print("----------EXTERNAL IP DIRECT---------------")
local result, status = http.request("http://api.ipify.org/")
print(result, status)
print("---------EXTERNAL IP VIA PROXY-------------")
http.PROXY="http://192.168.102.134:8888/" -- locally hosted http proxy, no name/password
local result1, status1 = http.request("http://api.ipify.org/")
print(result1, status1)

但是我得到了以下错误:

lua: ./socket.lua:12: module 'socket.core' not found:
no field package.preload['socket.core']
no file '/usr/local/share/lua/5.3/socket/core.lua'
no file '/usr/local/share/lua/5.3/socket/core/init.lua'
no file '/usr/local/lib/lua/5.3/socket/core.lua'
no file '/usr/local/lib/lua/5.3/socket/core/init.lua'
no file './socket/core.lua'
no file './socket/core/init.lua'
no file '/usr/local/lib/lua/5.3/socket/core.so'
no file '/usr/local/lib/lua/5.3/loadall.so'
no file './socket/core.so'
no file '/usr/local/lib/lua/5.3/socket.so'
no file '/usr/local/lib/lua/5.3/loadall.so'
no file './socket.so'
stack traceback:
[C]: in function 'require'
./socket.lua:12: in main chunk
[C]: in function 'require'
./socket/url.lua:13: in main chunk
[C]: in function 'require'
ip.lua:1: in main chunk
[C]: in ?

当然我搜索了这个错误,它说我需要安装luasocket。所以我做了如下操作:

apt -y install luarocks
luarocks install luasocket

并重新运行上面的代码,我仍然得到相同的错误。那么,如何在lua中运行一个简单的curl呢?

更令人沮丧的是,我还试图安装这个curl库,以便调用简单的curl:

luarocks install Lua-cURL
Installing https://luarocks.org/lua-curl-0.3.13-1.src.rock

并得到以下错误:

Error: Could not find header file for CURL
No file curl/curl.h in /usr/local/include
No file curl/curl.h in /usr/include
You may have to install CURL in your system and/or pass CURL_DIR or CURL_INCDIR to the luarocks command.
Example: luarocks install lua-curl CURL_DIR=/usr/local

我已经在/usr/bin/curl中安装了curl,但是它找不到它。所以我按照上面的说明来解决这个问题:

luarocks install Lua-cURL CURL_DIR=/usr/local

但是我还是得到了同样的错误。如何使用lua运行来自ipify.org的简单API ?

这确实是一个多重问题,但我会尽我所能来回答。

lua: ip.lua:2: ')' expected (to close '(' at line 1) near <eof>

<eof>表示文件结束,因此这意味着您有一个开括号,并且解析器在没有看到闭括号的情况下到达文件结束。查看代码,我发现http.Fetch调用缺少关闭括号。

我不知道luassocket库是怎么回事。我看过它的源代码,我在任何地方都找不到core模块,所以我想它一定是luasocket中的一个bug。它的luarocks页面显示最新版本是2年前发布的候选版本,所以可能他们没有很好地维护它。

对于curl问题,您已经安装了curl可执行文件,但是lua-curl需要一个头文件。Debian倾向于将头文件与二进制文件和库分开打包,这可能导致依赖地狱。在运行apt search libcurl | less之后,我猜测您需要的包是libcurl4-openssl-dev。试试sudo apt install libcurl4-openssl-dev

编辑:我搜索了curl/curl.h,我找到了这篇文章,它建议使用libcurl4-nss-dev而不是openssl版本。

EDIT2:我在Debian软件包中搜索了"curl/curl.h"得到了这个结果,它显示了头文件实际安装的位置。假设您使用的是x86_64,您可以尝试以下命令或它的一些变体:

luarocks install lua-curl CURL_INCDIR=/usr/include/x86_64-linux-gnu

我给你的这些命令是未经测试的,因为我不想安装所有这些东西。

最新更新