关于网站检测浏览器 UA

2018-02-14 18:27:27 +08:00
 fengleidongxi

已强制开启浏览器调试,并更改了浏览器 UA 和分辨率,操作系统 UA 也更改成了桌面,为什么有少数网站仍然能检测到用的是非桌面系统,并自动跳转到 WAP、移动版网页,他是究竟是怎么检测到的?

11165 次点击
所在节点    Android
41 条回复
opengps
2018-02-15 08:40:08 +08:00
git 上见过一个开源项目,最终为了区分浏览器,尤其是 360,专门调用了一个后台渲染工具开达到识别目的
iwtbauh
2018-02-15 09:01:43 +08:00
@gam2046 是的,会返回 true,但要求 chromium 是用 GTK+3 编译的(太旧的 GTK+2 编译的版本是无法产生触摸屏事件的),使用 libinput 驱动( evdev 驱动将触摸屏设备当作产生绝对位置的“鼠标”处理了)
$ ldd /usr/lib/chromium/chromium | grep gtk
libgtk-3.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-3.so.0
有的驱动程序就是直接把触摸屏当成鼠标的,但如果就是当成触摸屏的话,Windows 7 的 chrome 应该也是会识别出触摸屏的,Windows 7 微软还专门提供了一组触摸屏的 API 用于这个,可惜我的 windows 触摸屏机器已经没了没法测试
gam2046
2018-02-15 09:52:27 +08:00
@fengleidongxi #15,UserAgent 在 javascript 上下文中与你发起 http 请求时在 Http Headers 中是不同的。前者可以通过我提供的代码来修改,那么在那个 Context 中获取到的就是被修改后的值,但是该修改并不会影响 Http Request 中的 UserAgent,这个值是由浏览器填充的,可以通过一些浏览器插件修改。而大多数浏览器自带的模拟,会同时修改 javascript 与 Http Request 中的 Useragent。

@nciyuan #20 Flash 其实现在误伤算是比较大了,因为虽然 Chrome/Firefox 都还没完全放弃 Flash,但是默认都是禁用的。需要用户侧手动允许。在用户没有手动允许的情况,环境都没有 Flash 是一样的。

@iwtbauh #22 嗯,这个有意思。因为我发现 Chrome 的模拟模式,会自动填充这些触屏事件。所以我自己写了一个 User Script,是这样做的:

document.documentElement.ontouchstart =
document.documentElement.ontouchmove =
document.documentElement.ontouchend =
document.documentElement.ontouchcancel = function () { };

---

其实原则上要检查是否移动端方法是挺多的,上面各位大佬提到的 platform/flash/touch event/屏幕分辨率等等,综合判断下来应该还是比较准确的。
grantonzhuang
2018-02-15 10:14:52 +08:00
@gam2046 anyproxy 可以一试,有篡改的功能
Telegram
2018-02-15 10:41:23 +08:00
这个问题我也一直想知道
fengleidongxi
2018-02-15 10:58:07 +08:00
@iwtbauh 确实是这样,我修改了主题,大家一起研究
fengleidongxi
2018-02-15 11:10:17 +08:00
@nciyuan 我补充了主题,大家一起研究研究
fengleidongxi
2018-02-15 11:17:09 +08:00
@gam2046 我修改了主题,你再看下。你的意思是我只是修改了 http 头信息,JS 中并未修改?你说的可能是对的,那有没有办法修改 JS 上下文中的 UA ?又如何测试 JS 上下文中的 UA ?
gam2046
2018-02-15 11:28:07 +08:00
@fengleidongxi #28

你首先要明确你的网页跳转时服务端实现(返回 301/302 状态码)还是客户端实现( javascript )的。

服务端判断只能依赖 HTTP Request Headers 中的 UserAgent
而客户端 javascript 就有各显神通的方法了。

最后,你把网址发出来不就好了么?看一眼什么都清楚了。靠意念猜题....有点过了。
iwtbauh
2018-02-15 11:42:44 +08:00
@gam2046 是的,综合考虑的情况确实有很多东西可以暴露出差异。我再补充一个:拖拽事件( ondrag 等)手机浏览器( Android 版本 chrome 64 )不支持
fengleidongxi
2018-02-15 11:59:49 +08:00
@gam2046 主要通过调试模式达到和“请求桌面版网站”一样的效果,不知道有没有办法。你试试论坛用调试模式能进桌面版吗
gam2046
2018-02-15 12:54:15 +08:00
@fengleidongxi V2EX 不就是根据 request headers 来判断设备类型的么?有啥黑科技?我这试了试改变这个值就返回的不同页面。
fengleidongxi
2018-02-15 14:22:05 +08:00
@gam2046 你再试试 espn 英文站,我发现这些网站都有一个共同点,桌面版和移动版网址是一样的,用跳转这个词并不恰当,因为直接进入的就是移动版或者桌面版,并不是先进入 www 网址的桌面版,瞬间跳转另一个网址移动版。

但凡是先进入桌面版,瞬间跳转移动版的网站,用调试模式都能正常进入桌面版并不跳转,大多数网站都是这样的。
gam2046
2018-02-15 14:33:28 +08:00
.....这就是响应式布局而已。与你的浏览器的宽高有关。无所谓桌面与移动端的区别。

你在电脑上用浏览器打开,然后把浏览器宽度缩小,也能看到像手机上那么的界面了。连页面都不用刷新。

仅此而已。

新年快乐。我要去登机了。
fengleidongxi
2018-02-15 14:48:37 +08:00
@gam2046 好的,新年快乐,一路顺风!
cosformula
2018-02-15 14:53:44 +08:00
响应式布局+1
这些网站的移动端,桌面端都是一套代码,手动改变宽高就可以观察到变化,不需要判断。
如果没有做响应式设计,一般是通过 ua 判断跳转哪个页面的。
fengleidongxi
2018-02-15 14:55:36 +08:00
txydhr
2018-02-15 17:35:35 +08:00
@nciyuan 现在桌面浏览器也有不少默认屏蔽 flash
nciyuan
2018-02-16 09:06:09 +08:00
@fengleidongxi 大多数符合 Google MD 标准的网页设计一次就可以,还有你点击请求桌面之后是重载一遍,自适应的根本不变 url 好吗

还有各位
想了一个点子,但没有实践过
很久没有写独立 pc 网页了
就是手机浏览器不可能有 pc 的鼠标悬停,而且不可能有鼠标指针滑动,手机都是点下去而且不可能有按住这个鼠标必有的动作。手机屏幕长按都是弹出什么选择啊,自由复制啊,或者工具栏的。还有 js 里好像能通过判断 keycode 判断左右按键,而手机绝对没有
当然这些都属于被动检测,而且多少都有点缺点,大佬们还是大开脑洞吧

这个是写按键精灵 /游戏蜂窝时候想到的

只会 UA 因为懒 2333

(当年 ie 时代我还脑洞过 ActiveX 检测法~ 2333)
gearkey
2018-02-16 17:37:21 +08:00
@nciyuan 悬停是可以用长按+滑动模拟的,不然多级菜单就废了,,右键和拖动浏览器想支持的话是可以的吧,但没看到了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/430748

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX