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(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() |
#注意 需要命令行方式运行: python main.py |
高级设计师
by: Python自学 发表于:2022-11-10 04:35:49 顶(0) | 踩(0) 回复
注意 需要命令行方式运行: python main.py
否则无法读取密码,密码输入时不会显示,实际上有输入,输入完回车即可
回复评论