2016-07-08 7 views
18

CasperJS (/ PhantomJS)의 네비게이터 플랫폼 속성을 위조하고 싶습니다. 나는 다른 웹 사이트에서도 많이 제안 페이지로드에서 네비게이터 개체를 덮어 쓰기 쉬운 솔루션을 발견가짜 네비게이터 속성

casper.on('page.initialized', function(){ 
    this.evaluate(function(){ 
     (function(oldNav){ 
      var newNav = {}; 
      [].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){ 
       if (prop === 'platform') { 
        Object.defineProperty(newNav, prop, { 
         value: 'Win64' 
        }); }else { 
        Object.defineProperty(newNav, prop, { 
         get: function(){ 
          return oldNav[prop]; 
         } 
        }); 
       } 
      }); 
      window.navigator = newNav; 
     })(window.navigator); 
    }); 
}); 

그러나 문제는 우리가 Iframe에에서 네비게이터의 속성을 가져올 경우, 값이 여전히 있다는 것입니다 원래 하나 때문에, page.initialized는 메인 페이지에만 설정했습니다. 그래서 소스 코드에서 변경하고 다시 빌드하기로했습니다. 나는 git repo에서 Phantomjs를 다운로드했고 하드 코딩 된 플랫폼 값 (Linux x86_64)을 검색했다. 하드 코드 된 문자열을 찾았습니다. ./phantomjs/src/qt/qtwebkit/Source/WebCore/platform/qt/UserAgentQt.cpp

문자열로 변경했습니다. navigator.platform으로 반환하고 싶지만 navigator.platform에는 영향을주지 않았습니다. 어디에서 변경해야합니까? 그것은 (플랫폼) harcoded 문자열 또는 동적으로 만들어집니다?

src/qt/qtwebkit/Source/WebCore/page/NavigatorBase.cpp 

NavigatorBase::platform()는 당신이 navigator.platform로 반환하고자 원하는 문자열로 설정해야합니다

+0

나는 casperjs를 바꾸거나 PhantomJS의 자체 버전을 만드는 대신 몇 가지 방법을 덮어 쓰는 것이 좋습니다. 아마도 Google 그룹에서 질문하는 것이 더 많은 행운을 빕니다. https://groups.google.com/forum/#!forum/casperjs – CSchulz

+0

의견을 보내 주셔서 감사합니다. 내가 그거 했어. – Alex

+0

아마도 솔루션을 답으로 게시 할 수 있습니다. – CSchulz

답변

3

코드를 검토 한 결과, 다음과 같은 파일이 변경되어야한다는 것을 발견했다. 하지만 다른 것들이 엉망이되는지 확실하지 않습니다. 적절한 해결책이 아니라면 제안 해주십시오.