python实现QQ空间自动点赞功能


Posted in Python onApril 09, 2019

本文实例为大家分享了python实现QQ空间自动点赞的具体代码,供大家参考,具体内容如下

项目github地址

使用python实现qq空间自动点赞功能。

需自行安装库并配置环境。

我想实现的是每6个小时就自动更新一次cookie。这也是和网上其他版本相比具有的优点。不用手动输入cookie。更加自动。(不负责任的说,这个功能没有测试过。)

程序运行方法:将代码存为.py文件,运行即可。

输入QQ密码的时候采用了linux登录的方式——没有回显。

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:;" rel="external nofollow" rel="external nofollow" ', 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()

这个程序在本地跑没有问题,但是我希望它能在我的腾讯云服务器上一直运行。

我在辽宁,服务器在北京,导致登录qq空间时会有滑动验证码。

于是我按照网上的教程,结合qq空间滑动验证码的实际情况,实现了qq空间滑动验证码的破解。

值得一提的是,目前成功率是100%。

有的时候不能完全重合,但还是会成功。

具体思路我就不贴出来了,感兴趣的朋友可以私信我。

下面是整合了破解滑动验证码部分的代码。

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:;" rel="external nofollow" rel="external nofollow" ', 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()

上面两份代码整体思路没问题,但是偶尔会有一些小bug。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python实现PS图像调整颜色梯度效果示例
Jan 25 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
Python异常处理操作实例详解
May 10 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Python docutils文档编译过程方法解析
Jun 23 Python
详解python对象之间的交互
Sep 29 Python
python用分数表示矩阵的方法实例
Jan 11 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
Python实现的多进程拷贝文件并显示百分比功能示例
Apr 09 #Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 #Python
Python实现的读取文件内容并写入其他文件操作示例
Apr 09 #Python
Python实现根据日期获取当天凌晨时间戳的方法示例
Apr 09 #Python
Python匿名函数及应用示例
Apr 09 #Python
用Python中的turtle模块画图两只小羊方法
Apr 09 #Python
python3实现表白神器
Apr 09 #Python
You might like
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
PHP 常见郁闷问题答解
2006/11/25 PHP
ThinkPHP模板中数组循环实例
2014/10/30 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
jquery 模拟雅虎首页的点击对话框效果
2010/04/11 Javascript
10个基于Jquery的幻灯片插件教程
2010/10/29 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
js实现飞机大战小游戏
2020/08/26 Javascript
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
使用Python进行AES加密和解密的示例代码
2018/02/02 Python
Python中正则表达式的用法总结
2019/02/22 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
Python之Sklearn使用入门教程
2021/02/19 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
2013年保送生自荐信格式
2013/11/20 职场文书
应届毕业生求职信范文分享
2013/12/26 职场文书
服务员岗位职责
2014/01/29 职场文书
军训鉴定表自我鉴定
2014/02/13 职场文书
信息总监管理职责范本
2014/03/08 职场文书
钱学森观后感
2015/06/04 职场文书
队列队形口号
2015/12/25 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书