Как определить, был ли запрос GET от браузера или нет
Я ищу способ показать html пользователю, если он звонит из браузера или просто дает ему ответ API в JSON, если вызов сделан из приложения, терминала с curl или вообще любым другим способом.
Я знаю, что многие API-интерфейсы делают это, и я считаю, что REST-инфраструктура Django делает это.
Я смог обмануть ряд этих API, передавая useragent моего браузера для скручивания, так что я знаю, что это делается с помощью useragents, но как мне это реализовать? Чтобы охватить все возможные или большинство использования там.
Должен быть файл / база данных или регулярное выражение, чтобы мне не пришлось беспокоиться об обновлении списков моих пользовательских агентов каждые несколько месяцев и беспокоиться о том, что мои пользователи в последних браузерах могут не иметь доступа к моему веб-сайту.
2 ответа
Я знаю, что этому посту несколько лет, но, поскольку я наткнулся на него ...
tldr;Не используйте пользовательский агент для определения формата возврата без крайней необходимости. Используйте заголовок или (менее идеально) используйте отдельную конечную точку / URL.
Стандартный и наиболее перспективный способ установить желаемый формат возврата для конкретной конечной точки - использовать заголовок. специально разработан, чтобы позволить клиенту указать, какой формат ответа он хотел бы вернуть. Значение будет стандартным типом MIME.
Веб-браузеры по умолчанию отправляют
Есть две большие проблемы с попыткой использовать пользовательский агент для простого определения формата ответа:
- Список будет огромным.Вам нужно будет учитывать всех возможных клиентов, которых нужно поддерживать сегодня. Если эта конечная точка используется внутри компании, это может быть не немедленной проблемой, так как вы можете указать, какие пользовательские агенты вы примете (может вызвать собственный набор проблем в будущем, например, принуждение ваших пользователей к определенной версии Internet Explorer бесконечно), что поможет сократить этот список. Если эта конечная точка будет открыта извне, вы почти наверняка пропустите то, что вам крайне необходимо принять.
- Список изменится.Вам нужно будет учитывать всех возможных клиентов, которых нужно поддерживать завтра, на следующей неделе, в следующем году и через пять лет. Это становится самоиндуцированной головной болью при обслуживании.
Два примечания относительно:
- Прочтите, как использовать
заголовок, прежде чем пытаться реализовать против него. Вот реальный пример с этого сайта: . Учитывая это, я бы вернулся обратно в HTML. - Значение заголовка может быть
, который в основном просто говорит «что угодно» или «мне все равно». В этот момент серверу разрешено определять формат ответа.
Используя pastebin @reevkandari, следующий код Python очень хорошо работает для меня
browser_useragents = ["ABrowse", "Acoo Browser", "America Online Browser", "AmigaVoyager", "AOL", "Arora", "Avant Browser", "Beonex", "BonEcho", "Browzar", "Camino", "Charon", "Cheshire", "Chimera", "Chrome", "ChromePlus", "Classilla", "CometBird", "Comodo_Dragon", "Conkeror", "Crazy Browser", "Cyberdog", "Deepnet Explorer", "DeskBrowse", "Dillo", "Dooble", "Edge", "Element Browser", "Elinks", "Enigma Browser", "EnigmaFox", "Epiphany", "Escape", "Firebird", "Firefox", "Fireweb Navigator", "Flock", "Fluid", "Galaxy", "Galeon", "GranParadiso", "GreenBrowser", "Hana", "HotJava", "IBM WebExplorer", "IBrowse", "iCab", "Iceape", "IceCat", "Iceweasel", "iNet Browser", "Internet Explorer", "iRider", "Iron", "K-Meleon", "K-Ninja", "Kapiko", "Kazehakase", "Kindle Browser", "KKman", "KMLite", "Konqueror", "LeechCraft", "Links", "Lobo", "lolifox", "Lorentz", "Lunascape", "Lynx", "Madfox", "Maxthon", "Midori", "Minefield", "Mozilla", "myibrow", "MyIE2", "Namoroka", "Navscape", "NCSA_Mosaic", "NetNewsWire", "NetPositive", "Netscape", "NetSurf", "OmniWeb", "Opera", "Orca", "Oregano", "osb-browser", "Palemoon", "Phoenix", "Pogo", "Prism", "QtWeb Internet Browser", "Rekonq", "retawq", "RockMelt", "Safari", "SeaMonkey", "Shiira", "Shiretoko", "Sleipnir", "SlimBrowser", "Stainless", "Sundance", "Sunrise", "surf", "Sylera", "Tencent Traveler", "TenFourFox", "theWorld Browser", "uzbl", "Vimprobable", "Vonkeror", "w3m", "WeltweitimnetzBrowser", "WorldWideWeb", "Wyzo", "Android Webkit Browser", "BlackBerry", "Blazer", "Bolt", "Browser for S60", "Doris", "Dorothy", "Fennec", "Go Browser", "IE Mobile", "Iris", "Maemo Browser", "MIB", "Minimo", "NetFront", "Opera Mini", "Opera Mobile", "SEMC-Browser", "Skyfire", "TeaShark", "Teleca-Obigo", "uZard Web", "Thunderbird", "AbiLogicBot", "Link Valet", "Link Validity Check", "LinkExaminer", "LinksManager.com_bot", "Mojoo Robot", "Notifixious", "online link validator", "Ploetz + Zeller", "Reciprocal Link System PRO", "REL Link Checker Lite", "SiteBar", "Vivante Link Checker", "W3C-checklink", "Xenu Link Sleuth", "EmailSiphon", "CSE HTML Validator", "CSSCheck", "Cynthia", "HTMLParser", "P3P Validator", "W3C_CSS_Validator_JFouffa", "W3C_Validator", "WDG_Validator", "Awasu", "Bloglines", "everyfeed-spider", "FeedFetcher-Google", "GreatNews", "Gregarius", "MagpieRSS", "NFReader", "UniversalFeedParser", "!Susie", "Amaya", "Cocoal.icio.us", "DomainsDB.net MetaCrawler", "gPodder", "GSiteCrawler", "iTunes", "lftp", "MetaURI", "MT-NewsWatcher", "Nitro PDF", "Snoopy", "URD-MAGPIE", "WebCapture", "Windows-Media-Player"]
if any(browser_useragent in request['userAgent'] for browser_useragent in browser_useragents):
return "<html>Website HTML</html>"
else:
return api JSON or XML