2017年12月26日星期二

Selenium + ChromeDriver + Xvfb run on ubuntu server without X11

Install Chrome
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
dpkg -i google-chrome-stable_current_amd64.deb
apt-get update
apt-get install -f
Install pip
apt-get install python-pip
Install Selenium
export LC_ALL=C
pip install selenium 
Install Xvfb
apt-get install xvfb
Download ChromeDriver
wget https://chromedriver.storage.googleapis.com/2.34/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
 Run Xvfb
Xvfb :22

Test selenium
attention: google chrome will crash if running under root user. Switch user first  if your are root.
export DISPLAY=:22
python
from selenium import webdriver
driver = webdrvier.Chrome("./chromedriver")
driver.get("http://www.baidu.com")

#should return https protocl url
driver.execute_script("return window.location")

#should return an element
driver.execute_script("return document.getElementById('kw')")


2017年7月12日星期三

[FAILED] ubuntu 16.04 上使用 TP-LINK WN725N 免驱版 无线网卡

该网卡使用MTK 7601u芯片。虽然型号也叫WN725N,但是和之前的WN725N根本就不是一个东西。。。是的,除了生产厂家以及都是黑色USB无线网卡以外,二者没有任何共同点。
插到机器上之后,lsusb显示为:
Bus 003 Device 006: ID 148f:2878 Ralink Technology, Corp.

系统将之挂载为一个cdrom。在Windows上,可以直接使用里面的安装程序进行驱动安装。
并将网卡模式切换为无线网卡模式。

在Ubuntu上,为了切换模式,参考了usb_modeswitch的data文件:
# RaLink MT7601U
TargetVendor=0x148f
TargetProduct=0x7601
StandardEject=1

是的,只要进行eject即可。。。
可直接执行:
sudo eject /dev/sr0
或者
sudo usb_modeswitch -v 148f -p 2878 -K

之后lsusb,等待一下,即可观察到:
Bus 003 Device 007: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter

其实这个等待的时间,是系统正在使用自带mt7601驱动尝试probe网卡。

[  589.049149] usb 3-11: reset high-speed USB device number 7 using xhci_hcd
[  589.179614] mt7601u 3-11:1.0: ASIC revision: 76010001 MAC revision: 76010500
[  589.180380] mt7601u 3-11:1.0: Firmware Version: 0.1.00 Build: 7640 Build time: 201302052146____
[  592.645071] mt7601u 3-11:1.0: Vendor request req:07 off:09a8 failed:-110
[  595.764998] mt7601u 3-11:1.0: Vendor request req:02 off:09a8 failed:-110
[  598.884833] mt7601u 3-11:1.0: Vendor request req:07 off:0734 failed:-110
[  602.004776] mt7601u 3-11:1.0: Vendor request req:42 off:0230 failed:-110
[  605.124673] mt7601u 3-11:1.0: Vendor request req:07 off:0080 failed:-110
[  608.244542] mt7601u 3-11:1.0: Vendor request req:02 off:0080 failed:-110
[  611.364455] mt7601u 3-11:1.0: Vendor request req:02 off:0080 failed:-110
[  611.364489] mt7601u: probe of 3-11:1.0 failed with error -110
[  611.364526] usbcore: registered new interface driver mt7601u

可以看到,probe最终失败了。应该是网卡驱动(分析代码后发现,也可能是firmware)和该型号网卡不匹配。
参照https://askubuntu.com/questions/457061/ralink-mt7601u-148f7601-wi-fi-adapter-installation
手动安装驱动。
sudo apt-get install linux-headers-generic build-essential git

git clone https://github.com/art567/mt7601usta.git

cd mt7601usta/src

make

sudo make install

sudo mkdir -p /etc/Wireless/RT2870STA/

sudo cp RT2870STA.dat /etc/Wireless/RT2870STA/

sudo modprobe mt7601Usta

注意:考虑到之前的驱动已经加载,在执行modprobe之前,应该考虑先将之前的驱动rmmod掉。(实际尝试后发现然并卵。)
系统默认驱动信息:

modinfo mt7601u
filename:       /lib/modules/4.4.0-81-generic/kernel/drivers/net/wireless/mediatek/mt7601u/mt7601u.ko
license:        GPL
firmware:       mt7601u.bin
srcversion:     C4F802D4D12C5BC2BA7FEB7
alias:          usb:v7392p7710d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v2A5Fp1000d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v2955p1001d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v2955p0001d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v2717p4106d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v2001p3D04d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v148Fp760Dd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v148Fp760Cd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v148Fp760Bd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v148Fp760Ad*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v148Fp7601d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v13D3p3434d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v13D3p3431d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0E8Dp760Bd*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0E8Dp760Ad*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0B05p17D3d*dc*dsc*dp*ic*isc*ip*in*
depends:        mac80211,cfg80211
intree:         Y
vermagic:       4.4.0-81-generic SMP mod_unload modversions


modprobe执行之后,可以查看sudo lshw -C net
  *-network DISABLED
       description: Wireless interface
       physical id: 2
       logical name: ra0
       capabilities: ethernet physical wireless
       configuration: broadcast=yes driver=RALINK WLAN multicast=yes wireless=Ralink STA

可见系统已经可以识别该网卡,但网络处于disable状态。可能和我机器系统本身有关。在dmesg中可以看到
[ 1108.702033] ModemManager[925]: segfault at 0 ip 0000000000431ab3 sp 00007fffc062e940 error 4 in ModemManager[400000+
103000]

接下来尝试使用ifconfig强行up  ra0

sudo ifconfig ra0 up

命令长时间没有反应

尝试将Ubuntu升级至 17.04,效果依旧。估计要深入分析驱动代码,太浪费时间。同时考虑到未来内核升级也要重新手动修改驱动,用户体验难以接受。决定放弃尝试。

================================================================
最终解决方案:
又购买了普通版本TL-WN725N(更小更便宜),未做任何配置,插在机器上,瞬间完成驱动。
教训:一分钱一分货是不假,但在linux的世界里,性价比才是最安全的标准。


2017年6月20日星期二

尝试屏蔽iqiyi播放器浮动广告

今天突然发现iqiyi网页播放器在鼠标悬停时,会显示一个看起来是处于测试阶段的浮动广告(即便我已经购买了VIP)。
尝试自定义了一个adbblock plus规则进行屏蔽:
iqiyi.com##div[width="95px"][height="235px"]
由于这个广告并非100%出现,目前无法完全确定评比规则的效果。

规则使用css selector来选取目标。参照:
https://www.w3.org/TR/css3-selectors/

2017年6月12日星期一

Python requests 通过socks5 proxy连接网络

#Python requests work over socks5

#安装requests 对socks5的支持。目前pip在中国大陆已经无法正常访问,所以这里使用proxychains来进行安装。
sudo -H proxychains pip install requests[socks]
 #设定proxy信息。socks5h中的“h”表示rquests通过proxy解析域名。对于dns污染严重的区域来说是必须的。
proxies_config = {'http': 'socks5h://127.0.0.1:1080', 'https': 'socks5h://127.0.0.1:1080'}
 #测试一下
r = requests.get(url="https://www.google.com",proxies=proxies_config,timeout=10,verify=True)
print r.text