2016-12-27 1 views
1

Я сталкиваюсь с ошибками с помощью этого простого сценария. Это валидатор для проверки канала RSS с несколькими сайтами проверки с помощью Safari. Все работает нормально, пока фишка не содержит специальных символов или чего-либо после знака =.Applescript: Усеченный URL-адрес фида

Сценарий должен проверять фид, который был скопирован в буфер обмена.

Например, этот корм отлично работает: http://thefirst.libsyn.com/rss

Этот корм получает усечены после ид: https://www.npr.org/rss/podcast.php?id=510298

Это происходит только на валидатор сайте Podbase.

Если бы я мог заставить скрипт нажимать кнопки Validate и Go, это было бы потрясающе, но это довольно просто ... просто зациклился на том, почему фид усекается.


set feed_url to the clipboard as string 

set the podbaseurl to "http://podba.se/validate/?url=" & feed_url 
set the feedvalidatorurl to "http://feedvalidator.org/check.cgi?url=" & feed_url 
set the castfeedurl to "http://castfeedvalidator.com/?url=" & feed_url 

tell application "Safari" 
    make new document 
    open location podbaseurl 
    open location feedvalidatorurl 
    open location castfeedurl 
end tell 

ответ

0

Проблема заключается в том, что https://podba.se/validate только делает его выглядеть как один GET запроса достаточно, а нажав на кнопку Go в интерактивном режиме выполняет множество отдельных GET запросов за кулисами, результаты которых кусочкам на текущей страницы (и URL-адрес затем изменяется, чтобы включить URL-адрес поданного фида).
Другими словами: даже решения проблемы (нечетной) усечения недостаточно.

Таким образом, ваш лучший выбор - это действительно симулировать интерактивное представление URL-адреса фида, что требует заполнения поля ввода URL-адреса фида и нажатия кнопки отправки.

Интерактивное представление должно быть смоделировано и для сайта http://castfeedvalidator.com, но нажатие кнопки отправки достаточно.
(Как вы сообщаете, хотя проверка запроса, отправленного кнопкой отправки, показывает, что вариант вашего URL-адреса, который только подготавливает URL-адрес фида для отправки, может быть использован для немедленного его отправки, при этом не отображается результаты правильно (отсутствующие стили)).

Следующий код реализует оба предложений (подход моделируемого взаимодействия был адаптирован из this answer шахты):

# Sample value 
set the clipboard to "https://www.npr.org/rss/podcast.php?id=510298" 

set feed_url to the clipboard as string 

# Base URL only; the feed URL will be submitted by simulated interaction below. 
set the podbaseurl to "http://podba.se/validate/" 
set the feedvalidatorurl to "http://feedvalidator.org/check.cgi?url=" & feed_url 
set the castfeedurl to "http://castfeedvalidator.com/?url=" & feed_url 


tell application "Safari" 

    activate 
    set newDoc to make new document 
    set newWin to front window 

    # Simulate interactive submission of feed_url at podbaseurl. 
    set URL of newDoc to podbaseurl 
    my submitUrl(newDoc, podbaseurl, feed_url) 

    # The feedvalidateorurl can be opened normally. 
    open location feedvalidatorurl 

    # Simulate interactive submission of feed_url at castfeedurl. 
    set newTab to make new tab in newWin 
    set URL of newTab to castfeedurl 
    my submitUrl(newTab, castfeedurl, feed_url) 

end tell 


on submitUrl(doc, target_url, feed_url) 

    # Synthesize the JavaScript command. 
    set jsCode to " 
     (function() { // Use a closure to avoid polluting the global namespace. 
      function doIt(t) { // Helper function 
       if (doIt.done) return; // Already successfully called? Ignore. 
       try { 
        // Perform the desired action - may fail if invoked too early. 
       if (/^http:\\/\\/podba.se/.test('" & target_url & "')) {     
         document.querySelector('#url-input').value = '" & feed_url & "'; 
         document.querySelector('#url-input').dispatchEvent(new Event('input')); 
         setTimeout(function() { document.querySelector('#go-button').click(); }, 0); 
       } else { // http://feedvalidator.org 
        document.querySelector('.btn-subscribe').click() 
        } 

      } catch(e) { 
       return; // Return without setting the success 'flag'. 
       } 
       doIt.done=true; // Set success 'flag' as a property on this function object. 
      }; 
      // Attach a listener to the window's load event for invoking the helper function then. 
      window.addEventListener('load', doIt); 
      // If the document signals readiness -- which may still be too early, we can't know -- 
      // also try to invoke the helper function *directly*. 
      if (document.readyState === 'complete') { doIt(); } 
     })(); 
    " 
    # Execute the JavaScript command in the target page. 
    tell application "Safari" 
     tell doc to do JavaScript jsCode 
    end tell 

end submitUrl 
+0

Вау, спасибо так много. Все работает очень хорошо. Единственное, что кажется странным, - это проверка правильности заливки, которая разбивает страницу результатов после того, как она проверяет и удаляет весь стиль по сравнению с тем, если ajax не используется, и вы просто вставляете фид и нажмите кнопку подтверждения. – Ronc

+0

Это потрясающая работа и такая короткая. Я не знаю, смогу ли я все это понять. Если я смогу получить правильную страницу с подтвержденной листингом, я бы установил ее. Может, это JavaScript? – Ronc

+0

@ Ronc: Понял. Я не обращал внимания на стили. Я предполагаю, что результаты вызова Ajax объединены с существующей страницей, поэтому там также должно быть смоделировано интерактивное представление - см. Мое обновление. – mklement0

Смежные вопросы