как можно запустить curl в tcl и отсортировать для вывода - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть небольшая проблема здесь, и я надеюсь, что кто-то может помочь мне, я хочу сделать запрос 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

к сожалению, я не знаю, как go об этом, и у меня есть ошибки:

<testbot3> extra characters after close-quote

1 Ответ

1 голос
/ 22 февраля 2020

Ваша ошибка в этой команде:

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

Проблема в том, что вы скопировали некоторый код откуда-то, предназначенный для сценариев оболочки, и 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"
        }
    }
}

Возможно, вам понадобится немного больше работы, чтобы просто получить нужные строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...