繁体   English   中英

使用python请求通过ajax json发布登录网站

[英]Use python requests to login to website using ajax json post

我是python的新手,无法生成使用python请求登录网站的正确代码。

网站上的表格代码

   <form autocomplete="off" class="js-loginFormModal">
                                        <input type="hidden" class="js-      redirect" name="redirect" value="bn_vLe6OsoRXl4E4LEaOwGkUCvazta7iTkG81ShqumA."    />
                        <input type="hidden" name="token" id="token"       value="MTQ4OTg2MzYwMzCaZm653OAL-mKayzhg_4wCyEBXDqZBQUJxdbLLF-   foi6EdPeKBgIVz97pUew9YgKPmxiW2NDzrAewdtIJWrBM." />
                        <input type="hidden" name="remember_me" value="1" />
                        <input type="hidden" name="from"       value="pc_login_modal_:login">

                <div class="leftSide floatLeft loginColumnLeft-en">
                    <p class="signinError" style="display:none;"></p>
                    <p id="signinLoggingin" style="display:none;">Logging in...</p>
                    <div><input id="usernameModal" placeholder="Username (6+ characters)" class="js-signinUsernameModal signup_field" name="username" maxlength="50" type="text" value=""></div>
                    <div><input id="passwordModal" placeholder="Password (6+ characters)" class="js-signinPasswordModal signup_field" name="password" type="password" value=""></div>
                    <div class="loginAccessRemember">
                        <input type="checkbox" checked id="signinRemember" />
                        <label for="signinRemember">Remember me on this computer<br />
                            <span class="loginAccessRememberInfo">(not recommended on public or shared computers)</span>
                        </label>
                    </div>
                    <div id="signinSubmit" class="orangeButton buttonBase js-loginSubmitModal">Login</div>
                    <div class="leftCol">
                        <ul>
                            <li>
                                                            <li><a id="signinForgotpassword" href="/front/lost_password" onclick="ga('send', 'event', 'Login Page', 'click', 'Lost Password');">Forgot Username or Password?</a></li> |
                            <li><a id="signinConfirmationEmail" href="/front/resend_confirmation_email" onclick="ga('send', 'event', 'Login Page', 'click', 'Resend Confirmation');">Resend confirmation email</a></li>
                        </ul>
                    </div>
                </div>

                <div class="rightSide floatRight loginColumnRight-en">
                    <h2 class="loginAccessTitle-en">Not a free member yet?</h2>
                    <span class="loginAccessMessage loginAccessMessageRight">Here's what you're missing out on!</span><br /><br />
                    <ul class="clearfix">
                        <li><i class="mark registerSprite enabled"></i><span class="tab1">Download Videos</span></li>
                        <li><i class="mark registerSprite enabled"></i><span>Post Comments</span></li>
                        <li><i class="mark registerSprite enabled"></i><span class="tab3">Add Favorites</span></li>
                        <li><i class="mark registerSprite enabled"></i><span class="tab4">Create Playlists</span></li><br>
                        <li>And many more!</li>
                    </ul>
                    <br/><a class="buttonBase greyButton" id="signupButtonId" href="/create_account_select">Sign Up</a>
                </div>
            </form>

这是javascript“ js-loginFormModal”所引用的ajax语句

function loginAjax() {
  $j.ajax({
    type: "POST",
    url: "/front/authenticate",
    cache: false,
    dataType: "json",
    data: $j(".js-loginForm").serialize(),
    success: function(a) {
      if (a.premium_redirect_cookie == "0") {
        if (a.redirect) {
          document.location.assign(a.redirect)
        } else {
          $j(".signinError").show().text(a.message)
        }
      } else {
        $j.ajax({
          url: premiumRedirectCookieURL,
          cache: false,
          crossDomain: true,
          xhrFields: {
            withCredentials: true
          },
          success: function() {
            if (a.redirect) {
              document.location.assign(a.redirect)
            } else {
          $j(".signinError").show().text(a.message)
        }
      }
    })
  }
}
  });
  return false
}
head.ready(document, function() {
  var a = false;
  $j(".js-loginSubmit").on("click", function(b) {
    b.preventDefault();
    loginAjax()
  });
  $j("input.js-signinUsername, input.js-signinPassword").on("keydown",         function(b) {
    if (!a) {
      if (b.which == 13) {
        loginAjax()
      }
      a = true
    }
  });
  $j("input.js-signinUsername, input.js-signinPassword").on("keyup",     function(b) {
    if (a) {
      a = false
    }
  })
});

我当前的python代码(Python 2.6.6)给出的结果是“ {{message”:“会话超时-重新加载并重试”}“

#!/usr/bin/python 
from requests import Session
import requests

http_proxy  = "http://ip:3128"
https_proxy = "http://ip:3128"
ftp_proxy   = "http://ip:3128"

proxyDict = {
                  "http"  : http_proxy,
                  "https" : https_proxy,
                  "ftp"   : ftp_proxy
         }

session = requests.Session()
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    'Accept':     'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
payload = {
    'remember_me': '0', 
    'username': 'user', 
    'password': 'pass'
    } 
login_link = 'website/front/authenticate'
link = 'http://website'
login = session.post(url=login_link, data=payload, allow_redirects=True, headers=headers,proxies=proxyDict)

print (login.text)

response2 = session.get(url=link, headers=headers,proxies=proxyDict)

#print response2.content


#print(r2.text).encode('utf-8').strip() #TEXT/HTML
#print(r.status_code, r.reason)

我想我的有效负载中缺少东西。 我不知道是否需要将json指定为有效载荷的格式,或者是否必须序列化任何内容。

解决方法如下

#!/usr/bin/python
from requests import Session
import requests
import json
import re


http_proxy  = "http://ip:3128"
https_proxy = "http://ip:3128"
ftp_proxy   = "http://ip:3128"

proxyDict = {
                      "http"  : http_proxy,
                      "https" : https_proxy,
                          "ftp"   : ftp_proxy
             }

headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'en-US,en;q=0.8',
        'Connection': 'keep-alive',
        'Content-Length': '209',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Host': 'www.website.com',
        'Origin': 'http://www.website.com',
        'Referer': 'http://www.website.com/login',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest',
}


login_link = 'http://www.website.com/front/authenticate'
link = 'http://www.website.com/'

with requests.Session() as r:
        s = r.get(url=link, proxies=proxyDict)

        token = re.findall(r'token" value.*', s.text)[0]
        token = token.split('=')[1]
        token = token.split('"')[1]

        redirect = re.findall(r'redirect" value.*', s.text)[0]
        redirect = redirect.split('=')[1]
       redirect = redirect.split('"')[1]
        payload = {
                'loginpage': '1',
                'redirect': redirect,
               'token': token,
                'username': 'user',
                'password': 'pass'
        }

        login = r.post(url=login_link, data=payload, allow_redirects=True, headers=headers, proxies=proxyDict)

        print (login.content)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM