qq空间自动点赞

前言

前端时间尝试用爬虫爬取某jd的商品数据,而后发现普通方式(辣鸡的我)爬取不到。而后了解了一下selenium这个神器,而后就有了这个点赞demo。这是 预览地址,固然你也能够拉github跑在本地。前端

基本功能的实现

首先要导入selenium-webdriver库,而后安装对应浏览器的driver,我这里使用的与chrome对应的chromedriver(注意对应浏览器版本)。 node

有了selenium库,咱们能够经过代码来控制浏览器模拟用户行为,这也是为啥大部分反爬措施对selenium无效的缘由。如下为登录qq空间的操做代码:

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点赞标签来实现点赞了。git

可是在demo第二次运行的时候,发现点过赞的被点了取消,所以咱们须要对点击操做作一个过滤,只对没用点赞的标签进行点击。经过对比发现,qq空间的点赞图标并非用的iconfont矢量字体,而是用的雪碧图定位,那么咱们就能够经过定位值来作是否已赞判断。

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空间使用了懒加载,当天的说说比较多的时候首次加载并不会加载所有,点赞就只能点到当前加载的部分。咱们须要添加一个说说日期判断,当已加载说说包含昨日说说时,说明已加载所有今日说说;不然执行滚动条下拉操做,加载更多说说。github

这里根据时间标签内的文本长度来作日期判断。

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

web控制

点赞功能虽然实现了,可是并不能直观展现在前端,并且帐号仍是固定写死在代码里的。而后鄙人用node写了个后台,前端传帐号密码过去,后台接收后执行点赞部分代码。若是更进一步,能够在后台把帐号密码存入数据库而后每日遍历就能够实现多帐户自动点赞。做为一个弱鸡前端,后台代码就不贴出来了,若是须要请看这里chrome

相关文章
相关标签/搜索