Подтвердить что ты не робот

Как обнаружить страницы, когда пользователь просматривает твиттер в приложении?

Я хочу иметь возможность обнаруживать пользователя, когда пользователь просматривает веб-страницу внутри приложения Twitter. Определив, я хочу просто добавить класс тела, который я буду использовать, чтобы изменить способ просмотра страницы пользователями в приложении Twitter. Тем не менее, все мои попытки до сих пор не удались.

Я могу обнаружить веб-просмотр внутри приложения Facebook, используя следующий код

var ua = navigator.userAgent;
if ((ua.indexOf("FBAN") > -1) || (ua.indexOf("FBAV") > -1)) {
  return 'facebook';
}

Я просмотрел /googled вокруг/проверил другие решения StackOverflow. Однако я не мог найти решение, где я могу обнаружить твиттер в приложении. То есть, я хочу определить, когда пользователь просматривает страницу внутри приложения Twitter.

То, что я пробовал и провалил, ниже

   if (/Twitter for/i.test(nua) === true) {
      return 'twitter';
   }

или

if (/\/\/t.co\//i.test(document.referrer) === true && /Safari\//.test(nua) === false) {
  return 'twitter';
}

или проверка браузера, устройства, поставщика, модели, типа устройства, версии engine, os, os (почему я проверяю это?!?). Я проверил с помощью Modernizr; однако никакой разницы не было найдено как автономный Safari и Twitter в приложении. Также проверяется с помощью Обнаружение, если пользователь использует веб-просмотр для Android и iOS или обычного браузера

Также пробовал следующее с ошибкой

   var userAgent = window.navigator.userAgent.toLowerCase(),
      safari = /safari/.test( userAgent ),
      ios = /iphone|ipod|ipad/.test( userAgent );

var standalone = window.navigator.standalone,
  userAgent = window.navigator.userAgent.toLowerCase(),
  safari = /safari/.test( userAgent ),
  ios = /iphone|ipod|ipad/.test( userAgent );

if( ios ) {
  if ( safari ) {
    $('.debug').prepend('Yeah I am a browser in ios');
  } else if ( !safari ) {
    $('.debug').prepend('Yeah I am a webview in ios');
  }
} else {
  $('.debug').prepend('Yeah I am NOT a ios');
}

if( ios ) {
  if ( !standalone && safari ) {
    $('.debug').prepend('Yeah I am a browser in ios');
  } else if ( standalone && !safari ) {
    $('.debug').prepend('Yeah I am a standaline in ios');
  } else if ( !standalone && !safari ) {
    $('.debug').prepend('Yeah I am WEBVIEW');
  }
} else {
  $('.debug').prepend('Yeah I am NOT IOS');
}

var isWebView = !/safari/.test( window.navigator.userAgent.toLowerCase()) || navigator.platform === 'iOS' || navigator.platform === 'iPhone'
$('.debug').prepend('<br>isWebView? : ' + isWebView + "<br>");
$('.debug').prepend('<br>AM I WEBVIEW?: ' + /AppName\/[0-9\.]+$/.test(navigator.userAgent));

var is_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(navigator.userAgent);
var is_safari_or_uiwebview = /(iPhone|iPod|iPad).*AppleWebKit/i.test(navigator.userAgent);
$('.debug').prepend('<br> is_uiwebview :' + is_uiwebview);
$('.debug').prepend('<br> is_safari_or_uiwebview :' + is_safari_or_uiwebview);


var uaSafari = navigator.userAgent.match(/Safari/i)
var uaSafariInput = navigator.userAgent.match(/Safari/i).input
var uaSafariIndex  = navigator.userAgent.match(/Safari/i).index
$('.debug').prepend('<br> ' + uaSafari + '<br>' + uaSafariInput + '<br>' + uaSafariIndex + '<br>' + navigator.vendor + '<br>' + navigator.product + '<br>' + navigator.productSub + '<br>' + navigator.languages.length + '<br>' + navigator.doNotTrack + '<br>' + navigator.maxTouchPoints + navigator.maxTouchPoints);

//Check headers and see if any difference there
var req = new XMLHttpRequest();
req.open('GET', document.location, false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();
$('.debug').prepend('<br> headers \t ' + headers);


if (/Twitter for/i.test(navigator.userAgent) === true) {
  $('.debug').prepend('<br> Test1 ');
}

$('.debug').prepend('<br> Document referrer is : '+ document.referrer + " <br> ");

if (/\/\/t.co\//i.test(document.referrer) === true && /Safari\//.test(navigator.userAgent) === false) {
  $('.debug').prepend('<br> Test2 ');
}
  }
4b9b3361

Ответ 1

Я не считаю возможным обнаруживать браузер Twitter в приложении в JavaScript, потому что он использует общий веб-вид без каких-либо идентифицируемых свойств.

Большинство ваших примеров основаны на поиске строки пользовательского агента для определенных ключевых слов. Здесь сравнение строк пользовательского агента между соответствующими браузерами в iOS 11 для iPad на основе теста, который я только что провел:

Safari

Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5372a Safari/604.1

Facebook (в приложении)

Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Mobile/15A5372a [FBAN/FBIOS;FBAV/140.0.0.63.89;FBBV/70896504;FBDV/iPad4,2;FBMD/iPad;FBSN/iOS;FBSV/11.0;FBSS/2;FBCR/AT&T;FBID/tablet;FBLC/en_US;FBOP/5;FBRV/0]

Twitter (в приложении)

Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5372a Safari/604.1

Вы можете видеть, что пользовательский агент браузера Twitter идентичен Safari.

Очевидно, это не решение вашей проблемы, но скорее объяснение, почему вы не нашли фактического ответа.

Ответ 2

Вы можете проверить, является ли navigator.mediaDevices неопределенным. Поскольку webRTC не поддерживается в веб-просмотрах, он не будет определен в Twitter, но присутствует в Safari.

Ответ 3

Твиттер использует t.co для деформации общего URL-адреса, поэтому перед достижением реального контента происходит перенаправление.

https://developer.twitter.com/en/docs/basics/tco

При проверке всех заголовков, отправленных из браузера в приложении Twitter, в поле заголовка реферера отображается свернутая ссылка t.co.

referer: http://t.co/ 0JG5Mcq

Возможно, этот заголовок поможет отличить пользовательский агент Safari.