前言
前端时间尝试用爬虫爬取某jd的商品数据,然后发现普通方式(辣鸡的我)爬取不到。然后了解了一下selenium这个神器,然后就有了这个点赞demo。这是 预览地址,当然你也可以拉github跑在本地。
基本功能的实现
首先要导入selenium-webdriver库,然后安装对应浏览器的driver,我这里使用的与chrome对应的chromedriver(注意对应浏览器版本)。

var driver = new webdriver.Builder().forBrowser('chrome').build(); //创建一个chrome 浏览器实例
driver.get("https://user.qzone.qq.com/qq账号"); //打开qq空间地址
driver.switchTo().frame(driver.findElement(By.id("login_frame"))); //切换登陆功能对应的iframe(不执行该步骤,后续点击操作会失效)
driver.findElement(By.id("switcher_plogin")).click() //账号密码登陆按钮点击
driver.executeScript('document.getElementById("u").value="qq账号"')
driver.executeScript('document.getElementById("p").value="密码"')
driver.findElement(By.id("login_button")).click() //登陆
driver.manage().window().maximize(); //最大化浏览器
driver.switchTo().defaultContent();
dianzan(driver) //调用点赞功能函数
登陆完成之后,我们就可以通过click点赞标签来实现点赞了。

driver.findElements(By.className("fui-icon icon-op-praise")).then((arr)=>{
for(let i=0;i<arr.length;i++){
arr[i].getCssValue('background-position').then(v=>{
if(v=='-52px -921px'){
console.log(i,'已赞')
}else{
console.log(i,'点赞')
arr[i].click()
}
})
}
})
再次执行demo,发现重复点赞问题已解决,但是又有一个新问题:因为qq空间使用了懒加载,当天的说说比较多的时候首次加载并不会加载全部,点赞就只能点到当前加载的部分。我们需要添加一个说说日期判断,当已加载说说包含昨日说说时,说明已加载全部今日说说;否则执行滚动条下拉操作,加载更多说说。


driver.findElements(By.className("info-detail")).then((arr)=>{
arr[arr.length-1].getText().then(v=>{
if(v.length>5){ //当前已经加载非当日说说
console.log('当天的说说已经赞完了')
driver.quit()
driver.sleep(24*60*60*1000) //点赞时差
openChrom()
}else{
driver.executeScript('document.documentElement.scrollTop=100000'); //模拟滚动加载更多动态
dianzan(driver) //递归调用
}
})
})
至此基本功能已经实现,放在服务器就可以每天自动点赞一次(朕已阅,完美~~)。
web控制
点赞功能虽然实现了,但是并不能直观展示在前端,而且账号还是固定写死在代码里的。然后鄙人用node写了个后台,前端传账号密码过去,后台接收后执行点赞部分代码。如果更进一步,可以在后台把账号密码存入数据库然后每日遍历就可以实现多账户自动点赞。作为一个弱鸡前端,后台代码就不贴出来了,如果需要请看这里。