如何在Python(GET/POST)409confi中使用“requests”成功登录

2024-10-02 04:29:35 发布

您现在位置:Python中文网/ 问答频道 /正文

通过这个网站登录的正确方法是什么?在

我想使用requests模块登录here。在

到目前为止,我已经做到了:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets

import requests
from utils.user_agents import get_random_user_agent


class StudentsWebSession(QtCore.QThread):

    def __init__(self, url, _url=None, username=None, password=None, payload=None):
        QtCore.QThread.__init__(self)
        self.session = requests.Session()
        self.ua = get_random_user_agent('desktop')
        self.headers_get_one = {
            'host': 'studentsweb.teimes.gr',
            'user-agent': self.ua,
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'accept-language': 'en-US,en;q=0.5',
            'accept-encoding': 'gzip, deflate, br',
            'connection': 'keep-alive',
            'upgrade-insecure-requests': '1'
        }
        self.headers_post_one = {
            'host': 'studentsweb.teimes.gr',
            'user-agent': self.ua,
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'accept-language': 'en-US,en;q=0.5',
            'accept-encoding': 'gzip, deflate, br',
            'referer': 'https://studentsweb.teimes.gr/unistudent/login.asp',
            'content-type': 'application/x-www-form-urlencoded',
            'connection': 'keep-alive',
            'upgrade-insecure-requests': '1'
        }
        self.headers_get_two = {
            'host': 'studentsweb.teimes.gr',
            'user-agent': self.ua,
            'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'accept-language': 'en-US,en;q=0.5',
            'accept-encoding': 'gzip, deflate, br',
            'referer': 'https://studentsweb.teimes.gr/unistudent/login.asp',
            'connection': 'keep-alive',
            'upgrade-insecure-requests': '1'
        }
        self.url = url
        self._url = _url
        self.username = username
        self.password = password
        self.payload = payload

    def __del__(self):
        self.wait()

    def get(self):
        with self.session as s:
            if not self.payload:
                self.payload = {
                    'userName': self.username,
                    'pwd': self.password,
                    'submit1': 'Login',
                    'loginTrue': 'login'
                }

            r = s.get(self.url, headers=self.headers_get_one,
                      params={'lang': 'en-us'})
            print(r.content.decode('cp1253'))
            #print(r.url)

            r = s.post(self.url, headers=self.headers_post_one,
                       data=self.payload)
            #print(r.content.decode('cp1253'))
            #print(r.url)

            #r = s.get(self._url, headers=self.headers_get_two)
            #print(r.content.decode('cp1253'))
            #print(r.url)

    def run(self):
        self.get()

我这样初始化它:

^{pr2}$

其中db是一个包含所有所需信息的字典。在

结果,我收到了一个标题如下的HTML文档(409http代码)

 <title>409 Conflict</title>

我认为您必须执行一个简单的GET请求来存储cookies,然后使用所有必需的有效负载、头和cookies执行POST请求。然后,执行GET请求以接收所需的结果。在

以下是上述要求的证明:

First Part

Second Part

我不喜欢使用selenium、headless浏览器以及非线程安全库

如果你需要更多的信息,请不要犹豫去问他们。在


Tags: selfurlgetapplicationxmlrequestsenheaders
1条回答
网友
1楼 · 发布于 2024-10-02 04:29:35

如何初始化StudentsWebSession并调用.get()?假设self.payloadNone,它使用if中定义的self.payload,那么:

  1. 'submit1'应该是'Είσοδος',而不是{}。但由于“%C5…”已经是表单编码的,因此您希望将其与表单数据一起发送,以防止请求.post从表单中再次对其进行编码,发送payload as a string

    There are times that you may want to send data that is not form-encoded. If you pass in a string instead of a dict, that data will be posted directly.

    For example, the GitHub API v3 accepts JSON-Encoded POST/PATCH data:

    >>> import json
    
    >>> url = 'https://api.github.com/some/endpoint'
    >>> payload = {'some': 'data'}
    
    >>> r = requests.post(url, data=json.dumps(payload))
    
  2. 不要在headers_post_one中指定“content length”。

  3. 当您执行with requests.Session() as s:操作时,一旦登录完成,会话就会丢失。将其作为with ... as self.session:,并在以后的请求中使用self.session

  4. 当发布完成后,一个随机的cookies似乎正在设置中。它是由js在表单submit上生成的。您需要查看它并重新创建cookie并将其与post请求一起发送。而且,它不是您在GET表单中得到的rcva_cookie。只有前64个字符匹配:

    Set-Cookie:rcva%5F=FCDB7353DAFB81C0DBDF61BD76CBBB0B4B6D6E39BC7381BEDB8A79416CBE4E9E16B9A45ABBE6175E103D0CCBBB848AF2C4000C03DDB27444CAFFBFAA7D6D6731A538DC737CE33D5A2B443E4CEF01911D08512B74B2C7062854F0857937DB92793E1FAE8518917CAD3EC03997942C7DB3FEBDD27840ECFF697EFDA93CC6CCF80A83F3A8487917131301BF32EF1B9E36CF; path=/

    与发送的那个。。。在

    Cookie:ASPSESSIONIDCWCQTDDT=CINLLKKBNLNBKMPOMCPPKCFH; rcva%5F=FCDB7353DAFB81C0DBDF61BD76CBBB0B4B6D6E39BC7381BEDB8A79416CBE4E9EEF49F13C3FD75EBFCE526F8984772FCB4A39EE0A3563DCAFD81050CAE03092E7B0AF2A5ABB6EBE0CADF06AB9F405A1AABBC521DEF74668744D66327E2F0C6CEB17EC3757B623A057444FF457A13D97DC7438CA446840E71C358E5D1F942566602B3E31061989C8DC5A7F1F846A0680BD

  5. 另外,发送的表单数据也有一部分cookie具有随机生成的名称,并且只有前32个字符匹配:

    c4134bbd3f648974b8ecdc237b5ebe2fd:FCDB7353DAFB81C0DBDF61BD76CBBB0BD085AD5A217BAD80C33CC6A27FDAD06DC7E81968BC5C18767860BB38E4285D9A9E02BEE0FDFF9C7B133FAC5FE6BFAC04ED88B3038686B94083AB20C44C9CB94CA067CC376892B9F9E91514A73C659E5BD05BF72B2DC8BCD5AD399D191CC58818

  6. 不要执行self.cookies = r.cookies,因为请求将管理该会话中的cookie(通过重新发送接收到的cookie)。您也不需要显式地提供它,除非您想添加一个单独的cookie,并且应该只包含这些项(以前收到的cookie无论如何都会被发送)。在

    注意:提交表单时,您需要弄清楚js是如何设置cookies的。然后用Python或者…使用selenium/或其他无头浏览器重新创建它——你说过你不喜欢这样做。

  7. 表单数据中的'lang': 'en-us'可能没有预期的效果,可能会导致错误。要设置网站的方式,请在每个请求中为页面设置参数:r.get(... params={'lang': 'en-us'} ...)。当您这样做时,'submit1'应该是{},对于上面的1。

这并不能提供您登录所需的所有信息,但您必须首先进行上述更改,然后再查看您的位置。在

相关问题 更多 >

    热门问题