likes
comments
collection
share

用python写个脚本把QQ空间多年动态删了

作者站长头像
站长
· 阅读数 19

这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战

讲真的,我在写这个脚本的时候,我还没把python的基本语法都了解了。我只能说,语言不重要,好用就行。。。

至于为什么想删QQ动态,只是不想老是看到那年今日那些曾经发的很幼稚的话,动态又多(虽然这几年已经不用QQ了),用手太费劲,就想写个脚本自动处理了。

要想删除所有动态,我需要做2件事:

  1. 获取所有的动态信息

  2. 获取删除的url,遍历已经获取的所有动态,然后全部删除了就行。

另外,这有一个大前题:需要先获取到会话信息。这个简单,毕竟是自己的QQ,直接登录然后,浏览器上什么不都有了。

当然,这说起来简单,做起来嘛。。。。。。。也挺简单。

我本来是想用shell解决的,后来抓下动态信息,发现是个json。我想了想,觉得python应该好用点(赶紧先用俩小时研究下python语法)。

下面开始了:

  1. 登录QQ空间,点击说说,首先要找到可以获取动态信息列表的url。这里我就直说我的分析结果了,在动态下面有个页码,点击的时候的url就是,下面给个示例:
https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin=763795151&inCharset=utf-8&outCharset=utf-8&hostUin=763795151&notice=0&sort=0&pos=840&num=20&cgi_host=http%3A%2F%2Ftaotao.qq.com%2Fcgi-bin%2Femotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk=635656033&qzonetoken=8f1208fd31ba56f14fb6f71f498501c179fde08e0a6866589e12672dc8fe8c2af00b924c63f35c

大概就是上面这个样子,里面有两个参数,pos:从第几条开始,num:获取几条。需要的时候调整这两个参数的值即可。

然后,把这个url在浏览器上发个请求,我用的谷歌。然后把请求头、cookie等信息都拿出来。根据pos和num的值就可以获取到动态信息。返回的结果是一个字符串,掐头去尾就剩中间的部分就是个Json字符串了。

我已经删除完了,也不给示例了,我直接描述这个字符串了,这个json串中有个字段msglist是个列表,可能为空,在不空的时候,每个值有个字段是tid,tid的值就是我们删除这条动态的时候需要用的一个查询参数。把每条动态的tid保存起来,后面遍历删除即可。

  1. 获取删除的url。这个操作很简单,删除一个,然后把删除的请求信息拿出来就行(查看浏览器)。这个是个post方法,拿到删除时候用到的url、请求头、cookie、请求参数。然后配置好。

  2. 遍历1中获取的所有tid,然后设置每个tid为要删除的请求中参数,依次删除即可。

倒是不复杂,没多少技术含量。下面贴下我的实现,毕竟第一次用python,也不知道姿势对不对。

代码:

#! /usr/bin/python

import requests
import re
import json

#总共要删除的动态数
total=840
limit=10
pages=total/limit
start_pos=2
tids=[]
#文中说的掐头去尾就是json,所以这里用个正则处理
pattern=re.compile(r'^_Callback((.*));$')
#获取所有动态的tid
cookie="换成自己浏览器中的cookie信息"
#请求头
request_headers={'authority':'h5.qzone.qq.com','method':'GET','path':'/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin=763795151&inCharset=utf-8&outCharset=utf-8&hostUin=763795151&notice=0&sort=0&pos=820&num=40&cgi_host=http%3A%2F%2Ftaotao.qq.com%2Fcgi-bin%2Femotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk=1874324779&qzonetoken=98cd2ff9067f620f90a72cbe07da56012b4593659ebbf1deba0b350e82d53be364cd48d038e7ca','scheme':'https','accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3','accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7','cache-control':'max-age=0','cookie':cookie, 'upgrade-insecure-requests':'1'}
def getTids(say_list_url):
    res=requests.get(say_list_url, headers=request_headers)
    text=pattern.findall(res.text)[0]
    resolveTid(text)
    print "tid len: %d" % (len(tids))
    
def resolveTid(text):
    jsonObj=json.loads(text)
    if  not jsonObj.has_key('msglist') :
        print text
        return False
    msglist=jsonObj['msglist']
    if  msglist is None :
        return False
    for msg in msglist:
        print "tid: %s" % (msg['tid'])
        tids.append(msg['tid'])

for page in range(pages):
    num=limit*page
    #动态设置pos和num值来获取所有的说说信息
    say_list_url="https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin=763795151&inCharset=utf-8&outCharset=utf-8&hostUin=763795151&notice=0&sort=0&pos=%d&num=%d" % (start_pos+num, limit) + "&cgi_host=http%3A%2F%2Ftaotao.qq.com%2Fcgi-bin%2Femotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk=1168850316&qzonetoken=87520ec2a71a9f349d23d7e462ffdef0bc3075786bc42114239de62af56e92ca85ccb2eb098144" 
    getTids(say_list_url)

print "total: %d" % (len(tids))
print "start delete..."

#删除说说的url,换成自己的
delete_url="https://user.qzone.qq.com/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_delete_v6?qzonetoken=fc557d5f5542fbb951479b8e8b2f1a0f163db952eb44cef275261b76b758edeb51c34834c16f80&g_tk=597814207"
delete_cookie="换成自己的浏览器的cookie"
#换成自己的
delete_headers={'authority':'user.qzone.qq.com','method':'POST','path':'/proxy/domain/taotao.qzone.qq.com/cgi-bin/emotion_cgi_delete_v6?qzonetoken=9a40f79cdd9908ccbd41466b3b2276314f155525357ae4fb8a7d90093f6379e5144d31eefeabc6&g_tk=597814207','scheme':'https','accept':'*/*','accept-language':'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7','content-length':'178','content-type':'application/x-www-form-urlencoded;charset=UTF-8','origin':'https://user.qzone.qq.com','referer':'https://user.qzone.qq.com/763795151/311', 'cookie': delete_cookie, 'user-agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Mobile Safari/537.36'}
body={'hostuin':'763795151','t1_source':'1','code_version':'1','format':'fs','qzreferrer':'https://user.qzone.qq.com/763795151/311','tid':''}
for tid in tids:
    body['tid']=tid
    print body
    dr=requests.post(delete_url, data=body, headers=delete_headers)
    print dr

如果会话信息太久失效了,就重新登录更新下,做web都明白这个。如果出现403,那就是配置不正确,确认请求头、cookie、url都不要复制错了。

这算是我用python写的第一个程序了,没想到竟然不是hello,world~~~。

上面的这个脚本我当时执行了下,确实是将我空间多年的动态一次性全部清完了。后来隔壁合租的小姑娘听我说了这个,想让我帮她的也清一下,但是试了下,不知道为什么不能一次性把她的也给清完。后来就放弃了,具体原因也没深究。