整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python爬虫实战:QQ空间全自动点赞工具

Python爬虫实战:QQ空间全自动点赞工具

Q空间自动点赞

  • 前景提要目标确定分析介绍登陆获取cookie寻找XML寻找可变参数获取第一个空间动态寻找点赞所需的URL寻找可变参数功能提升到秒赞全部代码最后还是希望你们能给我点一波小小的关注。奉上自己诚挚的爱心

私信小编01即可获取大量Python学习资料

前景提要

因为我周围的小伙伴们天天跟我说的最多的一句话就是:空间第一条点赞。
所以说我还不如直接做一个自动点赞的代码呢,免得天天催我点赞。


目标确定

  • QQ空间秒赞

分析介绍

登陆获取cookie

首先既然是对 QQ空间的一系列操作,自然是先解决登陆方面,在这篇文章里面我就不过多介绍了,因为我上几期之前对QQ空间已经做了一定的介绍了。直接放出链接就好。欢迎看博主以前的文章

def search_cookie():
    qq_number=input('请输入qq号:')
    if not __import__('os').path.exists('cookie_dict.txt'):
        get_cookie_json(qq_number)
    with open('cookie_dict.txt', 'r') as f:
        cookie=json.load(f)
    return True
def get_cookie_json(qq_number):
    password=__import__('getpass').getpass('请输入密码:')
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    login_url='https://i.qq.com/'
    chrome_options=Options()
    chrome_options.add_argument('--headless')
    driver=webdriver.Chrome(options=chrome_options)
    driver.get(login_url)
    driver.switch_to_frame('login_frame')
    driver.find_element_by_xpath('//*[@id="switcher_plogin"]').click()
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="u"]').send_keys(qq_number)
    driver.find_element_by_xpath('//*[@id="p"]').send_keys(password)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="login_button"]').click()
    time.sleep(1)
    cookie_list=driver.get_cookies()
    cookie_dict={}
    for cookie in cookie_list:
        if 'name' in cookie and 'value' in cookie:
            cookie_dict[cookie['name']]=cookie['value']
    with open('cookie_dict.txt', 'w') as f:
        json.dump(cookie_dict, f)
    return True
def get_g_tk():
    p_skey=self.cookie['p_skey']
    h=5381
    for i in p_skey:
        h +=(h << 5) + ord(i)
        g_tk=h & 2147483647

寻找XML

当我们拿到cookie信息和g_tk这个参数之后,继续去寻找空间好友动态的XML在何处。
首先点到XML位置一个个查找,发现有一个feeds3_html_more很像,点进去发现的确是我们要找的url链接。

寻找可变参数

这个链接所需要的参数有很多,在这里列举出来

  • uin:
  • scope:
  • view:
  • daylist:
  • uinlist:
  • gid:
  • flag:
  • filter:
  • applist:
  • refresh:
  • aisortEndTime:
  • aisortOffset:
  • getAisort:
  • aisortBeginTime:
  • pagenum:
  • externparam:
  • firstGetGroup:
  • icServerTime:
  • mixnocache:
  • scene:
  • begintime:
  • count:
  • dayspac:
  • sidomain:
  • useutf8:
  • outputhtmlfeed:
  • rd:
  • usertime:
  • windowId:
  • g_tk:
  • qzonetoken:
  • g_tk:

这些参数中类似于可变参数的一共有五个。

  • qzonetoken
  • windowId
  • rd
  • usertime
  • g_tk
  1. qzonetoken 参数在源码中是个可变的“定值”,因为每次刷新这个参数都会变,但是源码中却给出了他的具体值。直接获取即可。

def get_space():
    your_url='https://user.qzone.qq.com/' + str(qq_number)
    html=requests.get(your_url,headers=headers,cookies=cookie)
    if html.status_code==200:
        qzonetoken=re.findall('window.g_qzonetoken=(.*?);',html.text,re.S)[1].split('"')[1]
    return True
  1. windowId 与 rd 虽说每次刷新结果都不同,但是经过博主多次实验得出,这两个参数对整体并没有什么影响,可以直接抄下来。
'rd': '0.9311604844249088',
'windowId': '0.51158950324406',
  1. usertime 参数看似很眼熟,是个时间戳参数,因为位数不对,说明应该是被放大了一千倍。
'usertime': str(round(time.time() * 1000)),
  1. g_tk 参数上次教程已给出。在JavaScript中分析即可获得。
def get_g_tk():
    p_skey=self.cookie['p_skey']
    h=5381
    for i in p_skey:
        h +=(h << 5) + ord(i)
        g_tk=h & 2147483647

获取第一个空间动态

我们拿到XML以及各个参数后,即可访问该网页获取其返回值了。
但是这个返回与其他的有一些不同的是,它不仅仅是个json文件,我们无法获取后直接转换成字典格式去给我们使用,这就很麻烦。


我们获取字符串后,首先先将前后不一致的都切片扔掉,之后经过一系列处理后发现,我们很难将这个看似像json格式的字符串转换成字典。
在这里我继续介绍一个第三方库demjson。

demjson 可以解決不正常的json格式数据

demjson的使用方法很简单。

encode将 Python 对象编码成 JSON 字符串decode将已编码的 JSON 字符串解码为 Python 对象

# 例子
# -*- coding: utf-8 -*-
import demjson
js_json="{x:1, y:2, z:3}"
py_json1="{'x':1, 'y':2, 'z':3}"
py_json2='{"x":1, "y":2, "z":3}'
data=demjson.decode(js_json)
print(data)
# {'y': 2, 'x': 1, 'z': 3}
data=demjson.decode(py_json1)
print(data)
# {'y': 2, 'x': 1, 'z': 3}
data=demjson.decode(py_json2)
print(data)
# {'y': 2, 'x': 1, 'z': 3}

我们使用demjson直接将该字符串转换为耳熟能详的字典格式,提取其中的data的data,即为前八条动态的每个参数,但我们这里只要第一个说说的动态信息。

text=html.text[10:-2].replace(" ", "").replace('\n','')
json_list=demjson.decode(text)['data']['data']
qq_spaces=json_list[0]

我们拿到其信息后,先提取一些我们比较想知道的东西,比如名字、QQ号、发布时间、所获赞数、说说内容、说说地址等等结果。
在 qq_spaces 参数中我们发现里面有一个很长也很特殊的一个结果是 html 结果,这个结果里面很长,简单来看是个网页常规代码,应该是被JavaScript写入到网页中了,既然不是全部代码,那么只能用正则提取一下里面的具体我们需要的东西了。

content=str(qq_spaces['html'])
try:zanshu=re.findall('<spanclass="f-like-cnt">(.*?)</span>人觉得很赞</div>',content,re.S)[0]
except:return None
time_out=str(qq_spaces['feedstime'])
print("名字:"+str(qq_spaces['nickname']))
print("QQ号:"+str(qq_spaces['opuin']))
print("时间:"+time_out)
print('赞数:'+zanshu)
times=qq_spaces['abstime']
his_url=re.findall('data-curkey="(.*?)"',content,re.S)[0]

寻找点赞所需的URL

在QQ空间随便找个好友点个赞吧,这样我们才能接收到请求。
我们首先清空原来动态产生的抓包,直接点个赞发现关于dolike的url只有三个,第一个是个POST请求,应该是我们所需要的点赞网址。

寻找可变参数

我们获取到URL后,找到里面所需要的参数。发现一共有十一个参数,在这里猜测应该不存在加密参数。

  1. qzreferrer参数为自己QQ空间的网址,表示从哪里来的链接地址。
  2. opuin参数为自己的QQ号,可以直接在代码提取。
  3. unikey参数与curkey参数为被点赞方的链接,即说说链接,刚才已获取。
  4. abstime参数为被点赞方说说的发布时间的时间戳。
  5. fid参数为被点赞方的链接后缀。

既然参数没什么问题那就直接写代码吧。

def get_zan(times,his_url):
    data={'g_tk': g_tk,'qzonetoken': qzonetoken}
    post_data={
        'qzreferrer': 'https://user.qzone.qq.com/'+str(qq_number),
        'opuin': str(qq_number),
        'unikey': str(his_url),
        'curkey': str(his_url),
        'from': '1',
        'appid': '311',
        'typeid': '0',
        'abstime': str(times),
        'fid': str(his_url).split('/')[-1],
        'active': '0',
        'fupdate': '1'
    }
    url='https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?'
    url=url + urllib.parse.urlencode(data)
    html=requests.post(url,headers=headers,cookies=cookie,data=post_data)
    if html.status_code==200:print("点赞成功" if len(html.text)==469 else "点赞失败")

功能提升到秒赞

因为树莓派并不是很不错的问题,这个代码做不到绝对的秒赞。

  1. 在本地建立一个文件,负责写入最后一条说说所产生的时间戳。
  2. 比对当前时间戳与空间第一条说说是否相同,若相同则无更新。
  3. 点赞后重写文件,以便下次使用代码即可秒赞。
def run_tolike():
    if os.path.exists('time_out.txt'):
        with open('time_out.txt','r') as f:
            time_out=f.read()
    else:time_out=None
    while True:
        get_friends_list()
        time.sleep(__import__('random').randint(0,5)) # 秒赞?
if not time_out or time_out !=time_out:
    time_out=time_out
    get_zan(times,his_url)
    return True
else:log('说说无更新,等待中...')
with open('time_out.txt','w') as f:
    f.write(str(times))

全部代码

SEO必须要懂HTML,说的是一点都没错,不过其实是不需要全部都懂,最重点的你懂了会用,基本上都是事半功倍了。可以这么说一个不懂代码的优化人员不算是一个合格的好优化。下面就总结一下做优化,必须要懂得几个最重要的html代码,希望能帮到大家。

1.Title网站标题标签

  1. Title标签有两个地方的用途一个是用在网站的主题说明,用来告诉网友这个网站的主旨是什么,是什么样的网站,一般用来说明网站主题的词2-3个为最佳。目前搜索引擎对Title的重视程度尤为重视所以建议慎重考虑关键词。

  2. Title标签的第二个用法是,在A标签里面对链接文字强调说明的。鼠标经过会有提示,可以增加网站关键词的密度。

2.description描述标签

描述标签一般会出现在抓取的快照里面,对网站的收录SEO排名也是有一定的影响,不过现在搜索引擎都是智能化的,有时候抓取的并不是你自己所写的描述标签。而会根据用户搜索关键词相关度匹配。一般建议长度在100 个字左右不宜过长。

3.keywords关键词标签

关键词keywords设置现在在搜索比重上面也越来越不明显了,好多搜索已定提出可以放弃设置,因为搜索引擎能够自动抓取,建议适当设置3个左右即可。

  1. H标签

  1. H1标签一般出现在页面LOGO,或者单个文章的主标题部分。一个页面最好能控制在2个之内切不可过多。

  2. H2标签一般会用在网站栏目或者小标题标题部分。

  3. H3标签一般用在侧栏小标题子标题部分。

4.<b>和<strong>文字加粗标签

文字加粗着重强调这文字比较重要,它会告诉搜索引擎此文字,在整个页面文字中比较重要,所以一般加粗一些关键词,一篇文章设置3-5个为宜,不可整篇加粗或者整篇不加粗。

  1. A标签中的,Nofollow权重不传递,_blank新窗口打开

  1. rel标签的属性Nofollow权重不传递属性,一般用于友情链接,或者网站有转出站外的链接。

  2. target标签的属性_blank新窗口打开,以保留用户在网站的停留时间,降低网站跳出率。

  3. se_prerender_url标签目前还在研究,不过发现一些站长站都已经用上,搜索发现是谷歌吸引爬虫而出,目前尚不具体了解用途。

5.alt图片描述标签

因为图片不具有SEO属性,所以alt越显重要,ALT主要是图片描述说明只用,用可以增加关键词密度,但切记不可过多频繁。

HTML的不同标签在SEO优化中的权重分数及权重排序

内部链接文字:10分

标题title:10分

域名:7分

H1,H2字号标题:5分

每段首句:5分

路径或文件名:4分

相似度(关键词堆积):4分

每句开头:1.5分

文本用法(内容):1分

title属性:1分 (不是<title>, 是A标签中title属性)

加粗或斜体:1分

alt标记:0.5分

Meta描述(Description属性):0.5分

Meta关键词(Keywords属性):0.05分

--------------------------------------------------------

想了解更多网站优化,网络营销,网站运营,SEO/SEM/DSP,微博微信营销

可以百度搜索王尘宇查看更多进行交流。

关注王尘宇个人QQ/微信:314111741

想绘图插件5.2(MxDraw5.2)


梦想CAD是专业的CAD插件(控件),经过10年研发,可轻松在网页、手机及BS/CS程序中使用CAD和浏览编辑DWG文件,不需安装AutoCAD即可运行。

控件核心代码使用VC++ 2010开发,至今已有三十万行代码规模;2007年发布第一个Release版本,经过多年的版本更迭与技术沉淀,控件已经十分快速稳定。在关键的 空间搜索 上使用了复杂度极低的算法,并且使用 汇编 优化,可以处理50万级的实体,图形的显示和处理效率比同类产品高出很多。


梦想绘图3d插件6.0(MxDraw6.03d)


使用二位控件的显示核心,基于 OpenCASCADE几何造型引擎 ,创建锥、柱、环等基本几何体,对几何体进行 布尔操作 ,如:相加、相减、相较、倒角、斜切、镂空、偏移、扫视;几何 空间关系计算 ,如:法线、点积、叉积、投影、拟合;几何体分析,如:质心、体积、曲率; 空间变换 ,如:平移、缩放、旋转。


梦想绘图手机版插件6.0(MxDrawAndroid6.0/MxDrawIOS6.0/)


使用二维控件的显示核心,并专对手机显示CAD图纸做了极速优化 ,是目前手机上显示DWG文件非常快的控件。


梦想CAD软件5.2(MxCAD5.0)


使用二维控件的显示核心,完全自主的二维CAD绘图软件,程序简洁、运行快速、功能齐全、稳定可靠;兼容 所有版本的DWG文件 ,支持 ARX的二次开发接口。


安装包下载


点击此处下载

运行环境

支持以下的32/64平台的系统:WindowsXP、Windows2000、WindowsVista、WindowsServer、Windows7、Windows8、Windows10。


支持以下的浏览器:IE所有版本、火狐、谷歌4.5及以前的版本、360浏览器(兼容模式)、QQ浏览器。


1

QQ浏览器使用了最新的谷歌浏览器内核,可使用QQ浏览器代替谷歌浏览器运行控件

支持语言

网页使用,支持 IE所有版本

控件支持如下的语言进行二次开发:VC、VB、CSharp、Delphi、HTML、ASP、JAVA、JavaScript、C++、 Builder、PHP、.Net、易语言、PowerBuild等。

编程接口

有一万多个接口函数 可供调用,提供Object Arx,AutoCAD VBA、COM开发接口,与AutoCAD二次开发类似的接口。

文件格式

控件支持自定义文件格式,扩展名为.mxg,mxg文件 稳定可靠 ,能 完整呈现DWG文件 ,支持图纸预览,加密;支持DWG、DXG、BMP、JPG、PNG、DWF、PDF、GIF、ICO DGN、SHP等。

支持SHX、TrueType字体。

控件与AutoCAD兼容,支持AutoCAD R14至AutoCAD 2017的 所有DWG图纸格式 ,并保证能支持将来新出现的AutoCAD文件格式。

网络功能

在控件支持的浏览器(见 运行环境 )中,控件可浏览服务器上的DWG文件,把DWG文件保存到服务器、在服务器后台运行控件、把DWG转成其他格式、提取信息等;支持FTP连接,二进制数据流加载。


在网页中使用控件演示

主要功能

DWG批量转到PDF、DWF,图纸信息搜索提取,测距离,算面积,图章, 批注 ,捕捉,正交,实体闪烁,曲线离散,偏移,打断,阵列,扩展数据读写,扩展记录读写,构造选择集,打印, 动画自定义实体 ,组,右键菜单, 超连接 ,Undo,Redo,字典,图层,标注样式,线型样式,文字样式,视口,布局, 用户坐标系 ,系统变量,图纸比较,图纸剪切,界面切换,动态提示,google百度地图等。

打印功能

框选、全屏打印、后台批量打印、多个 图纸嵌套打印 、与 网页合并打印 等。

显示功能

鸟瞰、放大镜、视区平移、缩放、视区旋转、鹰眼、 透明显示 、背景、水印、网格、回溯显示、最佳显示、显示/隐藏工具条、浏览模式、 分屏显示 、矢量线、矢量圆、 动画 、动态标注、叠加对比显示等。

图元支持

主要实体有:直线,圆弧,Polyline,样条线,圆,椭圆,椭圆弧,IMAGE,点,块引用,外部块参照,射线,云线,文本,多行文本,对齐标注,旋转标注 ,半径标注,直径标注,角度标注,OLE对象,布局,视口,图层,线型,文字样式,命名字典,标注, 自定义实体 ,代理实体, 反应器 等。主要编辑有:移动,夹点拉伸,偏移,删除,复制,粘贴,旋转,缩放,镜向,离散,图案填充,实心填充,打碎,计算曲线长,面积,最jin点,交点,导角, 文字变线条 等。

编辑支持

移动、夹点拉伸、偏移、删除、复制、粘贴、旋转、缩放、镜向、离散、图案填充、实心填充、打碎、计算曲线长、面积、最近点、交点、倒角、文字变线条等。

几何运算

面积,夹角,向量,矩阵,旋转,缩放,最进点,最进距离,垂足,参数,镜向,平移,交点,打断,延伸, 最短路径最长路径

支持事件

鼠标事件键盘事件 ,选择修改,夹点编辑,打图纸完成,命令开始,命令执行完成,视区变化,动态提示,动态绘制,超连接点击,对象修改,命令执行,进度条变动,系统变量修改,控件初始化完成,等事件。