2

Мне нужно написать скрипт, который определяет, загружает ли сейчас uTorrent что-то. Я бы предпочел, чтобы это была просто загрузка, но если я не могу отличить загрузку от загрузки, то это будет лучше, чем ничего.

Одним из возможных способов будет проверить, есть ли какие-либо файлы, оканчивающиеся на .!ut заперты - но я надеюсь на что - то более элегантное.

Моим оружием выбора является VBScript, но я с радостью использую командную строку, если потребуется.

2 ответа2

2

Вот немного VBScript, который подключится к веб-серверу uTorrent и определит, загружается ли что-нибудь. Появится всплывающее окно с соответствующим сообщением.

Некоторые моменты, на которые следует обратить внимание:

  • Вам необходимо включить «Веб-интерфейс» в настройках uTorrent и установить имя пользователя и пароль.
  • Затем необходимо изменить utServer utUSERNAME и utPASSWORD в этом коде на правильное место и полномочия войти в систему . Пример значения в utSERVER в коде подключается к локальной машине (127.0.0.1) через порт 8080.
  • uTorrent требует первоначального вызова, чтобы получить действительный токен для всех последующих запросов. Это хранится в utToken . Вам не нужно беспокоиться об этом, просто вызовите Request_uTorrent с правильным URL-адресом, и он определит, требуется ли запрос / обновление токена.
  • "Активная загрузка" считается той, у которой ETA больше 0 секунд и которая не заполнена. Если ETA бесконечен, то считается, что он не загружается.
  • Парсинг JSON в VBScript возможен, но не прост (источник). Этот код использует некоторые строковые манипуляции для получения результатов в виде CSV, а затем анализирует их таким образом.
  • Этот код не очень хорош для обработки ошибок, вызванных тем, что uTorrent не работает или не принимает соединения с веб-интерфейсом. Текущее решение состоит в том, чтобы использовать Brutal On Error Resume Next но это действительно нужно исправить.
  • Код может застрять в цикле, если у него нет токена, он запрашивает один, получает один, снова делает первый запрос и (по какой-то причине) токен является недействительным. Я не уверен, насколько это возможно, но, поскольку все может легко (и случайно) изменить utToken это может произойти. Возможно, вы захотите изменить это так, чтобы в случае сбоя токена во второй раз, он возвращался.
  • Извлечение токена - это все или ничего. Если это не удается, то код завершается. Это не удивительно полезно при отладке.

Сохраните следующее как check_downloading.vbs и дважды щелкните для запуска:

Option Explicit

' Configuration settings
' utSERVER = The IP address and port of the uTorrent server
' utUSERNAME = The username
' utPASSWORD = The password

Const utSERVER = "127.0.0.1:8080"
Const utUSERNAME = "yourusername"
Const utPASSWORD = "yourpassword"
Dim utToken ' Required for the uTorrent token

' == Code starts here ==

If Is_Downloading = True Then
    Msgbox "Something is downloading"
Else
    Msgbox "Nothing is downloading"
End If
WScript.Quit

' Is_Downloading
' Connects to uTorrent and checks to see if anything is currently downloading.
' Returns True if there is. Note: A file with an infinite ETA is considered not
' downloading.

Function Is_Downloading
    Dim sContent, sItem, sLines, token

    ' Get a list of the torrents from uTorrent
    sContent = Request_uTorrent("list=1")

    ' Parsing JSON isn't the easiest in VBScript, so we make some
    ' simple changes to the output and it looks like comma seperated
    ' values.

    For Each sItem In Split(sContent, VbLf)
        If Left(sItem, 2) = "[""" Then
            ' Remove spaces and the first ["
            sItem = Trim(sItem) : sItem = Right(sItem, Len(sItem)-1)
            ' Remove the ends of lines finishing with either ]], or ],
            If Right(sItem, 3) = "]]," Then sItem = Left(sItem, Len(sItem)-3)
            If Right(sItem, 2) = "]," Then sItem = Left(sItem, Len(sItem)-2)

            ' Extract the values from the line
            token = Process_CSV_Line(sItem)

            ' Format of the token array is:
            '   0 = HASH (string),
            '   1 = STATUS* (integer),
            '   2 = NAME (string),
            '   3 = SIZE (integer in bytes),
            '   4 = PERCENT PROGRESS (integer in per mils),
            '   5 = DOWNLOADED (integer in bytes),
            '   6 = UPLOADED (integer in bytes),
            '   7 = RATIO (integer in per mils),
            '   8 = UPLOAD SPEED (integer in bytes per second),
            '   9 = DOWNLOAD SPEED (integer in bytes per second),
            '   10 = ETA (integer in seconds),
            '   11 = LABEL (string),
            '   12 = PEERS CONNECTED (integer),
            '   13 = PEERS IN SWARM (integer),
            '   14 = SEEDS CONNECTED (integer),
            '   15 = SEEDS IN SWARM (integer),
            '   16 = AVAILABILITY (integer in 1/65535ths),
            '   17 = TORRENT QUEUE ORDER (integer),
            '   18 = REMAINING (integer in bytes)

            ' The ETA (token 10) can have three values:
            '   -1 = The download has stalled (reported as "infinite" in the UI)
            '    0 = The download has completed.
            '   >0 = The number of seconds left.
            '
            ' However, the ETA also includes seeding so we need to also ensure that the percentage
            ' complete is less than 1000 (100%).

            If IsNumeric(token(10)) And CLng(token(10)) > 0 And IsNumeric(token(4)) And CLng(token(4)) < 1000 Then
                Is_Downloading = True
                Exit Function
            End If  
        End If
    Next
    Is_Downloading = False
End Function

' Process_CSV_Line
' Given a string, split it up into an array using the comma as the delimiter. Take into account
' that a comma inside a quote should be ignored.

Function Process_CSV_Line(sString)    
    Redim csv(0)
    Dim iIndex : iIndex = 0
    Dim bInQuote, i : bInQuote = False

    For i = 1 To Len(sString)
        Dim sChar : sChar = Mid(sString, i, 1)
        If sChar = """" Then
            bInQuote = Not bInQuote
            sChar = ""
        End If
        If sChar = "," And Not bInQuote Then
            iIndex = iIndex + 1
            Redim Preserve csv(iIndex)
            csv(iIndex) = ""
        Else
            csv(iIndex) = csv(iIndex) & sChar
        End If
    Next
    Process_CSV_Line = csv
End Function

' Request_uTorrent
' Given a URL, append the token and download the page from uTorrent

Function Request_uTorrent(sURL)
    Dim sAddress

    If utToken <> "" Then
        ' We have a token
        sAddress = "http://" & utSERVER & "/gui/?" & sURL & "&token=" & utToken
    ElseIf sURL <> "token.html" Then
        Call Get_uTorrent_Token
        Request_uTorrent = Request_uTorrent(sURL)
        Exit Function
    Else
        sAddress = "http://" & utSERVER & "/gui/token.html"
    End If

    ' Error handling is required in case uTorrent isn't running. This approach works, but could be much better.
    On Error Resume Next
    Dim oWeb : Set oWeb = CreateObject("MSXML2.XMLHTTP")
    oWeb.Open "GET", sAddress, False, utUSERNAME, utPASSWORD
    oWeb.Send
    Request_uTorrent = oWeb.ResponseText
    On Error Goto 0

    Set oWeb = Nothing

    ' If we get an "invalid request" then the token is out of date
    If Request_uTorrent = vbcrlf & "invalid request" Then
        Call Get_uTorrent_Token
        Request_uTorrent = Request_uTorrent(sURL)
        Exit Function
    End If
End Function

' Get_uTorrent_Token
' Connects to token.html on the uTorrent webserver to get a token that enables
' further API calls to be made. Called automatically by Request_uTorrent although
' can be called manually if performance is critical (reduces the calls by 1).

Sub Get_uTorrent_Token
    utToken = ""
    Dim sResponse : sResponse = Request_uTorrent("token.html")
    Dim re : Set re = New RegExp
    re.IgnoreCase = True
    re.Global = True
    re.Pattern = "<div.+?>(.+?)<\/div>"
    Dim m : Set m = re.Execute(sResponse)
    If m.Count > 0 Then
        utToken = m(0).SubMatches(0)
    Else
        ' Unable to extract token. Bail.
        WScript.Quit
    End If

    Set m = Nothing
    Set re = Nothing
End Sub
1

Чтобы уточнить комментарии iglvzx, вы можете использовать веб-API uTorrent, чтобы получить список активных торрентов. Чтобы использовать API, все, что вам нужно сделать, это включить его в настройках. Затем это простой вызов HTTP GET - может быть на локальном хосте, если ваш скрипт выполняется на той же машине.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .