模拟登录知乎

来源:互联网 发布:捕鱼源码 带后台 编辑:程序博客网 时间:2024/05/08 11:15

代码源码在    https://github.com/xchaoinfo/fuck-login      里面有各大网站的模拟登录



# !/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 requeststry:    import cookielibexcept:    import http.cookiejar as cookielibimport reimport timeimport os.pathtry:    from PIL import Imageexcept:    pass# 构造 Request headersagent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36'headers = {    "Host": "www.zhihu.com",    "Referer": "https://www.zhihu.com/",    '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 = 'https://www.zhihu.com'    # 获取登录时需要用到的_xsrf    index_page = session.get(index_url, headers=headers)    html = index_page.text    pattern = r'name="_xsrf" value="(.*?)"'    # 这里的_xsrf 返回的是一个list    _xsrf = re.findall(pattern, html)    return _xsrf[0]# 获取验证码def get_captcha():    t = str(int(time.time() * 1000))    captcha_url = 'https://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 captchadef isLogin():    # 通过查看用户个人信息来判断是否已经登录    url = "https://www.zhihu.com/settings/profile"    login_code = session.get(url, headers=headers, allow_redirects=False).status_code    print cookielib    # r = session.get('知乎个人主页', headers=headers)    # print r.content    #使用session登录主页    if login_code == 200:        return True    else:        return Falsedef login(secret, account):    _xsrf = get_xsrf()    headers["X-Xsrftoken"] = _xsrf    headers["X-Requested-With"] = "XMLHttpRequest"    # 通过输入的用户名判断是否是手机号    if re.match(r"^1\d{10}$", account):        print("手机号登录 \n")        post_url = 'https://www.zhihu.com/login/phone_num'        postdata = {            '_xsrf': _xsrf,            'password': secret,            'phone_num': account,            "rememberme": "true",            "captcha_type": "cn"        }    else:        if "@" in account:            print("邮箱登录 \n")        else:            print("你的账号输入有问题,请重新登录")            return 0        post_url = 'https://www.zhihu.com/login/email'        postdata = {            '_xsrf': _xsrf,            'password': secret,            'email': account        }    # 不需要验证码直接登录成功    login_page = session.post(post_url, data=postdata, headers=headers)    login_code = login_page.json()    if login_code['r'] == 1:        # 不输入验证码登录失败        # 使用需要输入验证码的方式登录        postdata["captcha"] = get_captcha()        login_page = session.post(post_url, data=postdata, headers=headers)        login_code = login_page.json()        print(login_code['msg'])    # 保存 cookies 到文件,    # 下次可以使用 cookie 直接登录,不需要输入账号和密码    session.cookies.save()try:    input = raw_inputexcept:    passif __name__ == '__main__':    if isLogin():        print('您已经登录')    else:        account = "账户"        secret = "密码"        login(secret, account)