私信小编01即可获取大量Python学习资料
因为我周围的小伙伴们天天跟我说的最多的一句话就是:空间第一条点赞。
所以说我还不如直接做一个自动点赞的代码呢,免得天天催我点赞。
首先既然是对 QQ空间的一系列操作,自然是先解决登陆方面,在这篇文章里面我就不过多介绍了,因为我上几期之前对QQ空间已经做了一定的介绍了。直接放出链接就好。欢迎看博主以前的文章
def search_cookie():
qq_number = input(&39;请输入qq号:&39;)
if not __import__(&39;os&39;).path.exists(&39;cookie_dict.txt&39;):
get_cookie_json(qq_number)
with open(&39;cookie_dict.txt&39;, &39;r&39;) as f:
cookie=json.load(f)
return True
def get_cookie_json(qq_number):
password = __import__(&39;getpass&39;).getpass(&39;请输入密码:&39;)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
login_url = &39;http://i.qq.com/&39;
chrome_options =Options()
chrome_options.add_argument(&39;--headless&39;)
driver = webdriver.Chrome(options=chrome_options)
driver.get(login_url)
driver.switch_to_frame(&39;login_frame&39;)
driver.find_element_by_xpath(&39;//*[@id=&34;switcher_plogin&34;]&39;).click()
time.sleep(1)
driver.find_element_by_xpath(&39;//*[@id=&34;u&34;]&39;).send_keys(qq_number)
driver.find_element_by_xpath(&39;//*[@id=&34;p&34;]&39;).send_keys(password)
time.sleep(1)
driver.find_element_by_xpath(&39;//*[@id=&34;login_button&34;]&39;).click()
time.sleep(1)
cookie_list = driver.get_cookies()
cookie_dict = {}
for cookie in cookie_list:
if &39;name&39; in cookie and &39;value&39; in cookie:
cookie_dict[cookie[&39;name&39;]] = cookie[&39;value&39;]
with open(&39;cookie_dict.txt&39;, &39;w&39;) as f:
json.dump(cookie_dict, f)
return True
def get_g_tk():
p_skey = self.cookie[&39;p_skey&39;]
h = 5381
for i in p_skey:
h += (h << 5) + ord(i)
g_tk = h & 2147483647
当我们拿到cookie信息和g_tk这个参数之后,继续去寻找空间好友动态的XML在何处。
首先点到XML位置一个个查找,发现有一个feeds3_html_more很像,点进去发现的确是我们要找的url链接。
这个链接所需要的参数有很多,在这里列举出来
这些参数中类似于可变参数的一共有五个。
def get_space():
your_url = &39;http://user.qzone.qq.com/&39; + str(qq_number)
html = requests.get(your_url,headers=headers,cookies=cookie)
if html.status_code == 200:
qzonetoken = re.findall(&39;window.g_qzonetoken =(.*?);&39;,html.text,re.S)[1].split(&39;&34;&39;)[1]
return True
&39;rd&39;: &39;0.9311604844249088&39;,
&39;windowId&39;: &39;0.51158950324406&39;,
&39;usertime&39;: str(round(time.time() * 1000)),
def get_g_tk():
p_skey = self.cookie[&39;p_skey&39;]
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 = &34;{x:1, y:2, z:3}&34;
py_json1 = &34;{&39;x&39;:1, &39;y&39;:2, &39;z&39;:3}&34;
py_json2 = &39;{&34;x&34;:1, &34;y&34;:2, &34;z&34;:3}&39;
data = demjson.decode(js_json)
print(data)
{&39;y&39;: 2, &39;x&39;: 1, &39;z&39;: 3}
data = demjson.decode(py_json1)
print(data)
{&39;y&39;: 2, &39;x&39;: 1, &39;z&39;: 3}
data = demjson.decode(py_json2)
print(data)
{&39;y&39;: 2, &39;x&39;: 1, &39;z&39;: 3}
我们使用demjson直接将该字符串转换为耳熟能详的字典格式,提取其中的data的data,即为前八条动态的每个参数,但我们这里只要第一个说说的动态信息。
text = html.text[10:-2].replace(&34; &34;, &34;&34;).replace(&39;n&39;,&39;&39;)
json_list = demjson.decode(text)[&39;data&39;][&39;data&39;]
qq_spaces = json_list[0]
我们拿到其信息后,先提取一些我们比较想知道的东西,比如名字、QQ号、发布时间、所获赞数、说说内容、说说地址等等结果。
在 qq_spaces 参数中我们发现里面有一个很长也很特殊的一个结果是 html 结果,这个结果里面很长,简单来看是个网页常规代码,应该是被Javascript写入到网页中了,既然不是全部代码,那么只能用正则提取一下里面的具体我们需要的东西了。
content = str(qq_spaces[&39;html&39;])
try:zanshu = re.findall(&39;(.*?)人觉得很赞
在QQ空间随便找个好友点个赞吧,这样我们才能接收到请求。
我们首先清空原来动态产生的抓包,直接点个赞发现关于dolike的url只有三个,第一个是个POST请求,应该是我们所需要的点赞网址。
我们获取到URL后,找到里面所需要的参数。发现一共有十一个参数,在这里猜测应该不存在加密参数。
既然参数没什么问题那就直接写代码吧。
def get_zan(times,his_url):
data = {&39;g_tk&39;: g_tk,&39;qzonetoken&39;: qzonetoken}
post_data = {
&39;qzreferrer&39;: &39;http://user.qzone.qq.com/&39;+str(qq_number),
&39;opuin&39;: str(qq_number),
&39;unikey&39;: str(his_url),
&39;curkey&39;: str(his_url),
&39;from&39;: &39;1&39;,
&39;appid&39;: &39;311&39;,
&39;typeid&39;: &39;0&39;,
&39;abstime&39;: str(times),
&39;fid&39;: str(his_url).split(&39;/&39;)[-1],
&39;active&39;: &39;0&39;,
&39;fupdate&39;: &39;1&39;
}
url = &39;http://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?&39;
url = url + urllib.parse.urlencode(data)
html = requests.post(url,headers=headers,cookies=cookie,data=post_data)
if html.status_code == 200:print(&34;点赞成功&34; if len(html.text) == 469 else &34;点赞失败&34;)
因为树莓派并不是很不错的问题,这个代码做不到绝对的秒赞。
def run_tolike():
if os.path.exists(&39;time_out.txt&39;):
with open(&39;time_out.txt&39;,&39;r&39;) as f:
time_out = f.read()
else:time_out = None
while True:
get_friends_list()
time.sleep(__import__(&39;random&39;).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(&39;说说无更新,等待中...&39;)
with open(&39;time_out.txt&39;,&39;w&39;) as f:
f.write(str(times))
import time,os,json
import re
import demjson
import urllib
import requests
from lxml import etree
def log(content):
this_time = time.strftime(&39;%H:%M:%S&39;,time.localtime(time.time()))
print(&34;[&34;+str(this_time)+&34;]&34; + content)
class QQ_like:
def __init__(self,qq_number):
self.headers = {&39;User-Agent&39;:&39;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36&39;}
self.qq_number = qq_number
self.get_preparameter()
self.run_tolike()
def get_preparameter(self):
self.search_cookie()
self.get_g_tk()
self.get_space()
def run_tolike(self):
if os.path.exists(&39;time_out.txt&39;):
with open(&39;time_out.txt&39;,&39;r&39;) as f:
self.time_out = f.read()
else:self.time_out = None
while True:
self.get_friends_list()
time.sleep(__import__(&39;random&39;).randint(0,5))
def search_cookie(self):
if not os.path.exists(&39;cookie_dict.txt&39;):
self.get_cookie_json()
with open(&39;cookie_dict.txt&39;, &39;r&39;) as f:
self.cookie=json.load(f)
return True
def get_cookie_json(self):
password = __import__(&39;getpass&39;).getpass(&39;请输入密码:&39;)
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
login_url = &39;http://i.qq.com/&39;
chrome_options =Options()
chrome_options.add_argument(&39;--headless&39;)
driver = webdriver.Chrome(options=chrome_options)
driver.get(login_url)
driver.switch_to_frame(&39;login_frame&39;)
driver.find_element_by_xpath(&39;//*[@id=&34;switcher_plogin&34;]&39;).click()
time.sleep(1)
driver.find_element_by_xpath(&39;//*[@id=&34;u&34;]&39;).send_keys(self.qq_number)
driver.find_element_by_xpath(&39;//*[@id=&34;p&34;]&39;).send_keys(password)
time.sleep(1)
driver.find_element_by_xpath(&39;//*[@id=&34;login_button&34;]&39;).click()
time.sleep(1)
cookie_list = driver.get_cookies()
cookie_dict = {}
for cookie in cookie_list:
if &39;name&39; in cookie and &39;value&39; in cookie:
cookie_dict[cookie[&39;name&39;]] = cookie[&39;value&39;]
with open(&39;cookie_dict.txt&39;, &39;w&39;) as f:
json.dump(cookie_dict, f)
return True
def get_g_tk(self):
p_skey = self.cookie[&39;p_skey&39;]
h = 5381
for i in p_skey:
h += (h << 5) + ord(i)
self.g_tk = h & 2147483647
def get_space(self):
your_url = &39;http://user.qzone.qq.com/&39; + str(self.qq_number)
html = requests.get(your_url,headers=self.headers,cookies=self.cookie)
if html.status_code == 200:
self.qzonetoken = re.findall(&39;window.g_qzonetoken =(.*?);&39;,html.text,re.S)[1].split(&39;&34;&39;)[1]
return True
def get_friends_list(self):
times = &34;&34;
url = &34;http://user.qzone.qq.com/proxy/domain/ic2.qzone.qq.com/cgi-bin/feeds/feeds3_html_more?&34;
data = {
&39;uin&39;: self.qq_number,
&39;scope&39;: &39;0&39;,
&39;view&39;: &39;1&39;,
&39;daylist&39;: &39;&39;,
&39;uinlist&39;: &39;&39;,
&39;gid&39;: &39;&39;,
&39;flag&39;: &39;1&39;,
&39;filter&39;:&39;all&39;,
&39;applist&39;: &39;all&39;,
&39;refresh&39;: &39;0&39;,
&39;aisortEndTime&39;: &39;0&39;,
&39;aisortOffset&39;: &39;0&39;,
&39;getAisort&39;: &39;0&39;,
&39;aisortBeginTime&39;: &39;0&39;,
&39;pagenum&39;: &39;1&39;,
&39;externparam&39;: &39;undefined&39;,
&39;firstGetGroup&39;: &39;0&39;,
&39;icServerTime&39;: &39;0&39;,
&39;mixnocache&39;: &39;0&39;,
&39;scene&39;: &39;0&39;,
&39;begintime&39;: &39;undefined&39;,
&39;count&39;: &39;10&39;,
&39;dayspac&39;: &39;undefined&39;,
&39;sidomain&39;: &39;qzonestyle.gtimg.cn&39;,
&39;useutf8&39;: &39;1&39;,
&39;outputhtmlfeed&39;: &39;1&39;,
&39;rd&39;: &39;0.9311604844249088&39;,
&39;usertime&39;: str(round(time.time() * 1000)),
&39;windowId&39;: &39;0.51158950324406&39;,
&39;g_tk&39;: self.g_tk,
&39;qzonetoken&39;: self.qzonetoken,
}
url = url + urllib.parse.urlencode(data) + &39;&g_tk=&39; + str(self.g_tk)
html = requests.get(url,headers=self.headers,cookies=self.cookie)
if html.status_code == 200:
text = html.text[10:-2].replace(&34; &34;, &34;&34;).replace(&39;n&39;,&39;&39;)
json_list = demjson.decode(text)[&39;data&39;][&39;data&39;]
qq_spaces = json_list[0]
content = str(qq_spaces[&39;html&39;])
try:zanshu = re.findall(&39;(.*?)人觉得很赞