如今社交软件活跃用户众多,QQ空间就是大家分享生活的热门平台,自动点赞功能虽有争议却也令人好奇其实现方式,这便体现出Python实现QQ空间自动点赞功能的价值。
环境配置
要实现QQ空间自动点赞功能,使用Python需要自行安装库并配置环境。这是第一步,但这个过程可能并不容易。不同的操作系统和开发环境可能会有不同的结果。比如在Windows操作系统下,库的安装可能会有版本兼容的问题。而在Linux系统中,则要注意权限方面的配置。库安装齐全与环境配置正确是整个程序能够正常运行的基础保障,如果这一步出现问题,后面的功能就无从实现。很多新手在遇到环境问题时总是不知所措,网上虽有教程,可复杂多样难以抉择。
库与环境的这些问题,需要有足够的耐心和细心去对待。我们不能急于求成,而要仔细排查每一个环节可能出现的错误,只有这样才能顺利构建能够支持自动点赞功能的运行环境。
自动更新Cookie
这个自动点赞程序具有每6个小时自动更新一次Cookie的优势。与网上其他版本相比,这一点更加自动化。一般而言,Cookie是用于识别用户身份的重要标识。在以往的程序中,大多需要手动输入Cookie,这是非常麻烦的操作。例如,如果在工作或学习忙碌的时候,可能会忘记更新Cookie,进而影响程序运行。自动更新Cookie功能很好解决了这个问题。不过,要提醒的是,这个功能开发者也没有进行测试,可能存在一些潜在的风险。它虽然是个很有创意的想法,不过需要在使用中多加关注和验证。
不能因为它的便利性就完全信赖它,在使用过程中,如果发现账号登录异常或者点赞功能无法正常实现时,就要怀疑是否与自动更新Cookie有关,要及时进行检查和调整。
程序运行方法
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import requests
import demjson
import re
import datetime
import getpass
qq = ''
pwd = ''
def print_time():
print(datetime.datetime.now(), end=' ')
def get_gtk(p_skey):
hash=5381
for i in p_skey:
hash += (hash << 5)+ord(i)
print_time()
print('生成gtk')
return hash & 0x7fffffff
def change_cookie(cookie):
s = ''
for c in cookie:
s = s + c['name'] + '=' + c['value'] + '; '
return s
def check_time():
now = datetime.datetime.now()
hour = str(now)[11:13]
minute = str(now)[14:16]
second = str(now)[17:19]
if 0 == int(hour) % 6 and minute == '00' and int(second) < 30:
return True
else:
return False
def get_cookie():
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://qzone.qq.com/')
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').clear()
driver.find_element_by_id('u').send_keys(qq)
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys(pwd)
driver.find_element_by_id('login_button').click()
time.sleep(1)
driver.find_element_by_id('QZ_Body').click()
cookie = driver.get_cookies()
# print(cookie)
driver.close()
driver.quit()
print_time()
print('提取cookie')
return cookie
def get_args():
cookie = get_cookie()
for c in cookie:
if c['name'] == 'p_skey':
p_skey = c['value']
break
cookie = change_cookie(cookie)
# print(p_skey)
gtk = get_gtk(p_skey)
return cookie, gtk
def do_like(d, gtk, headers):
url = 'https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk=' + str(gtk)
body = {
'qzreferrer': 'http://user.qzone.qq.com/' + qq,
'opuin': qq,
'from': 1,
'active': 0,
'fupdate': 1
}
try:
html = d['html']
# print(html)
# unikey = re.search(r'data-unikey=\"http:[^"]*\"', html).group(0)
# curkey = re.search(r'data-curkey=\"http:[^"]*\"', html).group(0)
# print(unikey, curkey)
temp = re.search('data-unikey="(http[^"]*)"[^d]*data-curkey="([^"]*)"[^d]*data-clicklog=("like")[^h]*href="javascript:;"', html);
if temp is None:
return
unikey = temp.group(1);
curkey = temp.group(2);
# print(unikey, curkey)
body['unikey'] = unikey
body['curkey'] = curkey
body['appid'] = d['appid']
body['typeid'] = d['typeid']
body['fid'] = d['key']
r = requests.post(url, data=body, headers=headers)
if 200 == r.status_code:
print_time()
print('给 ' + d['nickname'] + ' 点赞')
except:
return
def get_content(headers, gtk):
try:
r = requests.get('http://ic2.s8.qzone.qq.com/cgi-bin/feeds/feeds3_html_more?uin=0924761163&scope=0&view=1&daylist=&uinlist=&gid=&flag=1&filter=all&applist=all&refresh=0&aisortEndTime=0&aisortOffset=0&getAisort=0&aisortBeginTime=0&pagenum=1&externparam=offset%3D6%26total%3D97%26basetime%3D1470323193%26feedsource%3D0&firstGetGroup=0&icServerTime=0&mixnocache=0&scene=0&begintime=0&count=10&dayspac=0&sidomain=cnc.qzonestyle.gtimg.cn&useutf8=1&outputhtmlfeed=1&getob=1&g_tk=' + str(gtk), headers=headers)
r = r.text[10:-2]
r = demjson.decode(r)
data = r['data']['data']
print_time()
print('获取了 ' + str(len(data)) + ' 条说说')
return data
except:
return []
def main():
print_time()
print('程序运行...')
global qq
global pwd
qq = input('QQ:')
pwd = getpass.getpass('Password:')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
cookie, gtk = get_args()
headers['Cookie'] = cookie
while True:
time.sleep(1)
if check_time():
cookie, gtk = get_args()
headers['Cookie'] = cookie
print_time()
print('更新了 cookie 和 gtk')
data = get_content(headers, gtk)
for d in data:
do_like(d, gtk, headers)
if __name__ == '__main__':
main()
程序的运行方法相对比较简单,将代码存为.py文件然后直接运行即可。这是Python程序运行常见的操作。但在一些特殊情况下,也会出现一些小问题。例如电脑环境如果中病毒或者被安装了一些不知名的安全软件时,它们防止未知程序运行,这时候运行.py文件可能就会受阻。而且假设在一个多人共用的电脑环境里,还可能会存在权限不足无法运行的问题。所以这看似简单的操作,也有很多实际情况需要考虑。
如果是自己的私人电脑还好,可以自由进行环境调整。但要是公共场合或者公司的电脑,那就要遵守相关规定,进行额外的申请或者调整才能够确保程序顺利运行。
密码输入安全
在输入QQ密码时采用Linux登录的方式,这种方式没有回显。这样做很大程度上提高了密码输入的安全性。比如在一些公共场合,如果我们需要登录QQ空间进行相关操作,周围人多眼杂。有了这种没有回显的输入方式,旁人无法看到密码内容,避免了密码泄露的风险。这种输入方式其实是从计算机安全登录的设计理念中借鉴来的。
但是这种方式对于一些不熟悉Linux的用户来说可能会比较陌生,使用过程中可能会引起一些误操作或者恐慌。毕竟大家习惯了普通的有回显密码输入方式,突然转变需要一段时间去适应这种安全性更高的输入方式。
腾讯云服务器运行
开发者希望程序能在腾讯云服务器(在北京)上一直运行,而自己在辽宁。这个过程中会遇到QQ空间登录时的滑动验证码问题。因为地域的不同可能导致网络环境的差异,触发了QQ空间的安全验证机制。滑动验证码的出现是为了保障账号安全,防止被恶意攻击或者机器人操作。对于用户来说,如果不能有效解决这个问题,就无法在腾讯云服务器上顺利运行自动点赞程序。有不少人在异地登录QQ相关服务时都会遇到类似的验证码问题,这影响了很多操作的便利性。
面对这个问题,开发者按照网上的教程并结合实际情况对滑动验证码进行了破解并且目前成功率达100% ,这是个很了不起的成果。
代码的偶发Bug
整合了破解滑动验证码部分的代码,虽然整体思路没有问题,但偶尔会有小bug出现。代码中的小bug是非常难以预料和避免的。在大型软件或者复杂的程序中,小bug可能会导致部分功能异常。就比如这个自动点赞程序,可能因为某个小bug,导致在某个时间段或者某个特殊情况下,点赞功能突然失效或者程序崩溃。要找出这些小bug并解决是一个繁琐费时的过程。可能需要对程序的每一个模块,每一行代码进行仔细的排查和调试。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from PIL import Image
from io import BytesIO
import time
import requests
import demjson
import re
import datetime
import getpass
qq = ''
pwd = ''
def print_time():
print(datetime.datetime.now(), end=' ')
def get_gtk(p_skey):
hash=5381
for i in p_skey:
hash += (hash << 5)+ord(i)
print_time()
print('生成gtk')
return hash & 0x7fffffff
def change_cookie(cookie):
s = ''
for c in cookie:
s = s + c['name'] + '=' + c['value'] + '; '
return s
def check_time():
now = datetime.datetime.now()
hour = str(now)[11:13]
minute = str(now)[14:16]
second = str(now)[17:19]
if 0 == int(hour) % 6 and minute == '00' and int(second) < 30:
return True
else:
return False
def get_image_difference(back_img, full_img):
width, height = full_img.size
for w in range(0, width):
for h in range(0, height):
back_pixel = back_img.getpixel((w, h))
full_pixel = full_img.getpixel((w, h))
if back_pixel != full_pixel and w > 340 and h > 10 and abs(back_pixel[0]-full_pixel[0])>50 and abs(back_pixel[1]-full_pixel[1])>50 and abs(back_pixel[2]-full_pixel[2])>50:
return True, w
return False, -1
def get_cookie():
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://qzone.qq.com/')
driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_id('u').clear()
driver.find_element_by_id('u').send_keys(qq)
driver.find_element_by_id('p').clear()
driver.find_element_by_id('p').send_keys(pwd)
driver.find_element_by_id('login_button').click()
time.sleep(3)
frame = driver.find_element_by_xpath('//*[@id="newVcodeIframe"]/iframe')
driver.switch_to.frame(frame)
#
back_url = driver.find_element_by_id('slideBkg').get_attribute('src')
full_url = back_url.replace('hycdn_1', 'hycdn_0')
r = requests.get(back_url)
file = BytesIO(r.content)
back_img = Image.open(file)
r.status_code = 500
while 200 != r.status_code:
r = requests.get(full_url)
file = BytesIO(r.content)
full_img = Image.open(file)
r, w = get_image_difference(back_img, full_img)
if r is False:
return
# print(w)
# 280 * 158
# 680 * 390
# 55 * 55
# 136 * 136
# 214
slide = driver.find_element_by_id('tcaptcha_drag_thumb')
ActionChains(driver).click_and_hold(slide).perform()
ActionChains(driver).move_by_offset(xoffset=w / 680 * 250, yoffset=0).perform()
ActionChains(driver).release(slide).perform()
# print(back_img.size)
# print(cut_img.size)
# print(full_img.size)
time.sleep(2)
driver.find_element_by_id('QZ_Body').click()
cookie = driver.get_cookies()
# print(cookie)
driver.close()
driver.quit()
print_time()
print('提取cookie')
return cookie
def get_args():
cookie = get_cookie()
for c in cookie:
if c['name'] == 'p_skey':
p_skey = c['value']
break
cookie = change_cookie(cookie)
# print(p_skey)
gtk = get_gtk(p_skey)
return cookie, gtk
def do_like(d, gtk, headers):
url = 'https://user.qzone.qq.com/proxy/domain/w.qzone.qq.com/cgi-bin/likes/internal_dolike_app?g_tk=' + str(gtk)
body = {
'qzreferrer': 'http://user.qzone.qq.com/' + qq,
'opuin': qq,
'from': 1,
'active': 0,
'fupdate': 1
}
try:
html = d['html']
# print(html)
# unikey = re.search(r'data-unikey=\"http:[^"]*\"', html).group(0)
# curkey = re.search(r'data-curkey=\"http:[^"]*\"', html).group(0)
# print(unikey, curkey)
temp = re.search('data-unikey="(http[^"]*)"[^d]*data-curkey="([^"]*)"[^d]*data-clicklog=("like")[^h]*href="javascript:;"', html);
if temp is None:
return
unikey = temp.group(1);
curkey = temp.group(2);
# print(unikey, curkey)
body['unikey'] = unikey
body['curkey'] = curkey
body['appid'] = d['appid']
body['typeid'] = d['typeid']
body['fid'] = d['key']
r = requests.post(url, data=body, headers=headers)
if 200 == r.status_code:
print_time()
print('给 ' + d['nickname'] + ' 点赞')
except:
return
def get_content(headers, gtk):
try:
r = requests.get('http://ic2.s8.qzone.qq.com/cgi-bin/feeds/feeds3_html_more?uin=0924761163&scope=0&view=1&daylist=&uinlist=&gid=&flag=1&filter=all&applist=all&refresh=0&aisortEndTime=0&aisortOffset=0&getAisort=0&aisortBeginTime=0&pagenum=1&externparam=offset%3D6%26total%3D97%26basetime%3D1470323193%26feedsource%3D0&firstGetGroup=0&icServerTime=0&mixnocache=0&scene=0&begintime=0&count=10&dayspac=0&sidomain=cnc.qzonestyle.gtimg.cn&useutf8=1&outputhtmlfeed=1&getob=1&g_tk=' + str(gtk), headers=headers)
r = r.text[10:-2]
r = demjson.decode(r)
data = r['data']['data']
print_time()
print('获取了 ' + str(len(data)) + ' 条说说')
return data
except:
return []
def main():
print_time()
print('程序运行...')
global qq
global pwd
qq = input('QQ:')
pwd = getpass.getpass('Password:')
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
cookie, gtk = get_args()
headers['Cookie'] = cookie
while True:
time.sleep(1)
if check_time():
cookie, gtk = get_args()
headers['Cookie'] = cookie
print_time()
print('更新了 cookie 和 gtk')
data = get_content(headers, gtk)
for d in data:
do_like(d, gtk, headers)
if __name__ == '__main__':
main()
以上就是这个利用Python实现QQ空间自动点赞功能相关的情况,不知道你有没有类似的开发经历或者遇到类似的问题?如果有的话欢迎在评论区分享,也请点赞和分享这篇文章。