2011-08-31 7 views
1

모바일 트위터에서 실행되지 않는 스크립트에이 문제가 있습니다. 필자는 FF5, FF8 및 FF9를 비롯한 여러 버전의 Firefox에서이 도구를 사용해 보았습니다.모바일 트위터, 그리스 몽키 스크립트가 작동하지 않습니다.

나는 Greasemonkey의 최신 버전을 사용했습니다. 지금 나는 FF9에 GM 0.9.10을 가지고있다. 정상적인 트위터에서 스크립트를 실행하는 데 문제가 없지만 모바일에서는 작동하지 않습니다. 어쩌면 HTTPS와 관련이 있습니까? 나는 가능한 모든 노력을 한

// ==UserScript== 
// @name   Twitter Mobile 
// @namespace  http://www.test.com 
// @include  https://mobile.twitter.com/* 
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js 
// ==/UserScript== 

function MainLoop() { 

if(typeof unsafeWindow.jQuery == 'undefined') { 
    window.setTimeout(MainLoop, 100); 
    return; 
} 

var $ = unsafeWindow.jQuery; 

$(document).ready(function(){ 
      //do something here 
}); 
window.setTimeout(MainLoop, 2000); 
} 

MainLoop(); 

: 여기

는 스크립트입니다. 또한 @require 대안을 확인하고 시도해 보았습니다. 왜 사형 집행을 거부하는지 모르겠습니다.

답변

0

모든 내용이 MainLoop이며, jQuery의 잘못된 인스턴스도 필요합니다.

다음을 수행하십시오

  1. 다시 전환 안정적인 최신 파이어 폭스의 버전 (현재 버전 6).

  2. //do something here 부분을 제외한 스크립트에서 // ==/UserScript== 이후의 모든 항목을 모두 삭제하십시오.

    1. unsafeWindow.jQuery을 사용하지 마십시오.
    2. $(document).ready 호출이 필요하지 않습니다. Greasemonkey는 적절한 시간에 기본적으로 실행됩니다.
    3. 현재 setTimeout() 호출을 삭제하십시오. 그들은 역효과가있다.


  3. 변경 @require 지시어 : 전체 스크립트

    // @require http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js 
    


  4. 붙여 넣기 또는 링크! 현재 스크립트는 아마도 AJAXed 인 페이지에서 무언가를 검사하고 있기 때문에 대부분 실패 할 것입니다.
    다음과 같은 코드와 그 해결하기 :

    //--- This handles both page-load delays, and AJAX changes. 
    setInterval (function() { checkForTweetbox(); }, 500); 
    
    function checkForTweetbox() { 
        var tweetbox = document.querySelector ('div.tweet-box textarea'); 
        if (tweetbox) { 
         if (! tweetbox.weHaveProcessed) { 
          tweetbox.weHaveProcessed = true; 
          alert ('New tweet-box found!'); 
         } 
        } 
    } 
    

사실,이 스크립트는 완벽하게 잘 작동합니다 : 당신이 트위터 모바일로 로그인 한 경우

// ==UserScript== 
// @name   _mobile twitter 
// @include   https://mobile.twitter.com/* 
// @require   http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js 
// ==/UserScript== 

setInterval (function() { checkForTweetbox(); }, 500); 

function checkForTweetbox() { 
    var tweetbox = document.querySelector ('#message_text'); 
    if (tweetbox) { 
     if (! tweetbox.weHaveProcessed) { 
      tweetbox.weHaveProcessed = true; 
      tweetbox.value    = 'GM\'s jQuery version is: ' + $.fn.jquery; 
     } 
    } 
} 

것은, 그것은 미리로드됩니다 메시지 상자에있는 트윗 (보낼 수 없음).

+0

코드에 대해 고마워, 브록. checkForTweetbox의 코드는 저에게 맞지 않지만 트위터 코드로 바꿨습니다. 위 코드는 트위터를 조작 한 코드를 제외하고는 직접 작성하지 않았습니다. 웹 사이트에서 복사했습니다. 그래서, 정확히 무엇을하는지 모르겠습니다. 그것은 이전에 모바일 트위터에서 일하는 데 사용되는 갑자기 멈췄다.나는 왜 그 코드가 이전에 작동했는지, 그리고 지금은 작동하지 않는지에 대해 궁금합니다. 또한, 그것은 여전히 ​​주요 트위터에 노력하고 있습니다. 효율적인 코드에 다시 한번 감사드립니다. –

+0

트위터 모바일이 jQuery 사용을 중단하거나 사용 방식을 변경했기 때문에 분명히 작동을 멈췄습니다. GM 스크립트는 지나치게 복잡하고 지나치게 부서지기 쉬운 방법을 사용했습니다. 사실,이 질문은 그렇게 코딩하지 않는 것이 좋은 실용적인 예입니다. (^_^) –

0

mobile.twitter.com는 응답에 다음 HTTP 헤더를 반환

X-Content-Security-Policy: allow 'self'; img-src *.twitter.com *.twimg.com maps.google.com data:; media-src *.twitter.com *.twimg.com; style-src *.twitter.com *.twimg.com; frame-ancestors *.twitter.com; script-src *.twitter.com *.twimg.com api-secure.recaptcha.net; report-uri https://mobile.twitter.com/csp_violation_report 

이 헤더는 Content Security Policy 정의합니다. 여기서 중요한 부분은 script-src *.twitter.com *.twimg.com api-secure.recaptcha.net이며,이 페이지의 스크립트를 몇 개의 도메인으로 제한합니다. GreaseMonkey가 아닌 다른 도메인의 스크립트는로드 할 수 없습니다 (오류 콘솔을 열면 해당 경고가 표시됩니다).

jQuery를 웹 페이지에 삽입하는 대신 GreaseMonkey 스크립트에 붙여 넣는 것이 좋습니다. 이렇게하면 스크립트의 크기는 늘어나지 만 적어도이 스크립트를 안정적으로 사용할 수 있으므로 더 이상 jQuery가로드 될 때까지 기다릴 필요가 없습니다.

사이드 노트 : 트위터가 주요 사이트에도 배포하기 전에 영향이 적은 모바일 사이트에서 CSP를 테스트하고있는 것으로 생각됩니다. 따라서 메인 사이트 스크립트가 곧 작동하지 않을 수도 있습니다.

+1

가, 그리스 몽키 (@)의 require' 지시어는 거의 모든 스크립트를로드도 참조하십시오. 또한 OP는 명확하게 아무것도 삽입하려고하지 않습니다. 사실 그는 페이지의 jQuery를 잘못 사용하려고 시도했지만 mobile.twitter.com은 jQuery를 사용하거나 마스크하지 않습니다. (그리고 CSP는 페이지 범위에서'eval()'을 호출하는 것을 차단합니다.) –

+0

@Brock : CSP 경고를 상상하지 못했습니다. Greasemonkey는 OP 코드가 올바른지 여부와 관계없이 해당 스크립트를 주입하려고 시도하고 실패합니다. –

+0

페이지에 액세스 할 수있는'jQuery' 객체가 없기 때문에 모든 경고는 아마도'unsafeWindow.jQuery'와 관련이 있습니다. 그것은 사출이 아닙니다. 'unsafeWindow'에서 객체를 생성하거나 '