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