首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lua从ipify.org运行API获取公网IP

Lua从ipify.org运行API获取公网IP
EN

Stack Overflow用户
提问于 2021-09-26 20:36:12
回答 1查看 92关注 0票数 0

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

代码语言:javascript
复制
$ lua

Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio

因此,现在我将继续尝试从ipify.org运行一段简单的代码来获取我的公网IP:

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

代码语言:javascript
复制
http.Fetch("https://api.ipify.org", function(body) print("My ip is: " .. body ) end

然后我chmod +x ip.lua

现在,我使用以下命令运行它:

代码语言:javascript
复制
lua ip.lua

我得到了以下错误:

代码语言:javascript
复制
lua: ip.lua:2: ')' expected (to close '(' at line 1) near <eof>

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

因此,我使用以下代码(我希望复制和粘贴以下代码可以正常工作):

代码语言:javascript
复制
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)

但我得到了以下错误:

代码语言:javascript
复制
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。因此,我做了以下工作:

代码语言:javascript
复制
apt -y install luarocks

luarocks install luasocket

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

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

代码语言:javascript
复制
luarocks install Lua-cURL

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

并得到以下错误:

代码语言:javascript
复制
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,但它找不到它。因此,我按照它所说的来解决这个问题:

代码语言:javascript
复制
luarocks install Lua-cURL CURL_DIR=/usr/local

但是我还是得到了同样的错误。您将如何使用lua从ipify.org运行简单的应用程序接口?

EN

Stack Overflow用户

发布于 2021-09-26 21:54:04

这真的是一个多个问题,但我会尽我所能回答。

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

<eof>的意思是文件结束,所以这意味着你有一个开括号,解析器没有看到结束括号就到达了文件的末尾。查看代码,我发现http.Fetch调用缺少右括号。

我不知道luasocket库是怎么回事。我查看了它的源代码,但在任何地方都找不到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,找到了this article,它显示的是libcurl4-nss-dev而不是openssl版本。

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

代码语言:javascript
复制
luarocks install lua-curl CURL_INCDIR=/usr/include/x86_64-linux-gnu

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69338762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档