运行 如何在 tcl 中卷曲并排序输出

how can run curl in tcl and sort to output

我这里有一个小问题,希望有人能帮助我,我想用这个脚本做一个 curl 查询

bind pub -|- !ttest proc:ttest
proc proc:ttest {nick host handle channel arg} {
    set name test1
    set ftp homeftp
    if {[catch {
        exec /usr/bin/curl -u :pass -X POST https://localhost:55477/raw -d '{"command": "site search $name", "sites": ["$ftp"]}' --insecure
    } error]} {
        putnow "PRIVMSG #test :$error"
    }
}

当我 运行 它在 bash 中时,输出如下所示:

root@test /eggdrop $ /usr/bin/curl -u :pass -X POST https://localhost:55477/raw -d '{"command": "site search test1", "sites": ["homeftp"]}' --insecure
{
"failures": [],
"successes": [
{
  "name": "homeftp",
  "result": "200- Found 50 entries in index (limit 50):\r\n200- /home/test/test1\r\n200-/home/test/test1/test1\r\n200- /home/test/test1/test11\r\n200- /home/test/test1/test13\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test13\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- /home/test/test1/test14\r\n200- Search complete\r\n"
}
]
}
root@test

最后应该是这样的

output in channel
<testbot3> /home/test/test1
<testbot3> /home/test/test1/test1
<testbot3> /home/test/test1/test11
<testbot3> /home/test/test1/test13
<testbot3> /home/test/test1/test14
...
...
simply all among themselves until the end

不幸的是,我不知道该怎么做,而且我有错误:

<testbot3> extra characters after close-quote

你的错误在这条命令中:

exec /usr/bin/curl -u :pass -X POST https://localhost:55477/raw -d '{"command": "site search $name", "sites": ["$ftp"]}' --insecure

问题是您从某个地方复制了一些用于 shell 脚本的代码,而 Tcl 不会以同样的方式对待 '。 (实际上,它在 Tcl 中是一个完全不特殊的字符。)相反,您需要以稍微不同的方式编写 JSON:

exec /usr/bin/curl -u :pass -X POST https://localhost:55477/raw -d "{\"command\": \"site search $name\", \"sites\": \[\"$ftp\"\]}" --insecure

读起来不太清楚。在这里,让我们再分解一下:

# These can be set outside the [catch]
set Url https://localhost:55477/raw
set Json "{\"command\": \"site search $name\", \"sites\": \[\"$ftp\"\]}"

exec /usr/bin/curl -u :pass -X POST $Url -d $Json --insecure

有一些 Tcl 库可用于构建 JSON 查询(您可能应该注意插入其中的参数不包含“坏”字符,例如 ") 但它对于解析 JSON 结果更为重要。 Tcllib 中有一个简单的解析器库;它被记录在案 here。为此,假设您已经安装了 Tcllib,然后将添加到脚本的顶部:

package require json

然后您可以解析结果并将它们写入通道,例如:

set results [exec /usr/bin/curl -u :pass -X POST $Url -d $Json --insecure]

foreach info [dict get [json::json2dict $results] successes] {
    foreach line [split [dict get $info result] "\n"] {
        if {[string match "200-*" $line]} {
            set line [string trim [string range $line 4 end]]
            putnow "PRIVMSG #test :$line"
        }
    }
}

您可能需要多做一些工作才能获得您想要的线条。