码迷,mamicode.com
首页 > 编程语言 > 详细

python 模拟知乎登录,包含验证码(转)

时间:2018-04-09 15:04:13      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:ext   6.4   wan   windows   ima   mail   3.0   else   pre   

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
‘‘‘
Required
- requests (必须)
- pillow (可选)
Info
- author : "xchaoinfo"
- email  : "xchaoinfo@qq.com"
- date   : "2016.2.4"
Update
- name   : "wangmengcn"
- email  : "eclipse_sv@163.com"
- date   : "2016.4.21"
‘‘‘
import requests
try:
    import cookielib
except:
    import http.cookiejar as cookielib
import re
import time
import os.path
try:
    from PIL import Image
except:
    pass


# 构造 Request headers
agent = Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0
headers = {
    User-Agent: agent
}

# 使用登录cookie信息
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename=cookies)
try:
    session.cookies.load(ignore_discard=True)
except:
    print("Cookie 未能加载")


def get_xsrf():
    ‘‘‘_xsrf 是一个动态变化的参数‘‘‘
    index_url = http://www.zhihu.com
    # 获取登录时需要用到的_xsrf
    index_page = session.get(index_url, headers=headers)
    html = index_page.text
    pattern = rname="_xsrf" value="(.*?)"
    # 这里的_xsrf 返回的是一个list
    _xsrf = re.findall(pattern, html)
    return _xsrf[0]


# 获取验证码
def get_captcha():
    t = str(int(time.time()*1000))
    captcha_url = http://www.zhihu.com/captcha.gif?r= + t + "&type=login"
    r = session.get(captcha_url, headers=headers)
    with open(captcha.jpg, wb) as f:
        f.write(r.content)
        f.close()
    # 用pillow 的 Image 显示验证码
    # 如果没有安装 pillow 到源代码所在的目录去找到验证码然后手动输入
    try:
        im = Image.open(captcha.jpg)
        im.show()
        im.close()
    except:
        print(u请到 %s 目录找到captcha.jpg 手动输入 % os.path.abspath(captcha.jpg))
    captcha = input("please input the captcha\n>")
    return captcha


def isLogin():
    # 通过查看用户个人信息来判断是否已经登录
    url = "https://www.zhihu.com/settings/profile"
    login_code = session.get(url,allow_redirects=False).status_code
    if int(x=login_code) == 200:
        return True
    else:
        return False



def login(secret, account):
    # 通过输入的用户名判断是否是手机号
    if re.match(r"^1\d{10}$", account):
        print("手机号登录 \n")
        post_url = http://www.zhihu.com/login/phone_num
        postdata = {
            _xsrf: get_xsrf(),
            password: secret,
            remember_me: true,
            phone_num: account,
        }
    else:
        print("邮箱登录 \n")
        post_url = http://www.zhihu.com/login/email
        postdata = {
            _xsrf: get_xsrf(),
            password: secret,
            remember_me: true,
            email: account,
        }
    try:
        # 不需要验证码直接登录成功
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = login_page.text
        print(login_page.status)
        print(login_code)
    except:
        # 需要输入验证码后才能登录成功
        postdata["captcha"] = get_captcha()
        login_page = session.post(post_url, data=postdata, headers=headers)
        login_code = eval(login_page.text)
        print(login_code[msg])
    session.cookies.save()

try:
    input = raw_input
except:
    pass


if __name__ == __main__:
    if isLogin():
        print(您已经登录)
    else:
        account = input(请输入你的用户名\n>  )
        secret = input("请输入你的密码\n>  ")
        login(secret, account)

 

python 模拟知乎登录,包含验证码(转)

标签:ext   6.4   wan   windows   ima   mail   3.0   else   pre   

原文地址:https://www.cnblogs.com/LoveJulin/p/8759234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!