QQ空间 代码秒赞

摘要

很久之前就想着要写个脚本,要么去刷12306的票,要么就登QQ空间。为什么呢?你想啊,别人刚发一个说说,然后你就能检测到并秒赞回去,这得多让人惊讶。(不小心暴露了异想天开的本质啦,⊙﹏⊙b汗)。

一开始学习Python的时候就模拟着试了试,除非借助于cookie那块,不然也是没法成功的。然而这次歪打正着。本学期有个《软件工程导论》课程,刚好讲到了测试这块,然后就提到了自动化测试,以及在此行业中的翘楚Selenium,结果就是发现了新大陆一般,觉得拿来测试模拟登陆应该会比较不错。

于是,真的成功啦。在此记录一下,走过的历程,填过的坑。

环境搭建

Selenium是一个支持多语言的自动化测试框架,不管是Java, Ruby,还是Python,都能使用其支持的库来进行自动化测试。我本人最喜欢Python语言,所以这里将会以Python语言进行测试。

驱动

Selenium是典型的CS框架,浏览器作为Server执行Client(selenium代码)的请求,通过“代理”这么个理念实现自动化测试。 这么说可能不太通俗,换句话就是selenium执行的时候会调用浏览器,根据设置好的代码运行,最终实现自动化测试。

selenium2之后,以webdriver代替Proxy功能,处理所有请求。

所以不管怎么说,浏览器都是必不可少的啦。因此我们需要安装一下浏览器驱动。

关于浏览器驱动的问题,可能就是阻挡了大部分人使用selenium的拦路虎吧。

下载

下载驱动的话,可以到 http://www.seleniumhq.org/projects/webdriver/

这个网址进行下载。按需下载即可,待会会讲解怎么使用,我这里下载的是firefoxdriver.exe

下载webdriver驱动

selenium

安装selenium也是很方便的。

如果您已安装比较旧的版本:

pip install -U selenium

如果您还未安装selenium:

pip install selenium

这样就完事了。

驱动安装问题集

下面聊聊我在这个过程中遇到的一些奇怪的问题,可能不具备普适性。

未发现驱动

如果驱动没有正确放置,就会报出下面的错误。


驱动未正确配置

解决办法就是将刚才下载的driver放置到Python的Path或者放到任意一个系统能找得到的Path中。我个人建议放置到Python的根目录中,这样便于管理。

firefox驱动错误

主要症状就是无法开启,闪退。这个时候我们需要下载一个geckodriver.exe。

可以在下面的链接中找到适合自己系统版本的来使用。

https://github.com/mozilla/geckodriver/releases

下载完之后放置到Python路径中即可,处理方法和刚才的那个一样。然后问题就解决了(反正我是这么解决的啦)。

模拟登陆

下面开始步入正题了,使用selenium进行模拟登陆其实就可以想象成有一双无形的手在进行用户名,密码填写,然后点击按钮等等。这样就会变得很容易理解了。

这里关于selenium选择器等等的基础性的知识点就不再讲解了,网上资料很多,也很详细。相信大家一看就会明白的。

我自己最常用也最喜欢的就是:

driver.get_element_by_id()
driver.get_element_by_xpath()

然后要登录QQ空间,就得先看看人家长什么样吧,如图:

QQ空间首页

首败

按下F12就可以查看网页的源代码了,所以什么用户名啊,密码啊,登陆按钮啊都不是事了。不多说,直接上代码。

#coding: utf8

from selenium import webdriver

driver = webdriver.Firefox()

driver.get('http://i.qq.com/')

driver.find_element_by_id('switcher_plogin').click()

driver.find_element_by_name('u').clear()
driver.find_element_by_name('u').send_keys('你的QQ号')
driver.find_element_by_name('p').clear()
driver.find_element_by_name('p').send_keys('你的密码')



driver.find_element_by_xpath('//*[@id="loginform"]/div[4]/a').click()
driver.find_element_by_id('login_button').click()

print driver.current_url

然而我发现我想多了,真正的考验才刚刚开始。这样根本就找不到网页源代码中看到的那些个id啊class什么的。

再败

既然找不到,可能就是代码的问题了。然后我又仔仔细细的查看了一下代码,发现也没啥错误啊。然后不甘心,又去看了看网页的源代码。结果还真的被我发现了。

尼玛,这叫什么事嘛。

如下图,不难发现了吧。


多了个iframe

有一个iframe,怪不得Selenium找不到,既然如此,那咱们就乘胜追击。修改一下代码呗。

#coding: utf8

from selenium import webdriver

driver = webdriver.Firefox()

driver.get('http://i.qq.com/')
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()

driver.find_element_by_name('u').clear()
driver.find_element_by_name('u').send_keys('你的QQ号')
driver.find_element_by_name('p').clear()
driver.find_element_by_name('p').send_keys('你的密码')



driver.find_element_by_xpath('//*[@id="loginform"]/div[4]/a').click()
driver.find_element_by_id('login_button').click()

print driver.current_url

加上了这么一行:

driver.switch_to.frame('login_frame')

作用就是根据iframe的id或name来跳转到这个iframe上。

本以为完事大吉咯,终于可以秒赞了,耶。

然而事实给了我一个残酷的打击。到最后一个“登录”按钮点击的时候停了下来。结果还是失败了。

成功

它越是这样,我就越想写出来。没办法,硬着头皮上呗,直觉上还是QQ空间源代码的问题,于是这次就直接继续看源代码去了。
果不其然,发现了下图这么个代码。


hidefocus问题

然后我就想使用JS来把这个故意隐藏不让focus的给显现出来。

恩,我就是这么做的,然后真的就成功了。核心就添加了下面的这行代码。

driver.execute_script("document.getElementById('login_button').parentNode.hidefocus=false;")

下面贴出来完整的代码吧,方便参考。

#coding: utf8

from selenium import webdriver

driver = webdriver.Firefox()

driver.get('http://i.qq.com/')
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()

driver.find_element_by_name('u').clear()
driver.find_element_by_name('u').send_keys('你的QQ号')
driver.find_element_by_name('p').clear()
driver.find_element_by_name('p').send_keys('你的密码')

driver.execute_script("document.getElementById('login_button').parentNode.hidefocus=false;")


driver.find_element_by_xpath('//*[@id="loginform"]/div[4]/a').click()
driver.find_element_by_id('login_button').click()

print driver.current_url

演示

下面使用一个gif图来演示一下模拟登陆的效果,方便流畅性的观看,也更具说服力。

QQ空间模拟登陆

总结

到此基本上已经可以拿来使用了。无非在登陆成功的界面下使用Selenium模拟进行一些点击操作。如果想发点文字的话也是很方便的,send_keys可以很好的解决这个问题。什么秒赞,秒答都不是什么事了。

但是需要注意的是,QQ空间对登陆频率是做了限制的,就算是手动登陆,连续几次之后就会让我们输入验证码。这也是一种安全机制罢了。

如果有需要的话,Python处理验证码的模块也是非常好用的。这里就不再介绍了。

最后,Selenium给我的感悟就是:我自己对Selenium有点大材小用了,这样一款优秀的测试框架,却拿来做这种小玩意,确实是有点说不过去。

另外我也认识到了,测试的目的是为了提供更好的服务。而不是拿来当做攻击的手段。恶意的发水机,这种行为极不负责任,希望我们都能谨言慎行,共同营造一个和谐的网络家园。

心正了,人才会正直。感谢Selenium给我的这个启迪。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容