如何在tcl中运行curl并排序到输出

如何在tcl中运行curl并排序到输出,curl,tcl,Curl,Tcl,我这里有一个小问题,希望有人能帮助我,我想用这个脚本做一个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 '{"

我这里有一个小问题,希望有人能帮助我,我想用这个脚本做一个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中有一个简单的解析器库;记录在案。为此,假设您已经安装了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"
        }
    }
}

您可能需要做更多的工作才能获得所需的行。

我稍微修改了代码,添加了传统的Tcl缩进;它不会影响行为,但会让阅读变得更容易…Donal Fellows,非常棒,它可以完美地工作。我必须添加curl-s,这样它就不会出现在partyline中。非常感谢你