Python之requests实现github模拟登录

文章目录

github 模拟登录

前言

前面学习了requests模块的基础学习后,接下来做一个实战应用,会涉及到requests的post 请求,请求头headers的设置,利用sesson保持 cookie状态等

模拟登录流程

如下图是模拟登录的流程,在知道了具体的流体后,写代码才能流畅。

抓包操作

在使用 chrom进行抓包操作时,需要新开一个无痕窗口

查看登录表单的内容

  • 主要是看html结构,可以知道提交的目标地址,提交的方式(POST|GET),提交的表单的主要字段。
  • 同时需要开启Preserve.log,这样子页面在跳转时,也那个记录前面的请求会话

登录操作

  • 通过提交登录表单,触发session 接口,从 request headers,以及Form Data,方便为后端准备数据
  • 同时发现 auth_token 值在不同页面,是不一样的,根据 post数据源的几种类比较判断,具体在前面的 requests模块介绍的文章,其值是属于存在静态页面中的预设值,一开始进到登录页时已经生成

模拟登录操作

完整代码链接:https://gitee.com/allen-huang/python/blob/master/crawler/do-request/login_github.py

根据上面的流程,后端在做模拟登录时,需要做3步如下:

  1. 通过 session.get获得github登录页面 生成的auth_token
  2. 组装 /session的 from data和请求头 headers,通过 session.post调用/session 请求
  3. 正则分析个人页的 title来验证,登录状态的验证

在 main函数的调用

python 复制代码
if __name__ == '__main__':
    # todo 声明一个session对象,并设置请求头
    session = requests.session()
    session.headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36'
    }
    # todo: 1.获取登录页面的auth_token
    auth_token = get_auth_token(session)

    # todo:2.组装表单数据,使用 session.post(),请求/session,用来记录登录状态
    do_login(session)

    # todo: 3.通过请求github.com/用户名,验证是否登录成功
    chk_login_status(session)

    # insert_data = {
    #     "username": "hjc1985",
    #     "req_headers": resp.request.headers,
    #     "resp_headers": resp.request.headers,
    #     "resp_status": resp.status_code,
    #     "resp_body": resp.content.decode()
    # }
    # result = MongoPool().test.login_github.insert_one(insert_data)
    # print(result.inserted_id)

获得 auth_token

auth_token,这里是简写了,在 github 登录页中是authenticity_token,通过正则提取带有"authenticity_token"字段的值即可,代码如下:

python 复制代码
def get_auth_token(session: Session) -> str:
    """
    todo 先从github.com/login获取登录页面的html内容,然后通过正则表达式获取auth_token
    @param session:
    @return:
    """
    resp = session.get('https://github.com/login')
    if resp.status_code != 200:
        print("请求失败,请稍后再试!")
        exit(0)
    login_html = resp.content.decode()
    auth_token = re.findall(r'name="authenticity_token" value="(.*?)"', login_html)[0]
    return auth_token

调用/session接口登录处理

注意:为了安全性考虑,这里的密码属性,password在文档展示不是真实的密码,因为,github提交的密码属于明码,没有进行二次加密过的。真实密码的登录请求我已测试通过的

python 复制代码
def do_login(session: Session):
    """
    todo 组装表单数据,使用 session.post(),请求/session,用来记录登录状态
    @param session: session对象
    @return:
    """
    global resp
    post_data = {
        "commit": "Sign in",
        "authenticity_token": auth_token,
        "login": "hjc1985",
        "password": "123456",  # 登录密码,为了个人账号安全我这里不是真实密码
        "webauthn-conditional": "undefined",
        "javascript-support": "true",
        "webauthn-support": "supported",
        "webauthn-iuvpaa-support": "supported",
        "return_to": "https://github.com/login"
    }
    resp = session.post(url='https://github.com/session', data=post_data)
    if resp.status_code != 200:
        print("请求失败,请检查参数!")
    else:
        print("请求/session 成功!")

检测登录是否成功

在 github 中,个人中心地址github.com/用户名的标题内容结尾,是否含有GitHub,是判断登录状态的依据之一,如果 GitHub 不存在表示登录成功,反之则登录不成功。

python 复制代码
def chk_login_status(session: Session):
    """
    todo: 通过请求github.com/用户名,验证是否登录成功
    @param session:
    @return:
    """
    resp = session.get('https://github.com/hjc1985')
    html_content = resp.content
    res = re.findall(r'<title>(.+?)(GitHub)?</title>', html_content.decode('utf-8'))
    """
    todo 使用 try...except...来判断索引对应的值是否存在
    """
    try:
        end_str = res[0][1]
    except IndexError:
        end_str = ""

    if end_str == "":
        # 个人主页的title内容如果结尾没有GitHub,说明登录成功
        print("登录成功!")
    else:
        print("登录失败!")

    with open("github-profile.html", "wb") as f:
        f.write(html_content)
  • 登录成功的效果
  • 登录不成功的效果

总结:

  • 这是拿 github 模拟登录来对 requests模块的get, post方法,以及登录状态保持做的一个应用,主要是为了巩固知识点。
  • 它的登录机制还算是比较简单的,因为大部分值都是固定的可以获取到,像真正项目过程中,post 来源的数据都是需要调用接口,或 JS 逆向才能拿到。
相关推荐
计算机毕业编程指导师7 分钟前
Python大数据毕设:基于Hadoop的病毒式社交媒体趋势和参与度分析系统怎么做 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·毕业设计·课程设计·社交媒体
计算机毕业编程指导师9 分钟前
【计算机毕设选题推荐】基于Spark与Hadoop的AI就业收入区域差异分析系统 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·数据分析·spark·毕业设计·课程设计·ai就业收入
小猴子爱上树13 分钟前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
littlex19 分钟前
复盘分享:「高性价比人生指南」衍生网站,一周 8k+ 用户
github
lzqrzpt35 分钟前
临沂LED驱动电源工程选型标准与工艺对比解析
python·单片机·嵌入式硬件·物联网
专业程序开发源36 分钟前
django新闻推荐系统70655-计算机课程设计、毕业设计
java·javascript·spring boot·后端·python·django·课程设计
蒲公英eric1 小时前
人口增长问题:从 Malthus 到 Logistic 的建模之旅
人工智能·python·数学建模·人口增长问题
全栈练习生1 小时前
大模型原理之 Softmax
python·ai
迅猛龙办公室1 小时前
python获取星期字符串
开发语言·python
打工仔折腾 AI1 小时前
把 AI Agent 托管到家里电脑:UU远程端口映射与CLI实测记录
人工智能·后端·python·langchain·电脑·ai agent 实战