信捷PLCSkill
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

53 行
1.7 KiB

  1. import pathlib
  2. import sys
  3. import urllib.parse
  4. import urllib.request
  5. BASE = "https://www.xinje.com"
  6. def request(url: str) -> urllib.request.Request:
  7. return urllib.request.Request(
  8. url,
  9. headers={
  10. "User-Agent": "Mozilla/5.0 (Codex Xinje download)",
  11. "Referer": f"{BASE}/web/downloadCenter/index",
  12. "X-Requested-With": "XMLHttpRequest",
  13. },
  14. )
  15. def quote_url(url: str) -> str:
  16. parts = urllib.parse.urlsplit(url)
  17. path = urllib.parse.quote(parts.path, safe="/%")
  18. query = urllib.parse.quote(parts.query, safe="=&%")
  19. return urllib.parse.urlunsplit((parts.scheme, parts.netloc, path, query, parts.fragment))
  20. def resolve_source(source: str) -> str:
  21. if source.isdigit():
  22. req = request(f"{BASE}/web/file-download/down/{source}")
  23. with urllib.request.urlopen(req, timeout=30) as response:
  24. signed_url = response.read().decode("utf-8", "ignore").strip()
  25. # The site may return a signed OSS URL. In some environments CDN auth
  26. # conflicts with query-string signatures, so direct catalog URLs may be
  27. # more reliable. Keep the signed URL untouched when using file IDs.
  28. return signed_url
  29. return quote_url(source)
  30. def main() -> None:
  31. if len(sys.argv) != 3:
  32. raise SystemExit("usage: download_xinje_file.py <url-or-file-id> <output-path>")
  33. url = resolve_source(sys.argv[1])
  34. output = pathlib.Path(sys.argv[2])
  35. output.parent.mkdir(parents=True, exist_ok=True)
  36. with urllib.request.urlopen(request(url), timeout=120) as response:
  37. output.write_bytes(response.read())
  38. print(f"downloaded {output} ({output.stat().st_size} bytes)")
  39. if __name__ == "__main__":
  40. main()