DvaMishkiLapa / VKArchiveDownloader

Утилита для скачивания всех вложений, которые можно получить из архива аккаунта VKontakte
Apache License 2.0
16 stars 4 forks source link

Отметки «Нравится» -> Фотографии; #11

Closed DvaMishkiLapa closed 1 year ago

DvaMishkiLapa commented 2 years ago

VKontakte отдает по ссылкам, которые указаны в архиве, не совсем прямые ссылки на фото. Это ссылка на фото в сообществе, которая динамически подгружается через JavaScript. При попытке получить от туда изрбражение, я всегда получаю ошибку 429 Too Many Requests. Обойти это так и не удалось.

Если все же удастся это как то решить, закрою этот запрос.

Пример того, то выдает VK на попытку открыть ссылку через aiohttp.ClientResponse

<html lang="ru">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="theme-color" content="#0a0a0a" media="(prefers-color-scheme: dark)">
  <meta name="theme-color" content="#ffffff" media="(prefers-color-scheme: light)">
  <title data-lang-key="title">Ошибка 429</title>
  <link rel="shortcut icon" href="//vk.com/images/icons/favicons/fav_logo_2x.ico?6" />

  <style>
    * {
      box-sizing: border-box;
    }
    html, body {
      padding: 0;
      margin: 0;
      font-family: -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', Geneva, "Noto Sans Armenian", "Noto Sans Bengali", "Noto Sans Cherokee", "Noto Sans Devanagari", "Noto Sans Ethiopic", "Noto Sans Georgian", "Noto Sans Hebrew", "Noto Sans Kannada", "Noto Sans Khmer", "Noto Sans Lao", "Noto Sans Osmanya", "Noto Sans Tamil", "Noto Sans Telugu", "Noto Sans Thai", sans-serif, arial, Tahoma, verdana;
    }
    h1 {
      font-size: 20px;
      line-height: 24px;
      color: #000000;
      margin: 0;
      font-weight: 500;
    }
    p {
      font-size: 16px;
      line-height: 20px;
      color: #818C99;
      margin: 8px 0;
    }

    body {
      display: flex;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      min-width: 230px;
    }

    .centered {
      padding: 10px;
      text-align: center;
      max-width: 330px;
    }

    .hidden {
      display: none;
    }

    .error {
      padding: 8px 12px;
      background: #faebeb;
      color: rgba(0, 0, 0, 0.72);
    }

    @media (prefers-color-scheme:dark) {
      body, html {
        background: #0a0a0a;
      }
      h1 {
        color: #e1e3e6;
      }
      p {
        color: #76787a;
      }

      .error {
        background: rgba(230, 70, 70, 0.16);
        color: rgba(225, 227, 230, 0.72);
      }
    }
  </style>
</head>
<body>
    <div id="description" class="centered">
      <h1 data-lang-key="heading">У вас большие запросы!</h1>
      <p data-lang-key="description">
        Точнее, от вашего браузера их поступает слишком много, и сервер ВКонтакте забил тревогу.
      </p>
      <noscript>
        <p class="error">
          Нужно включить JavaScript, чтобы исправить проблему.
        </p>
      </noscript>
      <p data-lang-key="https" class="hidden error">
        Эта страница была загружена по&nbsp;HTTP, вместо безопасного HTTP<strong>S</strong>, а&nbsp;значит телепортации обратно не&nbsp;будет.<br/>Обратитесь в&nbsp;поддержку сервиса.
      </p>
      <p data-lang-key="cookies" class="hidden error">
        Вы отключили сохранение Cookies, а&nbsp;они&nbsp;нужны, чтобы решить проблему.
      </p>
      <p data-lang-key="hash429" class="hidden error">
        Почему-то страница не&nbsp;получила всех&nbsp;данных, а&nbsp;без&nbsp;них она не&nbsp;работает.<br/>Обратитесь в&nbsp;поддержку сервиса.
      </p>
      <p data-lang-key="teleport" class="hidden">
        Телепортация обратно через&nbsp;5&nbsp;секунд.
      </p>
    </div>

    <script>
      (function() {
        Array.prototype.includes||(Array.prototype.includes=function(r){return!!~this.indexOf(r)});
        Array.prototype.forEach||(Array.prototype.forEach=function(r,o){var t,n;if(null==this)throw new TypeError(" this is null or not defined");var e=Object(this),i=e.length>>>0;if("function"!=typeof r)throw new TypeError(r+" is not a function");for(arguments.length>1&&(t=o),n=0;n<i;){var f;n in e&&(f=e[n],r.call(t,f,n,e)),n++}});
        (function(t){var e=function(){try{return!!Symbol.iterator}catch(e){return false}};var r=e();var n=function(t){var e={next:function(){var e=t.shift();return{done:e===void 0,value:e}}};if(r){e[Symbol.iterator]=function(){return e}}return e};var i=function(e){return encodeURIComponent(e).replace(/%20/g,"+")};var o=function(e){return decodeURIComponent(String(e).replace(/\+/g," "))};var a=function(){var a=function(e){Object.defineProperty(this,"_entries",{writable:true,value:{}});var t=typeof e;if(t==="undefined"){}else if(t==="string"){if(e!==""){this._fromString(e)}}else if(e instanceof a){var r=this;e.forEach(function(e,t){r.append(t,e)})}else if(e!==null&&t==="object"){if(Object.prototype.toString.call(e)==="[object Array]"){for(var n=0;n<e.length;n++){var i=e[n];if(Object.prototype.toString.call(i)==="[object Array]"||i.length!==2){this.append(i[0],i[1])}else{throw new TypeError("Expected [string, any] as entry at index "+n+" of URLSearchParams's input")}}}else{for(var o in e){if(e.hasOwnProperty(o)){this.append(o,e[o])}}}}else{throw new TypeError("Unsupported input's type for URLSearchParams")}};var e=a.prototype;e.append=function(e,t){if(e in this._entries){this._entries[e].push(String(t))}else{this._entries[e]=[String(t)]}};e.delete=function(e){delete this._entries[e]};e.get=function(e){return e in this._entries?this._entries[e][0]:null};e.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]};e.has=function(e){return e in this._entrie
DvaMishkiLapa commented 1 year ago

Решено в https://github.com/DvaMishkiLapa/VKArchiveDownloader/commit/5e06671f8588c8e9d11a0f53149e01c88e46362f.