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()
|