运行 如何在 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"
}
}
}
您可能需要多做一些工作才能获得您想要的线条。
我这里有一个小问题,希望有人能帮助我,我想用这个脚本做一个 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"
}
}
}
您可能需要多做一些工作才能获得您想要的线条。