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返回昨天日期的方法
May 13 Python
python实现自动登录人人网并采集信息的方法
Jun 28 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
使用Python写一个小游戏
Apr 02 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
Django操作session 的方法
Mar 09 Python
python3.x中安装web.py步骤方法
Jun 23 Python
Python如何读写字节数据
Aug 05 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
python字符串拼接+和join的区别详解
Dec 03 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
Python 线程池模块之多线程操作代码
May 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
php,ajax实现分页
2008/03/27 PHP
ajax php传递和接收变量实现思路及代码
2012/12/19 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
JS在IE和FF下attachEvent,addEventListener学习笔记
2009/11/26 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
javascript学习笔记(九)javascript中的原型(prototype)及原型链的继承方式
2011/04/12 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
python之yield表达式学习
2014/09/02 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
浅谈python 导入模块和解决文件句柄找不到问题
2018/12/15 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
100行Python代码实现每天不同时间段定时给女友发消息
2019/09/27 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
利用python批量爬取百度任意类别的图片的实现方法
2020/10/07 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
商业企业管理专业求职信
2014/07/10 职场文书
单位委托书怎么写
2014/09/21 职场文书
警察群众路线整改措施
2014/09/26 职场文书
钢琴师观后感
2015/06/12 职场文书
英语导游欢迎词
2015/09/30 职场文书
Python基本数据类型之字符串str
2021/07/21 Python
Redis 常见使用场景
2021/08/30 Redis
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
Python OpenGL基本配置方式
2022/05/20 Python