ウェブサイトからファイルをダウンロードする(ゲームモード)

ウェブサイトからファイルをダウンロードする(ゲームモード)

私の目標: 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初心者です)。

問題は、彼らがサードパーティのホストでファイルをホストしていることです。

私がどのように目標を達成できるかを知っている人はいますか? :)

よろしくお願いします!

ベストアンサー1

https://www.transportfever.net/filebase/index.php?filebase/80-transport-fever-2/最新のドキュメントへのリンクを提供します。ダウンロードサイトのhtmlドキュメントを使用し、出力をcurlパイプしてダウンロードリンクを抽出し(次の簡単な方法を実行)、コマンドgrep置換を使用してこのリンクを2番目のコマンド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これは最初のパスなので、進行状況バーなどを見たくありません。

2番目のパスcurlオプション - このダウンロードリンクはcontent-dispositionヘッダーを使用してファイル名を通知します。

  • -O/--remote-nameリモートファイルと同じ名前でファイルを保存します。
  • -J/ URLからファイル名を抽出する代わりに、サーバーが指定したコンテンツ処理ファイル名を使用するオプションを--remote-header-name許可します。-O

実際にはいくつかのリンクがありますentry-download/。リンクをすべてダウンロードするには、次のように2番目のオプションを削除して調整し-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

おすすめ記事