代码之家  ›  专栏  ›  技术社区  ›  Joseph Franciscus

从Python脚本登录到Flask Web应用程序[复制]

  •  0
  • Joseph Franciscus  · 技术社区  · 7 年前

    我试图发布一个请求,使用Python中的Requests模块登录到一个网站,但它并不真正起作用。我是新来的…所以我不知道我是否应该做我的用户名和密码cookies或某种类型的HTTP授权我发现的东西(??)。

    from pyquery import PyQuery
    import requests
    
    url = 'http://www.locationary.com/home/index2.jsp'
    

    ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
    
    r = requests.post(url, cookies=ck)
    
    content = r.text
    
    q = PyQuery(content)
    
    title = q("title").text()
    
    print title
    

    我觉得我做错了曲奇…我不知道。

    如果你能向我解释一些关于请求和饼干的事情,并帮助我解决这个问题,我将非常感谢。:天

    谢谢。

    </td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
    <td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
    <td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
    <td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>
    

    所以我认为我做得对,但是输出仍然是“Locationary.com”

    我希望能够长时间保持登录状态,每当我请求该域下的页面时,我希望内容显示为我已登录。

    0 回复  |  直到 13 年前
        1
  •  42
  •   Community Mohan Dere    9 年前

    如果您想要的信息在登录后立即指向的页面上。。。

    我们打电话给你 ck 变量 payload python-requests 文件:

    payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
    url = 'http://www.locationary.com/home/index2.jsp'
    requests.post(url, data=payload)
    

    否则。。。

    https://stackoverflow.com/a/17633072/111362 下面。

        2
  •  221
  •   ZygD    9 年前

    我知道你已经找到了另一个解决方案,但对于像我这样的人来说,如果他们发现了这个问题,寻找同样的东西,可以通过以下请求来实现:

    首先,正如Marcus所做的那样,检查登录表单的来源以获得三条信息:表单发布到的url,用户名和密码字段的name属性。在他的例子中,它们是inUserName和inUserPass。

    一旦你拿到了,你可以用 requests.Session()

    假设您的登录尝试成功,您可以简单地使用会话实例向站点发出进一步的请求。标识您的cookie将用于授权请求。

    import requests
    
    # Fill in your details here to be posted to the login form.
    payload = {
        'inUserName': 'username',
        'inUserPass': 'password'
    }
    
    # Use 'with' to ensure the session context is closed after use.
    with requests.Session() as s:
        p = s.post('LOGIN_URL', data=payload)
        # print the html returned or something more intelligent to see if it's a successful login page.
        print p.text
    
        # An authorised request.
        r = s.get('A protected web page url')
        print r.text
            # etc...
    
        3
  •  34
  •   Tarun Venugopal Nair    10 年前

    让我试着让它变得简单,假设站点的URL是 http://example.com/ 假设您需要填写用户名和密码来注册,那么我们转到登录页面 http://example.com/login.php 现在,查看它的源代码并搜索操作URL,它将以类似于

     <form name="loginform" method="post" action="userinfo.php">
    

    现在使用userinfo.php创建绝对URL,它将是 http://example.com/userinfo.php ,现在运行一个简单的python脚本

    import requests
    url = 'http://example.com/userinfo.php'
    values = {'username': 'user',
              'password': 'pass'}
    
    r = requests.post(url, data=values)
    print r.content
    

    我希望有一天这能帮助别人。

        4
  •  5
  •   DBMage David    7 年前

    找出网站表单上用户名输入的名称 <...name=username.../> 和密码 <...name=password../> 并在下面的脚本中替换它们。同时替换URL以指向要登录的所需站点。

    #!/usr/bin/env python
    
    import requests
    from requests.packages.urllib3.exceptions import InsecureRequestWarning
    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
    payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
    url = 'https://website.com/login.html'
    requests.post(url, data=payload, verify=False)
    

    使用 disable_warnings(InsecureRequestWarning)

    额外:

    要在基于UNIX的系统上从命令行运行此脚本,请将其放在目录中,即。 home/scripts 并将此目录添加到 ~/.bash_profile

    # Custom scripts
    export CUSTOM_SCRIPTS=home/scripts
    export PATH=$CUSTOM_SCRIPTS:$PATH
    

    然后在内部创建指向此python脚本的链接 home/scripts/login.py

    ln -s ~/home/scripts/login.py ~/home/scripts/login
    

    关闭你的终端,启动一个新的,运行 login

        5
  •  1
  •   naaman    6 年前

    这个 requests.Session() 协助记录到具有CSRF保护的形式的溶液(用于烧瓶WTF形式)。检查是否 csrf_token 需要作为隐藏字段,并使用用户名和密码将其添加到负载中:

    import requests
    from bs4 import BeautifulSoup
    
    payload = {
        'email': 'email@example.com',
        'password': 'passw0rd'
    }     
    
    with requests.Session() as sess:
        res = sess.get(server_name + '/signin')
        signin = BeautifulSoup(res._content, 'html.parser')
        payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
        res = sess.post(server_name + '/auth/login', data=payload)