웹사이트에서 파일 다운로드(게임 모드)

웹사이트에서 파일 다운로드(게임 모드)

내 목표: Transport Fever 2 모드 섹션에 출시된 최신 모드를 얻으려면 매일 스크립트나 명령을 실행하세요. https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/

다음은 모드의 예입니다. 다운로드할 수 있는 파일은 하단에 있습니다. https://www.transportfever.net/filebase/index.php?entry/5107-%C3%B6bb-%C3%A4ra-valousek-%C3%B6bb-1012-%C3%B6bb-1014-%C3%B6bb -1163/

wget을 시도했지만 index.php 파일만 다운로드할 수 있습니다(저는 Linux 초보자입니다).

문제는 그들이 제3자 호스트에서 파일을 호스팅한다는 것입니다.

내가 어떻게 목표를 달성할 수 있는지 아는 사람이 있나요? :)

미리 감사드립니다!

답변1

https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/최신 문서에 대한 링크를 제공합니다. 다운로드 사이트의 html 문서를 사용 curl하고 출력을 파이프하여 다운로드 링크를 추출한 다음(아래의 쉬운 방법 수행 grep) 명령 대체를 사용하여 이 링크를 두 번째 curl명령에 전달할 수 있습니다.

curl -OJ \
    $(curl -fs \
    'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
    grep -om1 '[^"]*entry-download/[^"]*')

이것이 당신에게 배울 점이 있기를 바랍니다.


grep사용된 옵션:

  • -o/ --only-matching패턴이 포함된 전체 줄이 아닌 일치하는 패턴만 출력합니다.
  • -m 1/ --max-count=1일치하는 항목이 포함된 첫 번째 줄 이후 입력 검색을 중지합니다.

  • 일치하는 패턴: [^"]*entry-download/[^"]*:다운로드 링크가 모두 제공되는 것 같습니다 href="https://www.transportfever.net/filebase/index.php?entry-download/<number><...>". 따라서 위의 패턴 일치는 충분해 보입니다. 큰따옴표를 제외한 모든 문자가 0개 이상 ", 그 뒤에 entry-download/, 그 뒤에 큰따옴표를 제외한 모든 문자가 0개 이상 나옵니다."

curl사용된 옵션(첫 번째 통과 - 교체 내):

  • -f/ --fail하나를 받으면 아무것도 출력하지 않음4/5xxhttp답장– 요청이 실패했으며 grep이 실패한 html 문서를 알려주는 것을 원하지 않습니다.
  • -s/ --silent이것은 첫 번째 패스이므로 진행률 표시줄 등을 보고 싶지 않습니다.

두 번째 패스 curl옵션 - 이 다운로드 링크는 content-disposition헤더를 사용하여 파일 이름을 알려줍니다.

  • -O/ --remote-name원격 파일과 동일한 이름으로 파일을 저장합니다.
  • -J/ URL에서 파일 이름을 추출하는 대신 서버가 지정한 콘텐츠 처리 파일 이름을 사용하는 옵션을 --remote-header-name허용합니다 .-O

실제로 여러 개의 링크가 있습니다 entry-download/. 링크를 모두 다운로드하려면 다음과 같이 두 번째 옵션을 제거하고 조정 -m1하면 됩니다.grepcurl--remote-name-all

curl --remote-name-all -J \
    $(curl -fs \
    'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
    grep -o '[^"]*entry-download/[^"]*')

파일 충돌 확인:

content-disposition헤더에 설명된 파일 이름을 미리 알고 싶다면 추가 단계가 필요합니다. 컬을 사용하여 head요청을 보낼 수 있습니다 .

# get first url from the page, storing it to
# the parameter 'url' so we can use it again later
url=$(curl -fs \
    'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
    grep -om1 '[^" ]*entry-download/[^" ]*')

# head request to determine filename
filename=$(curl -Is "$url" | grep -iom1 '^content-disposition:.*filename="[^"]*' | grep -o '[^"]*$')

# 'if' statement using the 'test' / '[' command as the condition
if test -e "$filename"; then
    echo "$filename exists!"
else
    # a file named $filename doesn't exit,
    # so we'll download it
    curl -o "$filename" "$url"
fi
  • 다음은 다운로드를 시도하기 전에 충돌하는 파일을 확인하는 간단한 예입니다.
  • curl -J기존 파일을 덮어쓰지 않으므로 꼭 필요한 것은 아니지만 , "$filename"아마도 그렇지 않을 수도 있습니다 .zip. "${filename%.zip}"- 다른 디렉토리나 텍스트 파일에 파일이 있는지 확인하고 싶은 것 같습니다.

위 내용을 바탕으로 추출된 모든 URL에 대해 entry-download/이 작업을 수행 하려면 다음을 수행하세요.

# extract all urls, placing them in an array parameter 'urls'
urls=( $(curl -fs \
    'https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/' | \
    grep -o '[^" ]*entry-download/[^" ]*') )

# loop over extracted urls
for i in "${urls[@]}"; do
    # do filename extraction for "$i"
    # use filename to determine if you want to download "$i"
done

관련 정보