目录
浏览器操作
浏览器先登录按住F12如下可以看见
其中每隔大约2秒会刷新一条记录如下
其中它的URL都是相同的如下
在这之中我们需要是code对应的值在下面会详细介绍
点击qrLogin_code可以看见我们需要获取二维码的地址如下
通过浏览器登录那条地址会 出现如下所示的一个json数据
可以看看我们需要的一些数据如图片的地址和“code对应的值
代码
有了这些我们就可以实现一个豆瓣小组的简单登录代码如下
def _get_qrcode(self):
url = 'https://accounts.douban.com/j/mobile/login/qrlogin_code'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
'Referer': 'https://accounts.douban.com/passport/login',
}
resp = self.session.get(url=url, headers=headers)
resp_json=parse_json(resp.text)
code= resp_json["payload"]["code"]
href = resp_json["payload"]["img"]
img_resp = self.session.get(url=href,headers=headers)
save_image(img_resp, self.qrcode_img_file)
logging.info('二维码获取成功,请打开豆瓣小组APP扫描')
open_image(self.qrcode_img_file)
rsp_url = " https://accounts.douban.com/j/mobile/login/qrlogin_status?ck=&code={}".format(code)
try_count=50
while True:
rsp = self.session.get(url=rsp_url,headers=headers)
rsp = parse_json(rsp.text)
logging.info("login_status:{}".format(rsp["payload"]["login_status"]))
if rsp["payload"]["login_status"]=="login":
break
time.sleep(2)
try_count-=1
if try_count==0:
logging.info("失败!")
return False,None
return True,code
其中while循环是用来模拟浏览器每隔2秒和服务器进行一次通信
完整代码如下
import time
import json
import requests
import logging
import os
logging.basicConfig(format='%(asctime)s - %(levelname)s: %(message)s',
level=logging.INFO)
class QrLogin:
def __init__(self, ):
self.qrcode_img_file = 'qr_code.png'
self.session = requests.session()
self.is_login = False
def _get_login_page(self):
url = "https://passport.jd.com/new/login.aspx"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
}
page = self.session.get(url, headers=headers)
return page
def _get_qrcode(self):
url = 'https://accounts.douban.com/j/mobile/login/qrlogin_code'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
'Referer': 'https://accounts.douban.com/passport/login',
}
resp = self.session.get(url=url, headers=headers)
resp_json=parse_json(resp.text)
code= resp_json["payload"]["code"]
href = resp_json["payload"]["img"]
img_resp = self.session.get(url=href,headers=headers)
save_image(img_resp, self.qrcode_img_file)
logging.info('二维码获取成功,请打开豆瓣小组APP扫描')
open_image(self.qrcode_img_file)
rsp_url = " https://accounts.douban.com/j/mobile/login/qrlogin_status?ck=&code={}".format(code)
try_count=50
while True:
rsp = self.session.get(url=rsp_url,headers=headers)
rsp = parse_json(rsp.text)
logging.info("login_status:{}".format(rsp["payload"]["login_status"]))
if rsp["payload"]["login_status"]=="login":
break
time.sleep(2)
try_count-=1
if try_count==0:
logging.info("失败!")
return False,None
return True,code
def login_by_qrcode(self):
self._get_login_page()
# download QR code
code,status = self._get_qrcode()
if not status:
raise Exception('二维码下载失败')
#验证是否登录成功
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36',
'Referer': 'https://www.douban.com/group/explore',
}
homeStr = self.session.cookies["dbcl2"]
key = homeStr.split(":")[0][1:]
rsp = self.session.get("https://www.douban.com/people/{}/".format(key), headers=headers,allow_redirects=False)
# sp = BeautifulSoup(rsp.text, "lxml")
# print(sp)
if rsp.status_code ==requests.codes.OK:
logging.info('二维码登录成功')
else:
logging.info('二维码登录失败')
def parse_json(s):
begin = s.find('{')
end = s.rfind('}') + 1
return json.loads(s[begin:end])
def open_image(image_file):
if os.name == "nt":
os.system('start ' + image_file) # for Windows
else:
if os.uname()[0] == "Linux":
if "deepin" in os.uname()[2]:
os.system("deepin-image-viewer " + image_file) # for deepin
else:
os.system("eog " + image_file) # for Linux
else:
os.system("open " + image_file) # for Mac
def response_status(resp):
if resp.status_code != requests.codes.OK:
print('Status: %u, Url: %s' % (resp.status_code, resp.url))
return False
return True
def save_image(resp, image_file):
with open(image_file, 'wb') as f:
for chunk in resp.iter_content(chunk_size=1024):
f.write(chunk)
if __name__ == "__main__":
douban= QrLogin()
douban.login_by_qrcode()
logging.info("done!")