Что нового

Как вытянуть ссылку на самую новую версию файла на странице сайта

eus_deus

Новичок
Сообщения
118
Репутация
0
Доброго времени суток, уважаемые знатоки и с наступающими всех праздниками!
Помогите пойти по правильному пути, а то заблужусь, если сверну не туда
Есть сайт с репаками программ.
Возьмем эту страницу:
https://lrepacks.net/repaki-multimedia-programm/502-mp3tag-repack-amp-portable.html
Как можно получить ссылку на файл новой бета-версии обменника uploadrar?
Пробовал так:
Код:
#include <IE.au3>
#include <Array.au3>
$site = 'https://lrepacks.net/repaki-multimedia-programm/502-mp3tag-repack-amp-portable.html'
$oIE = _IECreate($site, 0, 1)
$oDivs = _IETagNameGetCollection($oIE, 'div')
For $oDiv In $oDivs
    If $oDiv.classname == 'entry-content' Then
        $content = $oDiv.InnerHTML & @LF
        ExitLoop
    EndIf
Next
_IEQuit($oIE)
ProcessClose ("iexplore.exe")
$aContent=StringRegExp($content,'<div class="quote">.*</div>', 3)
$content = _ArrayToString($aContent)
$aLinks = StringRegExp($content,'(?i)href=\h*"(.+?)"',3)
For $j=0 To UBound($aLinks) - 1
    If StringInStr($aLinks[$j], 'https://uploadrar.com') Then
        $link = $aLinks[$j]
    Else
        ContinueLoop
    EndIf
Next
MsgBox(4096,"Переменная $link","Файл TCPIW_OU.au3 ~~ Строка 862"&@CRLF&"$link =>"&$link&"<=")

Результат - получаю ссылку на версию 3,05 для ХР
Пробовал так:
Код:
#include <INet.au3>
#include <Array.au3>
#include <Encoding.au3>
Local $aArrayPr[3]=[2]
$site = 'https://lrepacks.net/repaki-multimedia-programm/502-mp3tag-repack-amp-portable.html'
$aArrayPr[1] = 'Mp3tag'
$aArrayPr[2] = '3.11f'
$Source = _InetGetSource ($site, True)
$Source = _Encoding_CyrillicTo1251($Source)
If StringRegExp ($Source, 'uploadrar.com') = 1 Then
    $content=StringRegExp($Source,'(?si)entry-content(.+)entry-footer', 1) 
    $content = _ArrayToString($content)
    $content = StringRegExp($content,'(?is).+('&$aArrayPr[1]&'.+'&$aArrayPr[2]&'.{2800,2800})', 1)
    $content = _ArrayToString ($content)
    $aLinks = StringRegExp($content,'(?i)href=\h*"(.+?)"',3)
    For $i=0 To UBound($aLinks) - 1
        If StringInStr($aLinks[$i], 'https://uploadrar.com') Then
            $link = $aLinks[$i]
        Else
            ContinueLoop
        EndIf
    Next
EndIf
MsgBox(4096,"Переменная $link","Файл TCPIW_OU.au3 ~~ Строка 862"&@CRLF&"$link =>"&$link&"<=")

Ссылку получаю, но... Нужно знать версию, плюс для разных програм могут быть свои нюансы, да и регулярка, берущая 2800 символов - это вроде извращение.
В идеале наверное - собирать двумерный массив со ссылками и описаниями со страницы и выбирать свежайший архив...
Кто что может подсказать?
 

Alecsis

Осваивающий
Сообщения
98
Репутация
41
Привет!
Для Вашего конкретного случая (если я правильно понял —)интересует Mp3tag) подойдёт что-то в этом роде?
Код:
#pragma compile(Console, True)
; ──────────────────────────────────────────────────────────────────────────────
Opt('MustDeclareVars', True)
; ──────────────────────────────────────────────────────────────────────────────
#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <Array.au3>
#include <StringConstants.au3>
#include <InetConstants.au3>
; ──────────────────────────────────────────────────────────────────────────────
Local Const _
  $csRegExp = '(?isU)(?:>(Mp3tag) (\S+?).+<a \S+ href="(https://uploadrar.com/[^"]+))"'

Local _
  $sURL   = 'https://lrepacks.net/repaki-multimedia-programm/502-mp3tag-repack-amp-portable.html', _
  $sHTML  = 'Eus1.html', _    ; имя файла, куда прочитать страницу
  $sPage, _                   ; содержимое страницы = текст сплошняком
  $vList, _                   ; рез-т разбора по регэкспу
  $i, $j, $k                  ; традиционные индексы «про запас»
;
$i = InetGet($sURL, $sHTML, $INET_FORCERELOAD)
If $i = 0 Then
   u_Log('Облом чтения страницы ' & $sURL)
   Exit 1
EndIf
;
$sPage = FileRead($sHTML)
If @error Then
    u_Log('Облом чтения из файла ' & $sHTML)
    Exit 2
EndIf
;
$vList = StringRegExp($sPage, $csRegExp, $STR_REGEXPARRAYGLOBALMATCH)
If @error Then
    u_Log('Облом разбора рег/выражения')
    Exit 3
EndIf
_ArrayDisplay($vList)
Exit 0
;
; ══════════════════════════════════════════════════════════════════════════════
Func u_Log($sMessage)
    ConsoleWrite($sMessage & @CRLF)
EndFunc


PS1 Читать страничку в файл в общем-то не обязательно, это просто удобно для отладки: один раз прочитал её, затем закомментировал вызов InetRead и пробуй разные извраты пока терпение не лопнет :smile:
PS2 А разбор версии уже отдельная песня… несложная, но занудная
 

Вложения

  • изображение_2021-12-20_195523.png
    изображение_2021-12-20_195523.png
    8.8 КБ · Просмотры: 5
Автор
E

eus_deus

Новичок
Сообщения
118
Репутация
0

Alecsis,​

ваш подход переделаю поде себя, думаю, это уже проще будет - выстроить вывод и отсортировать по номеру
Сообщение автоматически объединено:

Не только он, то просто показал как пример
Но... Буду копать далее
Сообщение автоматически объединено:

Пока у меня так, может, кому интересно:
Код:
#include <AutoItConstants.au3>
#include <FileConstants.au3>
#include <Array.au3>
#include <StringConstants.au3>
#include <InetConstants.au3>
#include "_ViewValues.au3"
#Include <FileOperations.au3>

Local $aSection = IniReadSection('D:\TC\TC_VOG\Files_VOG\INI\TC_VOG.ini', 'TC_VOG_Chupacabra_Apps')
Local $aProgi = 'AIDA64|Air Explorer|AnVir Task Manager|AOMEI Partition Assistant|Auslogics BoostSpeed|Auslogics Driver Updater|Axialis IconWorkshop|Beyond Compare|EZ CD Audio Converter|FastStone Capture|Format Factory|GoodSync|IObit Driver Booster|MediaGet|Offline Explorer Enterprise|Punto Switcher|R-Studio|Skype|SoftMaker Office Professional|Tag&Rename|TeamViewer|The Bat!|UltraISO|USB Safely Remove|Viber'
Local _
  $sPage, _                   ; содержимое страницы = текст сплошняком
  $vList, _                   ; рез-т разбора по регэкспу
  $CountArrayRes, _  ; клличество элементов результирующего трехмерного массива
    $i, $j, $k                  ; традиционные индексы «про запас»

For $i=1 To $aSection[0][0]
  $sURL   = StringSplit($aSection[$i][1], '|')[4]
  $sHTML  = @ScriptDir&'\progs\'&$aSection[$i][0]&'.html'
    $site = InetGet($sURL, $sHTML, $INET_FORCERELOAD)
    MsgBox(4096,"Progres","OK")
    If $site = 0 Then
       u_Log('Облом чтения страницы ' & $sURL)
       Exit 1
    EndIf
Next

$aHtmlFiles = _FO_FileSearch ( @ScriptDir&'\progs', '*.html')

For $j=1 To $aHtmlFiles[0]
    $proga = StringSplit($aProgi, '|')
    $WorkingProgsRegExp1 ='Air Explorer|AOMEI Partition Assistant|IObit Driver Booster|The Bat!|UltraISO'
    If StringInStr($WorkingProgsRegExp1, $proga[$j])Then
          $csRegExp = '(?isU)(?:>Скачать\s('&$proga[$j]&'\s\D*?) (\S+?).+<a \S+ href="(https://uploadrar.com/[^"]+))"'
    ElseIf $proga[$j] = 'Skype' Then
          $csRegExp = '(?isU)(?:>('&$proga[$j]&') (\S+?).+Preview.+<a \S+ href="(https://uploadrar.com/[^"]+))"' ; нужно чистить дополнительно
    Else
        $csRegExp = '(?isU)(?:>Скачать\s('&$proga[$j]&') (\S+?).+<a \S+ href="(https://uploadrar.com/[^"]+))"'
    EndIf
    $aHtmlFiles[$j] = StringStripWS($aHtmlFiles[$j], 3)
    $sPage = FileRead($aHtmlFiles[$j])
    If @error Then
        u_Log('Облом чтения из файла ' & $aHtmlFiles[$j])
        ContinueLoop
    EndIf
    $vList = StringRegExp($sPage, $csRegExp, $STR_REGEXPARRAYGLOBALMATCH)
    If @error Then
        u_Log('Облом разбора рег/выражения для файла '& $aHtmlFiles[$j])
        ContinueLoop
    EndIf
    $CountArrayRes = UBound($vList) / 3
    Dim $aArrayRes[$CountArrayRes][3]
    $k =  0
    For $i=0 To UBound($vList) - 1 Step 3
        $aArrayRes[$k][0]= $vList[$i]
        $aArrayRes[$k][1]= $vList[$i + 1]
        $aArrayRes[$k][2]= $vList[$i + 2]
        $k += 1
    Next
    _ArraySort($aArrayRes, 1, 0, 0, 1)
    _ViewValues($aArrayRes,'$aArrayRes ~ Файл test_get_latest_version.au3 ~~ Строка 22')
    _ViewValues($aArrayRes[0][2],'$aArrayRes ~ Файл test_get_latest_version.au3 ~~ Строка 22')
Next

Func u_Log($sMessage)
    MsgBox(0, 'Error', $sMessage & @CRLF)
EndFunc

Большинство программ выдает именно то, что надо, есть исключения, но надо тестировать
 
Последнее редактирование:
Верх