This commit is contained in:
criseLYJ
2019-03-08 23:26:36 +08:00
parent eb4fdc2b26
commit 837256702f
23 changed files with 268 additions and 195 deletions
+5
View File
@@ -103,4 +103,9 @@ venv.bak/
# mypy # mypy
.mypy_cache/ .mypy_cache/
# Mac os
.DS_Store .DS_Store
# pycharm
.idea
.env
+1 -1
View File
@@ -29,4 +29,4 @@ def login():
if __name__ == '__main__': if __name__ == '__main__':
login() login()
+6 -5
View File
@@ -15,11 +15,11 @@ class Login(object):
def __init__(self): def __init__(self):
base_url = 'https://github.com/' base_url = 'https://github.com/'
# 登陆 url # 登陆 url
self.login_url = base_url +'login' self.login_url = base_url + 'login'
# 提交表单的 api # 提交表单的 api
self.post_url = base_url +'session' self.post_url = base_url + 'session'
# 个人资料页面的 url # 个人资料页面的 url
self.logined_url = base_url +'settings/profile' self.logined_url = base_url + 'settings/profile'
# 构造一个会话对象 # 构造一个会话对象
self.session = requests.Session() self.session = requests.Session()
# 自定义请求头 # 自定义请求头
@@ -36,7 +36,7 @@ class Login(object):
doc = pq(response.text) doc = pq(response.text)
token = doc('input[name="authenticity_token"]').attr("value").strip() token = doc('input[name="authenticity_token"]').attr("value").strip()
return token return token
def login(self, email, password): def login(self, email, password):
token = self.token() token = self.token()
# 构造表单数据 # 构造表单数据
@@ -71,7 +71,7 @@ class Login(object):
Repositories = doc("div.Box-body > ul > li").text().split() Repositories = doc("div.Box-body > ul > li").text().split()
for Repositorie in Repositories: for Repositorie in Repositories:
print(Repositorie) print(Repositorie)
def profile(self, html): def profile(self, html):
doc = pq(html) doc = pq(html)
page_title = doc("title").text() page_title = doc("title").text()
@@ -89,6 +89,7 @@ class Login(object):
password = getpass.getpass("password:") password = getpass.getpass("password:")
self.login(email=email, password=password) self.login(email=email, password=password)
if __name__ == "__main__": if __name__ == "__main__":
login = Login() login = Login()
login.main() login.main()
+70
View File
@@ -0,0 +1,70 @@
# -*- coding: utf-8 -*-
"""
github第二种登录方式
info:
author:CriseLYJ
github:https://github.com/CriseLYJ/
update_time:2019-3-7
"""
import requests
from lxml import etree
class Login(object):
def __init__(self, email, password):
self.headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Referer': 'https://github.com/',
'Host': 'github.com'
}
self.login_url = 'https://github.com/login'
self.post_url = 'https://github.com/session'
self.session = requests.Session()
self.email = email
self.password = password
# 模拟登录
def login_GitHub(self):
post_data = {
'commit': 'Sign in',
'utf8': '',
'authenticity_token': self.get_token(),
'login': self.email,
'password': self.password
}
response = self.session.post(self.post_url, data=post_data, headers=self.headers)
print(response.status_code)
print(post_data)
if response.status_code == 200:
print("登录成功!")
else:
print("登录失败!")
# 获取token信息
def get_token(self):
response = self.session.get(self.login_url, headers=self.headers)
html = etree.HTML(response.content.decode())
token = html.xpath('//input[@name="authenticity_token"]/@value')[0]
return token
if __name__ == '__main__':
email = input('请输入您的账号: ')
password = input('请输入您的密码: ')
login = Login(email, password)
login.login_GitHub()
+28 -30
View File
@@ -3,17 +3,17 @@
# @Date: 2018-12-8 17:13:11 # @Date: 2018-12-8 17:13:11
import requests import requests
import math,random import math, random
from Crypto.Cipher import AES from Crypto.Cipher import AES
import base64 import base64
import codecs import codecs
import os import os
class decrypt_music(object): class decrypt_music(object):
def __init__(self,d): def __init__(self, d):
self.d = d self.d = d
self.e = '010001' self.e = '010001'
self.f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5a" \ self.f = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5a" \
"a76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46be" \ "a76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46be" \
@@ -21,22 +21,21 @@ class decrypt_music(object):
self.g = '0CoJUm6Qyw8W8jud' self.g = '0CoJUm6Qyw8W8jud'
self.random_text = self.get_random_str() self.random_text = self.get_random_str()
def get_random_str(self): def get_random_str(self):
str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
res = '' res = ''
for x in range(16): for x in range(16):
index = math.floor(random.random() * len(str)) index = math.floor(random.random() * len(str))
res += str[index] res += str[index]
return res return res
def aes_encrypt(self,text,key): def aes_encrypt(self, text, key):
iv = '0102030405060708' iv = '0102030405060708'
pad = 16 - len(text.encode()) % 16 pad = 16 - len(text.encode()) % 16
text = text + pad * chr(pad) text = text + pad * chr(pad)
encryptor = AES.new(key, AES.MODE_CBC, iv) encryptor = AES.new(key, AES.MODE_CBC, iv)
msg = base64.b64encode(encryptor.encrypt(text)) msg = base64.b64encode(encryptor.encrypt(text))
return msg return msg
def rsa_encrypt(self, value, text, modulus): def rsa_encrypt(self, value, text, modulus):
'''进行rsa加密''' '''进行rsa加密'''
@@ -44,34 +43,33 @@ class decrypt_music(object):
rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(value, 16) % int(modulus, 16) rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(value, 16) % int(modulus, 16)
return format(rs, 'x').zfill(256) return format(rs, 'x').zfill(256)
def get_data(self): def get_data(self):
params = self.aes_encrypt(self.d,self.g) params = self.aes_encrypt(self.d, self.g)
params = self.aes_encrypt(params.decode('utf-8'),self.random_text) params = self.aes_encrypt(params.decode('utf-8'), self.random_text)
enc_sec_key = self.rsa_encrypt(self.e,self.random_text,self.f) enc_sec_key = self.rsa_encrypt(self.e, self.random_text, self.f)
return { return {
'params':params, 'params': params,
'encSecKey':enc_sec_key 'encSecKey': enc_sec_key
} }
class Spider(object): class Spider(object):
def __init__(self): def __init__(self):
self.headers = { self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0', 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0',
'Cookie':'_iuqxldmzr_=32; _ntes_nnid=8d4ef0883a3bcc9d3a2889b0bf36766a,1533782432391; _ntes_nuid=8d4ef0883a3bcc9d3a2889b0bf36766a; __utmc=94650624; WM_TID=GzmBlbRkRGQXeQiYuDVCfoEatU6VSsKC; playerid=19729878; __utma=94650624.1180067615.1533782433.1533816989.1533822858.9; __utmz=94650624.1533822858.9.7.utmcsr=cn.bing.com|utmccn=(referral)|utmcmd=referral|utmcct=/; WM_NI=S5gViyNVs14K%2BZoVerGK69gLlmtnH5NqzyHcCUY%2BiWm2ZaHATeI1gfsEnK%2BQ1jyP%2FROzbzDV0AyJHR4YQfBetXSRipyrYCFn%2BNdA%2FA8Mv80riS3cuMVJi%2BAFgCpXTiHBNHE%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee84b674afedfbd3cd7d98b8e1d0f554f888a4abc76990b184badc4f89e7af8ece2af0fea7c3b92a91eba9b7ec738e8abdd2b741e986a1b7e87a8595fadae648b0b3bc8fcb3f8eafb69acb69818b97ccec5dafee9682cb4b98bb87d2e66eb19ba2acaa5bf3b6b7b1ae5a8da6ae9bc75ef49fb7abcb5af8879f87c16fb8889db3ec7cbbae97a4c566e992aca2ae4bfc93bad9b37aab8dfd84f8479696a7ccc44ea59dc0b9d7638c9e82a9c837e2a3; JSESSIONID-WYYY=sHwCKYJYxz6ODfURChA471BMF%5CSVf3%5CTc8Qcy9h9Whj6CfMxw4YWTMV7CIx5g6rqW8OBv04YGHwwq%2B%5CD1N61qknTP%2Fym%2BHJZ1ylSH1EabbQASc9ywIT8YvOr%2FpMgvmm1cbr2%2Bd6ssMYXuTlpOIrKqp%5C%2FM611EhmfAfU47%5CSQWAs%2BYzgY%3A1533828139236' 'Cookie': '_iuqxldmzr_=32; _ntes_nnid=8d4ef0883a3bcc9d3a2889b0bf36766a,1533782432391; _ntes_nuid=8d4ef0883a3bcc9d3a2889b0bf36766a; __utmc=94650624; WM_TID=GzmBlbRkRGQXeQiYuDVCfoEatU6VSsKC; playerid=19729878; __utma=94650624.1180067615.1533782433.1533816989.1533822858.9; __utmz=94650624.1533822858.9.7.utmcsr=cn.bing.com|utmccn=(referral)|utmcmd=referral|utmcct=/; WM_NI=S5gViyNVs14K%2BZoVerGK69gLlmtnH5NqzyHcCUY%2BiWm2ZaHATeI1gfsEnK%2BQ1jyP%2FROzbzDV0AyJHR4YQfBetXSRipyrYCFn%2BNdA%2FA8Mv80riS3cuMVJi%2BAFgCpXTiHBNHE%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6ee84b674afedfbd3cd7d98b8e1d0f554f888a4abc76990b184badc4f89e7af8ece2af0fea7c3b92a91eba9b7ec738e8abdd2b741e986a1b7e87a8595fadae648b0b3bc8fcb3f8eafb69acb69818b97ccec5dafee9682cb4b98bb87d2e66eb19ba2acaa5bf3b6b7b1ae5a8da6ae9bc75ef49fb7abcb5af8879f87c16fb8889db3ec7cbbae97a4c566e992aca2ae4bfc93bad9b37aab8dfd84f8479696a7ccc44ea59dc0b9d7638c9e82a9c837e2a3; JSESSIONID-WYYY=sHwCKYJYxz6ODfURChA471BMF%5CSVf3%5CTc8Qcy9h9Whj6CfMxw4YWTMV7CIx5g6rqW8OBv04YGHwwq%2B%5CD1N61qknTP%2Fym%2BHJZ1ylSH1EabbQASc9ywIT8YvOr%2FpMgvmm1cbr2%2Bd6ssMYXuTlpOIrKqp%5C%2FM611EhmfAfU47%5CSQWAs%2BYzgY%3A1533828139236'
} }
def __get_songs(self, name):
def __get_songs(self,name):
d = '{"hlpretag":"<span class=\\"s-fc7\\">","hlposttag":"</span>","s":"%s","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}' % name d = '{"hlpretag":"<span class=\\"s-fc7\\">","hlposttag":"</span>","s":"%s","type":"1","offset":"0","total":"true","limit":"30","csrf_token":""}' % name
wyy = decrypt_music(d) wyy = decrypt_music(d)
data = wyy.get_data() data = wyy.get_data()
url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token=' url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token='
response = requests.post(url,data= data,headers =self.headers).json() response = requests.post(url, data=data, headers=self.headers).json()
return response['result'] return response['result']
def __get_mp3(self,id): def __get_mp3(self, id):
d = '{"ids":"[%s]","br":320000,"csrf_token":""}' % id d = '{"ids":"[%s]","br":320000,"csrf_token":""}' % id
wyy = decrypt_music(d) wyy = decrypt_music(d)
data = wyy.get_data() data = wyy.get_data()
@@ -80,15 +78,14 @@ class Spider(object):
print(response) print(response)
return response['data'][0]['url'] return response['data'][0]['url']
def __download_mp3(self,url,filename): def __download_mp3(self, url, filename):
abspath = os.path.abspath('.') # 获取绝对路径 abspath = os.path.abspath('.') # 获取绝对路径
os.chdir(abspath) os.chdir(abspath)
response = requests.get(url, headers=self.headers).content response = requests.get(url, headers=self.headers).content
path = os.path.join(abspath, filename) path = os.path.join(abspath, filename)
with open(filename + '.mp3', 'wb') as f: with open(filename + '.mp3', 'wb') as f:
f.write(response) f.write(response)
print('下载完毕,可以在%s 路径下查看' % path + '.mp3') print('下载完毕,可以在%s 路径下查看' % path + '.mp3')
def __print_info(self, songs): def __print_info(self, songs):
"""打印歌曲需要下载的歌曲信息""" """打印歌曲需要下载的歌曲信息"""
@@ -98,7 +95,6 @@ class Spider(object):
songs_list.append((song['name'], song['id'])) songs_list.append((song['name'], song['id']))
return songs_list return songs_list
def run(self): def run(self):
while True: while True:
name = input('请输入你需要下载的歌曲:') name = input('请输入你需要下载的歌曲:')
@@ -119,9 +115,11 @@ class Spider(object):
break break
print('程序结束!') print('程序结束!')
def main(): def main():
spider = Spider() spider = Spider()
spider.run() spider.run()
if __name__ == '__main__': if __name__ == '__main__':
main() main()
+6 -5
View File
@@ -6,7 +6,6 @@ import execjs
import rsa import rsa
import base64 import base64
js_path = 'login.js' js_path = 'login.js'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 ' headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', '(KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
@@ -37,7 +36,7 @@ def get_callback():
def _get_curtime(): def _get_curtime():
return int(time.time()*1000) return int(time.time() * 1000)
# 抓包也不是百分百可靠啊,这里?getapi一定要挨着https://passport.baidu.com/v2/api/写,才会到正确的路由 # 抓包也不是百分百可靠啊,这里?getapi一定要挨着https://passport.baidu.com/v2/api/写,才会到正确的路由
@@ -53,11 +52,12 @@ def get_token(gid, callback):
'logintype': 'basicLogin', 'logintype': 'basicLogin',
'callback': callback 'callback': callback
} }
headers.update(dict(Referer='http://pan.baidu.com/', Accept='*/*', Connection='keep-alive', Host='passport.baidu.com')) headers.update(
dict(Referer='http://pan.baidu.com/', Accept='*/*', Connection='keep-alive', Host='passport.baidu.com'))
resp = session.get(url='https://passport.baidu.com/v2/api/?getapi', params=get_data, headers=headers) resp = session.get(url='https://passport.baidu.com/v2/api/?getapi', params=get_data, headers=headers)
if resp.status_code == 200 and callback in resp.text: if resp.status_code == 200 and callback in resp.text:
# 如果json字符串中带有单引号,会解析出错,只有统一成双引号才可以正确的解析 # 如果json字符串中带有单引号,会解析出错,只有统一成双引号才可以正确的解析
#data = eval(re.search(r'.*?\((.*)\)', resp.text).group(1)) # data = eval(re.search(r'.*?\((.*)\)', resp.text).group(1))
data = json.loads(re.search(r'.*?\((.*)\)', resp.text).group(1).replace("'", '"')) data = json.loads(re.search(r'.*?\((.*)\)', resp.text).group(1).replace("'", '"'))
return data.get('data').get('token') return data.get('data').get('token')
else: else:
@@ -141,7 +141,7 @@ def login(token, gid, callback, rsakey, username, password):
's_K__oJTLlOSF9oXyne-LDQIAHcvLmJSM2JnXkMKDzpHOns2dwvap9obnlOeQ_43pCAIAINzY4uIKCgpdwK7Lv9uyw' 's_K__oJTLlOSF9oXyne-LDQIAHcvLmJSM2JnXkMKDzpHOns2dwvap9obnlOeQ_43pCAIAINzY4uIKCgpdwK7Lv9uyw'
'ar1heSX5LvXuN-22IfhjvyRDQIAHcvLkGx0IGEvaDp7Nmk2ZjVlOg5RDn4fbB9oB3URDQIAHcvLrOnxpeSq7b_-s' 'ar1heSX5LvXuN-22IfhjvyRDQIAHcvLkGx0IGEvaDp7Nmk2ZjVlOg5RDn4fbB9oB3URDQIAHcvLrOnxpeSq7b_-s'
'-yz47Dgv4vUi_ua6ZrtgvCUDQIAHcvLS7au-rv1suCh7LPsvO-_4NSL1KTFtsWy3a_L', '-yz47Dgv4vUi_ua6ZrtgvCUDQIAHcvLS7au-rv1suCh7LPsvO-_4NSL1KTFtsWy3a_L',
'callback': 'parent.'+callback 'callback': 'parent.' + callback
} }
resp = session.post(url='https://passport.baidu.com/v2/api/?login', data=post_data, headers=headers) resp = session.post(url='https://passport.baidu.com/v2/api/?login', data=post_data, headers=headers)
if 'err_no=0' in resp.text: if 'err_no=0' in resp.text:
@@ -149,6 +149,7 @@ def login(token, gid, callback, rsakey, username, password):
else: else:
print('登录失败') print('登录失败')
if __name__ == '__main__': if __name__ == '__main__':
name = input('请输入用户名:\n') name = input('请输入用户名:\n')
passwd = input('请输入密码:\n') passwd = input('请输入密码:\n')
+3 -3
View File
@@ -14,7 +14,6 @@ import rsa
import base64 import base64
import time import time
""" """
1. 百度的模拟登录,请确保你的账号能在浏览器下登录不需要验证码 1. 百度的模拟登录,请确保你的账号能在浏览器下登录不需要验证码
百度的三次登录错误后,才会出现验证码,但是还有一种情况是百度的账号异常 百度的三次登录错误后,才会出现验证码,但是还有一种情况是百度的账号异常
@@ -48,7 +47,7 @@ def get_gid():
gid = list(gid) gid = list(gid)
for xy in range(len(gid)): for xy in range(len(gid)):
if gid[xy] in "xy": if gid[xy] in "xy":
r = int(random.random()*16) r = int(random.random() * 16)
if gid[xy] == "x": if gid[xy] == "x":
gid[xy] = hex(r).replace("0x", '').upper() gid[xy] = hex(r).replace("0x", '').upper()
else: else:
@@ -121,6 +120,7 @@ def get_token():
# print(token_content_all) # print(token_content_all)
return token_content_all['data']['token'] return token_content_all['data']['token']
token = (get_token()) token = (get_token())
@@ -189,12 +189,12 @@ def login(username, password, key):
# f.write(html_index.content) # f.write(html_index.content)
# f.close() # f.close()
try: try:
input = raw_input input = raw_input
except: except:
pass pass
if __name__ == "__main__": if __name__ == "__main__":
username = input("请输入你的手机号或者邮箱\n >:") username = input("请输入你的手机号或者邮箱\n >:")
secret = input("请输入你的密码\n >:") secret = input("请输入你的密码\n >:")
+4 -2
View File
@@ -16,11 +16,13 @@ github:https://github.com/CriseLYJ/
update_time:2019-3-7 update_time:2019-3-7
""" """
class BiliBili(): class BiliBili():
""" """
登陆B站, 处理极验验证码 登陆B站, 处理极验验证码
电脑的缩放比例需要为100%, 否则验证码图片的获取会出现问题 电脑的缩放比例需要为100%, 否则验证码图片的获取会出现问题
""" """
def __init__(self, username, password): def __init__(self, username, password):
""" """
初始化 初始化
@@ -128,7 +130,7 @@ class BiliBili():
:param img2: 缺块验证码 :param img2: 缺块验证码
:return: 第二个缺块的左侧的x坐标 :return: 第二个缺块的左侧的x坐标
""" """
left = 60 # 大致忽略掉第一个缺块 left = 60 # 大致忽略掉第一个缺块
for i in range(left, img1.size[0]): for i in range(left, img1.size[0]):
for j in range(img1.size[1]): for j in range(img1.size[1]):
if not self.is_pixel_equal(img1, img2, i, j): if not self.is_pixel_equal(img1, img2, i, j):
@@ -214,5 +216,5 @@ if __name__ == '__main__':
ACCOUNT = input('请输入您的账号:') ACCOUNT = input('请输入您的账号:')
PASSOWRD = input('请输入您的密码:') PASSOWRD = input('请输入您的密码:')
test = BiliBili(ACCOUNT, PASSOWRD) # 输入账号和密码 test = BiliBili(ACCOUNT, PASSOWRD) # 输入账号和密码
test.crack() test.crack()
+2 -2
View File
@@ -3,7 +3,6 @@
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
# 获取登陆页面 # 获取登陆页面
session = requests.session() session = requests.session()
url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn' url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'
@@ -39,6 +38,7 @@ def login(post_data):
session.post(url, data=post_data, headers=get_post_headers()) session.post(url, data=post_data, headers=get_post_headers())
return session return session
if __name__ == '__main__': if __name__ == '__main__':
session = login(get_post_data()) session = login(get_post_data())
# 检查是否正常登录 # 检查是否正常登录
@@ -51,4 +51,4 @@ if __name__ == '__main__':
'Accept': 'Accept' 'Accept': 'Accept'
} }
resp = session.get(home_page, headers='') resp = session.get(home_page, headers='')
print(resp.text) print(resp.text)
+6 -4
View File
@@ -12,6 +12,7 @@ from urllib.request import urlretrieve
import requests import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from os import remove from os import remove
try: try:
import cookielib import cookielib
except: except:
@@ -26,12 +27,12 @@ url = 'https://accounts.douban.com/login'
datas = {'source': 'index_nav', datas = {'source': 'index_nav',
'remember': 'on'} 'remember': 'on'}
headers = {'Host':'www.douban.com', headers = {'Host': 'www.douban.com',
'Referer': 'https://www.douban.com/', 'Referer': 'https://www.douban.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding':'gzip, deflate, br'} 'Accept-Encoding': 'gzip, deflate, br'}
# 尝试使用cookie信息 # 尝试使用cookie信息
session = requests.session() session = requests.session()
@@ -40,7 +41,7 @@ try:
session.cookies.load(ignore_discard=True) session.cookies.load(ignore_discard=True)
except: except:
print("Cookies未能加载") print("Cookies未能加载")
#cookies加载不成功,则输入账号密码信息 # cookies加载不成功,则输入账号密码信息
datas['form_email'] = input('Please input your account:') datas['form_email'] = input('Please input your account:')
datas['form_password'] = input('Please input your password:') datas['form_password'] = input('Please input your password:')
@@ -91,13 +92,14 @@ def login():
page = login_page.text page = login_page.text
soup = BeautifulSoup(page, "html.parser") soup = BeautifulSoup(page, "html.parser")
result = soup.findAll('div', attrs={'class': 'title'}) result = soup.findAll('div', attrs={'class': 'title'})
#进入豆瓣登陆后页面,打印热门内容 # 进入豆瓣登陆后页面,打印热门内容
for item in result: for item in result:
print(item.find('a').get_text()) print(item.find('a').get_text())
# 保存 cookies 到文件, # 保存 cookies 到文件,
# 下次可以使用 cookie 直接登录,不需要输入账号和密码 # 下次可以使用 cookie 直接登录,不需要输入账号和密码
session.cookies.save() session.cookies.save()
if __name__ == '__main__': if __name__ == '__main__':
if isLogin(): if isLogin():
print('Login successfully') print('Login successfully')
+8 -7
View File
@@ -4,8 +4,8 @@ import argparse
import requests import requests
import pyquery import pyquery
def login(session, email, password): def login(session, email, password):
''' '''
Attempt to login to Facebook. Returns user ID, xs token and Attempt to login to Facebook. Returns user ID, xs token and
fb_dtsg token. All 3 are required to make requests to fb_dtsg token. All 3 are required to make requests to
@@ -15,28 +15,29 @@ def login(session, email, password):
# Navigate to Facebook's homepage to load Facebook's cookies. # Navigate to Facebook's homepage to load Facebook's cookies.
response = session.get('https://m.facebook.com') response = session.get('https://m.facebook.com')
# Attempt to login to Facebook # Attempt to login to Facebook
response = session.post('https://m.facebook.com/login.php', data={ response = session.post('https://m.facebook.com/login.php', data={
'email': email, 'email': email,
'pass': password 'pass': password
}, allow_redirects=False) }, allow_redirects=False)
# If c_user cookie is present, login was successful # If c_user cookie is present, login was successful
if 'c_user' in response.cookies: if 'c_user' in response.cookies:
# Make a request to homepage to get fb_dtsg token # Make a request to homepage to get fb_dtsg token
homepage_resp = session.get('https://m.facebook.com/home.php') homepage_resp = session.get('https://m.facebook.com/home.php')
dom = pyquery.PyQuery(homepage_resp.text.encode('utf8')) dom = pyquery.PyQuery(homepage_resp.text.encode('utf8'))
fb_dtsg = dom('input[name="fb_dtsg"]').val() fb_dtsg = dom('input[name="fb_dtsg"]').val()
return fb_dtsg, response.cookies['c_user'], response.cookies['xs'] return fb_dtsg, response.cookies['c_user'], response.cookies['xs']
else: else:
return False return False
if __name__ == "__main__": if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Login to Facebook') parser = argparse.ArgumentParser(description='Login to Facebook')
parser.add_argument('email', help='Email address') parser.add_argument('email', help='Email address')
parser.add_argument('password', help='Login password') parser.add_argument('password', help='Login password')
@@ -49,7 +50,7 @@ if __name__ == "__main__":
}) })
fb_dtsg, user_id, xs = login(session, args.email, args.password) fb_dtsg, user_id, xs = login(session, args.email, args.password)
if user_id: if user_id:
print('{0}:{1}:{2}'.format(fb_dtsg, user_id, xs)) print('{0}:{1}:{2}'.format(fb_dtsg, user_id, xs))
else: else:
+18 -20
View File
@@ -1,16 +1,15 @@
import requests import requests
import re import re
headers_login = { headers_login = {
'Accept-Language':'zh-CN,zh;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8',
'Cache-Control':'no-cache', 'Cache-Control': 'no-cache',
'Connection':'keep-alive', 'Connection': 'keep-alive',
'Host':'account.guokr.com', 'Host': 'account.guokr.com',
'Pragma':'no-cache', 'Pragma': 'no-cache',
'Cookie':'__utmt=1; __utma=253067679.2102330349.1540780238.1540780238.1541122809.2; __utmb=253067679.12.9.1541122812936; __utmc=253067679; __utmz=253067679.1540780238.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmv=253067679.|1=Is%20Registered=No=1; session=afcf1b0f-c71b-43d2-8046-f60ae28f9b45', 'Cookie': '__utmt=1; __utma=253067679.2102330349.1540780238.1540780238.1541122809.2; __utmb=253067679.12.9.1541122812936; __utmc=253067679; __utmz=253067679.1540780238.1.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmv=253067679.|1=Is%20Registered=No=1; session=afcf1b0f-c71b-43d2-8046-f60ae28f9b45',
'Referer':'https://account.guokr.com/sign_in/', 'Referer': 'https://account.guokr.com/sign_in/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36' 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36'
} }
session = requests.Session() session = requests.Session()
@@ -29,25 +28,24 @@ username = input('请输入用户名:')
password = input('请输入密码:') password = input('请输入密码:')
captcha = input('请输入验证码 : ') captcha = input('请输入验证码 : ')
data = { data = {
'csrf_token':csrf_token, 'csrf_token': csrf_token,
'username':username, 'username': username,
'password':password, 'password': password,
'captcha':captcha, 'captcha': captcha,
'captcha_rand':captcha_rand, 'captcha_rand': captcha_rand,
'permanent':'y ' , 'permanent': 'y ',
} }
response = session.post(url, data=data) response = session.post(url, data=data)
with open('response.html', 'w', encoding='utf-8') as fw: with open('response.html', 'w', encoding='utf-8') as fw:
fw.write(response.text) fw.write(response.text)
#print(response.cookies) # print(response.cookies)
#print(session.cookies) # print(session.cookies)
headers = { headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36' 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.61 Safari/537.36'
} }
homepage = 'https://www.guokr.com/i/0210199872/' homepage = 'https://www.guokr.com/i/0210199872/'
with open('homepage.html', 'w', encoding='utf-8') as fw: with open('homepage.html', 'w', encoding='utf-8') as fw:
+22 -22
View File
@@ -17,6 +17,7 @@ update_time:2019-3-7
""" """
def get_index(offset): def get_index(offset):
base_url = 'http://www.guokr.com/apis/minisite/article.json?' base_url = 'http://www.guokr.com/apis/minisite/article.json?'
data = { data = {
@@ -25,7 +26,7 @@ def get_index(offset):
'offset': offset 'offset': offset
} }
url = base_url + urlencode(data) url = base_url + urlencode(data)
#print(url) # print(url)
try: try:
resp = requests.get(url) resp = requests.get(url)
if codes.ok == resp.status_code: if codes.ok == resp.status_code:
@@ -33,7 +34,8 @@ def get_index(offset):
except requests.ConnectionError: except requests.ConnectionError:
return None return None
#解析出文章的url
# 解析出文章的url
def get_url(json): def get_url(json):
if json.get('result'): if json.get('result'):
result = json.get('result') result = json.get('result')
@@ -50,27 +52,26 @@ def get_url(json):
""" """
#解析文章详情页 # 解析文章详情页
def get_text(url): def get_text(url):
html=requests.get(url).text html = requests.get(url).text
print(html) print(html)
soup=bsp(html,'lxml') soup = bsp(html, 'lxml')
title=soup.find('h1',id='articleTitle').get_text() title = soup.find('h1', id='articleTitle').get_text()
autor=soup.find('div',class_="content-th-info").find('a').get_text() autor = soup.find('div', class_="content-th-info").find('a').get_text()
article_content=soup.find('div',class_="document").find_all('p') article_content = soup.find('div', class_="document").find_all('p')
all_p = [i.get_text() for i in article_content if not i.find('img') and not i.find('a')]#去除标签 all_p = [i.get_text() for i in article_content if not i.find('img') and not i.find('a')] # 去除标签
article = '\n'.join(all_p) article = '\n'.join(all_p)
yield {"title":title,"autor":autor,"article":article} yield {"title": title, "autor": autor, "article": article}
def save_article(content): def save_article(content):
try: try:
if content.get('title'): if content.get('title'):
file_name=str(content.get('title'))+'.txt' file_name = str(content.get('title')) + '.txt'
with open(file_name, 'w',encoding='utf-8') as f: with open(file_name, 'w', encoding='utf-8') as f:
#f.write(json.dumps(content,ensure_ascii=False)) # f.write(json.dumps(content,ensure_ascii=False))
f.write('\n'.join([str(content.get('title')),str(content.get('autor')),str(content.get('article'))])) f.write('\n'.join([str(content.get('title')), str(content.get('autor')), str(content.get('article'))]))
print('Downloaded article path is %s' % file_name) print('Downloaded article path is %s' % file_name)
else: else:
print('Already Downloaded', file_name) print('Already Downloaded', file_name)
@@ -78,14 +79,13 @@ def save_article(content):
print('Failed to Save Imageitem %s' % content) print('Failed to Save Imageitem %s' % content)
def main(offset): def main(offset):
result=get_index(offset) result = get_index(offset)
all_url=get_url(result) all_url = get_url(result)
for url in all_url: for url in all_url:
article=get_text(url) article = get_text(url)
for art in article: for art in article:
#print(art) # print(art)
save_article(art) save_article(art)
@@ -93,6 +93,6 @@ GROUP_START = 0
GROUP_END = 7 GROUP_END = 7
if __name__ == '__main__': if __name__ == '__main__':
for i in range(GROUP_START,GROUP_END+1): for i in range(GROUP_START, GROUP_END + 1):
main(offset=i*20+18) main(offset=i * 20 + 18)
time.sleep(1) time.sleep(1)
+1 -2
View File
@@ -2,7 +2,6 @@
import time import time
from selenium import webdriver from selenium import webdriver
# 强东的系统登陆模块没有用iframe,定位也没有微博那么复杂,可以靠id定位登陆 # 强东的系统登陆模块没有用iframe,定位也没有微博那么复杂,可以靠id定位登陆
login_url = 'https://passport.jd.com/new/login.aspx' login_url = 'https://passport.jd.com/new/login.aspx'
driver = webdriver.PhantomJS() driver = webdriver.PhantomJS()
@@ -23,4 +22,4 @@ time.sleep(5)
# cookie和前面一样的方式获取和保存 # cookie和前面一样的方式获取和保存
cookies = driver.get_cookies() cookies = driver.get_cookies()
driver.close() driver.close()
+7 -11
View File
@@ -9,7 +9,6 @@ import requests
import hashlib import hashlib
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
""" """
info: info:
author:CriseLYJ author:CriseLYJ
@@ -28,21 +27,20 @@ class Lagou_login(object):
' Core/1.53.4882.400 QQBrowser/9.7.13059.400', ' Core/1.53.4882.400 QQBrowser/9.7.13059.400',
'X-Requested-With': 'XMLHttpRequest'} 'X-Requested-With': 'XMLHttpRequest'}
#密码加密 # 密码加密
def encryptPwd(self, passwd): def encryptPwd(self, passwd):
# 对密码进行了md5双重加密 # 对密码进行了md5双重加密
passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest() passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()
# veennike 这个值是在js文件找到的一个写死的值 # veennike 这个值是在js文件找到的一个写死的值
passwd = 'veenike'+passwd+'veenike' passwd = 'veenike' + passwd + 'veenike'
passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest() passwd = hashlib.md5(passwd.encode('utf-8')).hexdigest()
return passwd return passwd
# 获取请求token
#获取请求token
def getTokenCode(self): def getTokenCode(self):
login_page = 'https://passport.lagou.com/login/login.html' login_page = 'https://passport.lagou.com/login/login.html'
data = self.session.get(login_page, headers= self.HEADERS) data = self.session.get(login_page, headers=self.HEADERS)
soup = BeautifulSoup(data.content, "lxml", from_encoding='utf-8') soup = BeautifulSoup(data.content, "lxml", from_encoding='utf-8')
''' '''
@@ -63,7 +61,6 @@ class Lagou_login(object):
return anti_token return anti_token
# 人工读取验证码并返回 # 人工读取验证码并返回
def getCaptcha(self): def getCaptcha(self):
captchaImgUrl = 'https://passport.lagou.com/vcode/create?from=register&refresh=%s' % time.time() captchaImgUrl = 'https://passport.lagou.com/vcode/create?from=register&refresh=%s' % time.time()
@@ -84,19 +81,18 @@ class Lagou_login(object):
print('你输入的验证码是:% s' % captcha) print('你输入的验证码是:% s' % captcha)
return captcha return captcha
# 登陆操作 # 登陆操作
def login(self, user, passwd, captchaData=None, token_code=None): def login(self, user, passwd, captchaData=None, token_code=None):
postData = {'isValidate': 'true', postData = {'isValidate': 'true',
'password': passwd, 'password': passwd,
# 如需验证码,则添加上验证码 # 如需验证码,则添加上验证码
'request_form_verifyCode': (captchaData if captchaData!=None else ''), 'request_form_verifyCode': (captchaData if captchaData != None else ''),
'submit': '', 'submit': '',
'username': user 'username': user
} }
login_url = 'https://passport.lagou.com/login/login.json' login_url = 'https://passport.lagou.com/login/login.json'
#头信息添加tokena # 头信息添加tokena
login_headers = self.HEADERS.copy() login_headers = self.HEADERS.copy()
token_code = self.getTokenCode() if token_code is None else token_code token_code = self.getTokenCode() if token_code is None else token_code
login_headers.update(token_code) login_headers.update(token_code)
@@ -110,7 +106,7 @@ class Lagou_login(object):
elif data['state'] == 10010: elif data['state'] == 10010:
print(data['message']) print(data['message'])
captchaData = self.getCaptcha() captchaData = self.getCaptcha()
token_code = {'X-Anit-Forge-Code' : data['submitCode'], 'X-Anit-Forge-Token' : data['submitToken']} token_code = {'X-Anit-Forge-Code': data['submitCode'], 'X-Anit-Forge-Token': data['submitToken']}
return self.login(user, passwd, captchaData, token_code) return self.login(user, passwd, captchaData, token_code)
else: else:
print(data['message']) print(data['message'])
+9 -11
View File
@@ -7,10 +7,10 @@ github:https://github.com/CriseLYJ/
update_time:2019-3-7 update_time:2019-3-7
""" """
import time #用来延时 import time # 用来延时
from selenium import webdriver from selenium import webdriver
driver = webdriver.Chrome() #选择浏览器,此处我选择的Chrome driver = webdriver.Chrome() # 选择浏览器,此处我选择的Chrome
QQ_NUMBER = input('请输入你的QQ号') QQ_NUMBER = input('请输入你的QQ号')
PASSWORD = input('请输入你的QQ密码') PASSWORD = input('请输入你的QQ密码')
@@ -19,21 +19,19 @@ driver.switch_to.frame('login_frame')
driver.find_element_by_id('switcher_plogin').click() driver.find_element_by_id('switcher_plogin').click()
driver.find_element_by_name('u').clear() driver.find_element_by_name('u').clear()
driver.find_element_by_name('u').send_keys(QQ_NUMBER) # 此处输入你的QQ号 driver.find_element_by_name('u').send_keys(QQ_NUMBER) # 此处输入你的QQ号
driver.find_element_by_name('p').clear() driver.find_element_by_name('p').clear()
driver.find_element_by_name('p').send_keys(PASSWORD) # 此处输入你的QQ密码 driver.find_element_by_name('p').send_keys(PASSWORD) # 此处输入你的QQ密码
driver.execute_script("document.getElementById('login_button').parentNode.hidefocus=false;") driver.execute_script("document.getElementById('login_button').parentNode.hidefocus=false;")
driver.find_element_by_xpath('//*[@id="loginform"]/div[4]/a').click() driver.find_element_by_xpath('//*[@id="loginform"]/div[4]/a').click()
driver.find_element_by_id('login_button').click() driver.find_element_by_id('login_button').click()
time.sleep(10) # 因为我曾经是QQ会员,所以每次登陆时都会提醒我要不要再续费的弹窗... time.sleep(10) # 因为我曾经是QQ会员,所以每次登陆时都会提醒我要不要再续费的弹窗...
driver.find_element_by_id('dialog_button_1').click() # 这个地方是我把那个弹窗给点击了,配合上面的延时用的,延时是等待那个弹窗出现,然后此处点击取消 driver.find_element_by_id('dialog_button_1').click() # 这个地方是我把那个弹窗给点击了,配合上面的延时用的,延时是等待那个弹窗出现,然后此处点击取消
btns = driver.find_elements_by_css_selector('a.item.qz_like_btn_v3') # 此处是CSS选择器 btns = driver.find_elements_by_css_selector('a.item.qz_like_btn_v3') # 此处是CSS选择器
for btn in btns: for btn in btns:
btn.click() btn.click()
+2 -3
View File
@@ -11,9 +11,8 @@ update_time:2019-3-7
def get_login(phone, pwd): def get_login(phone, pwd):
new_time = str(int(time.time())) new_time = str(int(time.time()))
sign = new_time+'_'+hashlib.md5((phone + pwd + new_time).encode("utf-8")).hexdigest() sign = new_time + '_' + hashlib.md5((phone + pwd + new_time).encode("utf-8")).hexdigest()
print(sign) print(sign)
url = "https://appblog.sina.com.cn/api/passport/v3_1/login.php" url = "https://appblog.sina.com.cn/api/passport/v3_1/login.php"
@@ -39,4 +38,4 @@ if __name__ == '__main__':
phone = input("你输入你的账号:") phone = input("你输入你的账号:")
pwd = input("请输入你的密码:") pwd = input("请输入你的密码:")
get_login(phone, pwd) get_login(phone, pwd)
+10 -13
View File
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from urllib.parse import urlencode from urllib.parse import urlencode
import requests,pymysql import requests, pymysql
from pyquery import PyQuery as pq from pyquery import PyQuery as pq
from selenium import webdriver from selenium import webdriver
from time import sleep from time import sleep
@@ -18,7 +18,7 @@ sql = "USE python;"
cursor.execute(sql) cursor.execute(sql)
connection.commit() connection.commit()
base_url='https://m.weibo.cn/api/container/getIndex?' base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = { headers = {
'Host': 'm.weibo.cn', 'Host': 'm.weibo.cn',
'Referer': 'https://m.weibo.cn/u/2145291155', 'Referer': 'https://m.weibo.cn/u/2145291155',
@@ -26,6 +26,7 @@ headers = {
'X-Requested-With': 'XMLHttpRequest', 'X-Requested-With': 'XMLHttpRequest',
} }
def create_sheet(bozhu): def create_sheet(bozhu):
try: try:
weibo = ''' weibo = '''
@@ -43,6 +44,7 @@ def create_sheet(bozhu):
except: except:
pass pass
def url_get(): def url_get():
# # 自动保持cookie,不需要自己维护cookie内容 # # 自动保持cookie,不需要自己维护cookie内容
# cookies = {} # cookies = {}
@@ -61,15 +63,15 @@ def url_get():
# } # }
# # get请求,应答解码 # # get请求,应答解码
# response = s.get(url=xl_url, headers=header,cookies=cookies) # response = s.get(url=xl_url, headers=header,cookies=cookies)
browser=webdriver.PhantomJS() browser = webdriver.PhantomJS()
browser.get(url='https://m.weibo.cn/') browser.get(url='https://m.weibo.cn/')
wb_name=browser.find_element_by_class_name("W_input") wb_name = browser.find_element_by_class_name("W_input")
wb_name.send_keys(input('输入博主ID')) wb_name.send_keys(input('输入博主ID'))
sleep(10) sleep(10)
search=browser.find_element_by_class_name('W_ficon ficon_search S_ficon') search = browser.find_element_by_class_name('W_ficon ficon_search S_ficon')
search.click() search.click()
sleep(5) sleep(5)
bz_num=browser.find_element_by_class_name('name_txt') bz_num = browser.find_element_by_class_name('name_txt')
bz_num.click() bz_num.click()
sleep(5) sleep(5)
# 开启了一个新页面,需要跳转到新页面 # 开启了一个新页面,需要跳转到新页面
@@ -77,8 +79,6 @@ def url_get():
browser.switch_to_window(handles[1]) browser.switch_to_window(handles[1])
# https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1076032145291155 # https://m.weibo.cn/api/container/getIndex?type=uid&value=2145291155&containerid=1076032145291155
# 拼接url # 拼接url
def get_page(page): def get_page(page):
@@ -104,7 +104,7 @@ def get_page(page):
def parse_page(json): def parse_page(json):
if json: if json:
items = json.get('data').get('cards') items = json.get('data').get('cards')
for index,item in enumerate(items): for index, item in enumerate(items):
if page == 1 and index == 1: if page == 1 and index == 1:
continue continue
else: else:
@@ -139,10 +139,7 @@ if __name__ == '__main__':
for result in results: for result in results:
print(result) print(result)
cursor.close() cursor.close()
# 可以爬任意指定博主所有微博,以博主名建立表,分别储存信息 # 可以爬任意指定博主所有微博,以博主名建立表,分别储存信息
# 使用selenium+PhantomJS抓取对应博主主页链接 # 使用selenium+PhantomJS抓取对应博主主页链接
+18 -16
View File
@@ -1,4 +1,4 @@
#/usr/bin/env python # /usr/bin/env python
# -*- coding:utf-8 -*- # -*- coding:utf-8 -*-
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.common.by import By from selenium.webdriver.common.by import By
@@ -11,34 +11,35 @@ import time
info: info:
author:CriseLYJ author:CriseLYJ
github:https://github.com/CriseLYJ/ github:https://github.com/CriseLYJ/
update_time:2019-3-7 update_time:2019-3-8
""" """
class loginTB(object): class loginTB(object):
def __init__(self): def __init__(self):
self.driver = webdriver.Chrome() self.driver = webdriver.Chrome()
self.driver.maximize_window() self.driver.maximize_window()
# 设置一个智能等待 # 设置一个智能等待
self.wait = WebDriverWait(self.driver,5) self.wait = WebDriverWait(self.driver, 5)
def login(self,key,pw): def login(self, key, pw):
url = 'https://login.taobao.com/member/login.jhtml' url = 'https://login.taobao.com/member/login.jhtml'
self.driver.get(url) self.driver.get(url)
try: try:
# 寻找密码登陆按钮 # 寻找密码登陆按钮
login_links = self.wait.until( login_links = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//a[text()='密码登录']")) EC.presence_of_element_located((By.XPATH, "//a[text()='密码登录']"))
) )
login_links.click() login_links.click()
except TimeoutException as e: except TimeoutException as e:
print("找不到登陆入口,原因是:",e) print("找不到登陆入口,原因是:", e)
else: else:
# 输入账号密码 # 输入账号密码
input_key = self.wait.until( input_key = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//input[@name='TPL_username']")) EC.presence_of_element_located((By.XPATH, "//input[@name='TPL_username']"))
) )
input_pw = self.wait.until( input_pw = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//input[@name='TPL_password']")) EC.presence_of_element_located((By.XPATH, "//input[@name='TPL_password']"))
) )
input_key.clear() input_key.clear()
input_pw.clear() input_pw.clear()
@@ -48,7 +49,7 @@ class loginTB(object):
try: try:
# 试探能否找到个人信息,如果找不到说明登录失败 # 试探能否找到个人信息,如果找不到说明登录失败
user_info = self.wait.until( user_info = self.wait.until(
EC.presence_of_element_located((By.XPATH,"//div[@class='m-userinfo']")) EC.presence_of_element_located((By.XPATH, "//div[@class='m-userinfo']"))
) )
print('已经登陆成功,进入了个人中心') print('已经登陆成功,进入了个人中心')
except TimeoutException: except TimeoutException:
@@ -59,7 +60,7 @@ class loginTB(object):
try: try:
# 尝试找手机验证框,如果能找到说明要手机验证 # 尝试找手机验证框,如果能找到说明要手机验证
frame = self.wait.until( frame = self.wait.until(
EC.presence_of_element_located((By.XPATH,'//div[@class="login-check-left"]/iframe')) EC.presence_of_element_located((By.XPATH, '//div[@class="login-check-left"]/iframe'))
) )
print('本次登录需要进行手机验证...') print('本次登录需要进行手机验证...')
except TimeoutException: except TimeoutException:
@@ -67,20 +68,20 @@ class loginTB(object):
print('登录失败,目测是账号或密码有误,请检查后重新登录...') print('登录失败,目测是账号或密码有误,请检查后重新登录...')
key = input('请重新输入账号:').strip() key = input('请重新输入账号:').strip()
pw = input('请重新输入密码:').strip() pw = input('请重新输入密码:').strip()
self.login(key,pw) self.login(key, pw)
else: else:
self.driver.switch_to.frame(frame) self.driver.switch_to.frame(frame)
phone_num = self.wait.until( phone_num = self.wait.until(
EC.presence_of_element_located((By.XPATH,'//button[@id="J_GetCode"]')) EC.presence_of_element_located((By.XPATH, '//button[@id="J_GetCode"]'))
) )
phone_num.click() phone_num.click()
phone_key = input('请输入手机验证码:').strip() phone_key = input('请输入手机验证码:').strip()
key_send = self.wait.until( key_send = self.wait.until(
EC.presence_of_element_located((By.XPATH,'//input[@id="J_Phone_Checkcode"]')) EC.presence_of_element_located((By.XPATH, '//input[@id="J_Phone_Checkcode"]'))
) )
key_send.send_keys(phone_key) key_send.send_keys(phone_key)
go_button = self.wait.until( go_button = self.wait.until(
EC.presence_of_element_located((By.XPATH,'//input[@type="submit"]')) EC.presence_of_element_located((By.XPATH, '//input[@type="submit"]'))
) )
go_button.click() go_button.click()
user_info = self.wait.until( user_info = self.wait.until(
@@ -88,8 +89,9 @@ class loginTB(object):
) )
print('手机验证登陆成功!!!') print('手机验证登陆成功!!!')
if __name__ == '__main__': if __name__ == '__main__':
t = time.time() t = time.time()
l = loginTB() l = loginTB()
l.login('username','password') l.login('username', 'password')
print('登录完成,耗时{:.2f}'.format(float(time.time()-t))) print('登录完成,耗时{:.2f}'.format(float(time.time() - t)))
+10 -7
View File
@@ -1,6 +1,4 @@
import requests import requests
import json
import time
import re import re
import os import os
from hashlib import md5 from hashlib import md5
@@ -23,6 +21,7 @@ headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
} }
# 获取imageID # 获取imageID
def get_imageID(term, page): def get_imageID(term, page):
try: try:
@@ -35,6 +34,7 @@ def get_imageID(term, page):
except ConnectionError: except ConnectionError:
return None return None
# 解析imageID里面的图片id # 解析imageID里面的图片id
def parse_imgID(imageID): def parse_imgID(imageID):
print('解析imageID') print('解析imageID')
@@ -60,20 +60,22 @@ def get_ImageJPG(id):
except ConnectionError: except ConnectionError:
return None return None
# 解析html里面的图片url # 解析html里面的图片url
def parse_imgURL(html): def parse_imgURL(html):
if html: if html:
print('解析HTML图片URL...') print('解析HTML图片URL...')
url = re.findall('<div.*?class="image-cover".*?<img.*?src="(.*?)">.*?</div>', html, re.S) url = re.findall('<div.*?class="image-cover".*?<img.*?src="(.*?)">.*?</div>', html, re.S)
#url = re.findall('<title>(.*?)</title>', html, re.S) # url = re.findall('<title>(.*?)</title>', html, re.S)
for item in url: for item in url:
print("准备下载...", item) print("准备下载...", item)
download_image(item) download_image(item)
return None return None
def download_image(url): def download_image(url):
try: try:
urls = 'https:' + url urls = 'https:' + url
ir = requests.get(urls) ir = requests.get(urls)
if ir.status_code == 200: if ir.status_code == 200:
save_image(ir.content) save_image(ir.content)
@@ -81,6 +83,7 @@ def download_image(url):
except RequestException: except RequestException:
return None return None
def save_image(content): def save_image(content):
file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg') file_path = '{0}/{1}.{2}'.format(os.getcwd(), md5(content).hexdigest(), 'jpg')
if not os.path.exists(file_path): if not os.path.exists(file_path):
@@ -89,12 +92,12 @@ def save_image(content):
f.close() f.close()
print('下载成功----------------------') print('下载成功----------------------')
def main(): def main():
term = input('输入想要搜索的内容: ') term = input('输入想要搜索的内容: ')
for i in range(1, 7): for i in range(1, 7):
get_imageID(term, i) get_imageID(term, i)
if __name__ == '__main__': if __name__ == '__main__':
main() main()
+1 -1
View File
@@ -101,4 +101,4 @@ setup(
cmdclass={ cmdclass={
'upload': UploadCommand, 'upload': UploadCommand,
}, },
) )
+14 -12
View File
@@ -36,17 +36,19 @@ def get_tweets(user, pages=25):
tweetId = tweet.find( tweetId = tweet.find(
'.js-permalink')[0].attrs['data-conversation-id'] '.js-permalink')[0].attrs['data-conversation-id']
time = datetime.fromtimestamp( time = datetime.fromtimestamp(
int(tweet.find('._timestamp')[0].attrs['data-time-ms'])/1000.0) int(tweet.find('._timestamp')[0].attrs['data-time-ms']) / 1000.0)
interactions = [x.text for x in tweet.find( interactions = [x.text for x in tweet.find(
'.ProfileTweet-actionCount')] '.ProfileTweet-actionCount')]
replies = int(interactions[0].split(" ")[0].replace(comma, "").replace(dot,"")) replies = int(interactions[0].split(" ")[0].replace(comma, "").replace(dot, ""))
retweets = int(interactions[1].split(" ")[ retweets = int(interactions[1].split(" ")[
0].replace(comma, "").replace(dot,"")) 0].replace(comma, "").replace(dot, ""))
likes = int(interactions[2].split(" ")[0].replace(comma, "").replace(dot,"")) likes = int(interactions[2].split(" ")[0].replace(comma, "").replace(dot, ""))
hashtags = [hashtag_node.full_text for hashtag_node in tweet.find('.twitter-hashtag')] hashtags = [hashtag_node.full_text for hashtag_node in tweet.find('.twitter-hashtag')]
urls = [url_node.attrs['data-expanded-url'] for url_node in tweet.find('a.twitter-timeline-link:not(.u-hidden)')] urls = [url_node.attrs['data-expanded-url'] for url_node in
photos = [photo_node.attrs['data-image-url'] for photo_node in tweet.find('.AdaptiveMedia-photoContainer')] tweet.find('a.twitter-timeline-link:not(.u-hidden)')]
photos = [photo_node.attrs['data-image-url'] for photo_node in
tweet.find('.AdaptiveMedia-photoContainer')]
videos = [] videos = []
video_nodes = tweet.find(".PlayableMedia-player") video_nodes = tweet.find(".PlayableMedia-player")
for node in video_nodes: for node in video_nodes:
@@ -57,11 +59,11 @@ def get_tweets(user, pages=25):
video_id = tmp[:tmp.index('.jpg')] video_id = tmp[:tmp.index('.jpg')]
videos.append({'id': video_id}) videos.append({'id': video_id})
tweets.append({'tweetId': tweetId, 'time': time, 'text': text, tweets.append({'tweetId': tweetId, 'time': time, 'text': text,
'replies': replies, 'retweets': retweets, 'likes': likes, 'replies': replies, 'retweets': retweets, 'likes': likes,
'entries': { 'entries': {
'hashtags': hashtags, 'urls': urls, 'hashtags': hashtags, 'urls': urls,
'photos': photos, 'videos': videos 'photos': photos, 'videos': videos
} }
}) })
last_tweet = html.find('.stream-item')[-1].attrs['data-item-id'] last_tweet = html.find('.stream-item')[-1].attrs['data-item-id']
@@ -72,7 +74,7 @@ def get_tweets(user, pages=25):
yield tweet yield tweet
r = session.get( r = session.get(
url, params = {'max_position': last_tweet}, headers = headers) url, params={'max_position': last_tweet}, headers=headers)
pages += -1 pages += -1
yield from gen_tweets(pages) yield from gen_tweets(pages)
+17 -18
View File
@@ -16,7 +16,7 @@ update_time:2019-3-6
session = requests.session() session = requests.session()
headers = { headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0' 'User-Agent': 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
} }
QRImgPath = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'webWeixinQr.jpg' QRImgPath = os.path.split(os.path.realpath(__file__))[0] + os.sep + 'webWeixinQr.jpg'
@@ -36,7 +36,7 @@ SyncKey = ''
def getUUID(): def getUUID():
global uuid,session global uuid, session
url = 'https://login.weixin.qq.com/jslogin' url = 'https://login.weixin.qq.com/jslogin'
params = { params = {
@@ -176,10 +176,9 @@ def login():
def webwxinit(): def webwxinit():
url = base_uri + \ url = base_uri + \
'/webwxinit?pass_ticket=%s&skey=%s&r=%s' % ( '/webwxinit?pass_ticket=%s&skey=%s&r=%s' % (
pass_ticket, skey, int(time.time())) pass_ticket, skey, int(time.time()))
params = { params = {
'BaseRequest': BaseRequest 'BaseRequest': BaseRequest
} }
@@ -188,7 +187,7 @@ def webwxinit():
h['ContentType'] = 'application/json; charset=UTF-8' h['ContentType'] = 'application/json; charset=UTF-8'
response = session.post(url, data=json.dumps(params), headers=h) response = session.post(url, data=json.dumps(params), headers=h)
data = response.content.decode('utf-8') data = response.content.decode('utf-8')
#print(data) # print(data)
global ContactList, My, SyncKey global ContactList, My, SyncKey
@@ -211,10 +210,9 @@ def webwxinit():
def webwxgetcontact(): def webwxgetcontact():
url = base_uri + \ url = base_uri + \
'/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % ( '/webwxgetcontact?pass_ticket=%s&skey=%s&r=%s' % (
pass_ticket, skey, int(time.time())) pass_ticket, skey, int(time.time()))
h = headers h = headers
h['ContentType'] = 'application/json; charset=UTF-8' h['ContentType'] = 'application/json; charset=UTF-8'
@@ -226,8 +224,12 @@ def webwxgetcontact():
MemberList = dic['MemberList'] MemberList = dic['MemberList']
# 倒序遍历,不然删除的时候出问题.. # 倒序遍历,不然删除的时候出问题..
SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync", "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp", "masssendapp", SpecialUsers = ["newsapp", "fmessage", "filehelper", "weibo", "qqmail", "tmessage", "qmessage", "qqsync",
"meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder", "wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil", "userexperience_alarm"] "floatbottle", "lbsapp", "shakeapp", "medianote", "qqfriend", "readerapp", "blogapp", "facebookapp",
"masssendapp",
"meishiapp", "feedsapp", "voip", "blogappweixin", "weixin", "brandsessionholder", "weixinreminder",
"wxid_novlwrv3lqwv11", "gh_22b87fa7cb3c", "officialaccounts", "notification_messages", "wxitil",
"userexperience_alarm"]
for i in range(len(MemberList) - 1, -1, -1): for i in range(len(MemberList) - 1, -1, -1):
Member = MemberList[i] Member = MemberList[i]
if Member['VerifyFlag'] & 8 != 0: # 公众号/服务号 if Member['VerifyFlag'] & 8 != 0: # 公众号/服务号
@@ -241,8 +243,8 @@ def webwxgetcontact():
return MemberList return MemberList
def main():
def main():
if not getUUID(): if not getUUID():
print('获取uuid失败') print('获取uuid失败')
return return
@@ -258,7 +260,7 @@ def main():
if not login(): if not login():
print('登录失败') print('登录失败')
return return
#登录完成, 下面查询好友 # 登录完成, 下面查询好友
if not webwxinit(): if not webwxinit():
print('初始化失败') print('初始化失败')
return return
@@ -267,14 +269,11 @@ def main():
print('通讯录共%s位好友' % len(MemberList)) print('通讯录共%s位好友' % len(MemberList))
for x in MemberList : for x in MemberList:
sex = '未知' if x['Sex'] == 0 else '' if x['Sex'] == 1 else '' sex = '未知' if x['Sex'] == 0 else '' if x['Sex'] == 1 else ''
print('昵称:%s, 性别:%s, 备注:%s, 签名:%s' % (x['NickName'], sex, x['RemarkName'], x['Signature'])) print('昵称:%s, 性别:%s, 备注:%s, 签名:%s' % (x['NickName'], sex, x['RemarkName'], x['Signature']))
if __name__ == '__main__': if __name__ == '__main__':
print('开始') print('开始')
main() main()