如何使用';请求';在Python中(GET/POST)-409冲突 通过本网站登录的正确方式是什么?

如何使用';请求';在Python中(GET/POST)-409冲突 通过本网站登录的正确方式是什么?,python,pyqt,python-requests,python-multithreading,Python,Pyqt,Python Requests,Python Multithreading,我想使用请求模块登录 到目前为止,我已经做到了: #!/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

我想使用
请求
模块登录

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

#!/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()
我这样初始化它:

stweb = StudentsWebSession(db.get('studentsweb', {}).get('url'),
                           db.get('studentsweb', {}).get('url_after'),
                           self.extract_username_from_email(),
                           self.form_password.text())
stweb.start()
其中
db
是一个包含所有所需信息的字典

  • db.get('studentsweb',{}).get('url')
  • db.get('studentsweb',{}).get('url\u after')
结果,我收到了一个标题如下的HTML文档(409HTTP代码)

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

以下是上述请求的演示:

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


如果您需要更多信息,请毫不犹豫地询问。

您如何初始化
studentswebession
并调用
.get()
?假设
self.payload
None
,并且它使用
中定义的
self.payload
,如果
.get
,则:

  • “submit1”
    应该是
    “Εί∑οΔς”
    ,而不是
    “%C5%DF%F3%EF%E4%EF%F2”
    。但由于“%C5…”已进行表单编码,并且您希望将其与表单数据一起发送,为了防止requests.post再次对其进行表单编码,请发送:

    有时您可能希望发送未进行表单编码的数据。如果您传入一个字符串而不是dict,则该数据将直接过帐

    例如,GitHub API v3接受JSON编码的POST/PATCH数据:

  • 不要在
    标题\u post\u one
    中指定“内容长度”

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

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

    设置Cookie:rcva%5F=fcdb7353daffb81c0dbdf61bd76cbbb0b4b6d6e39bc7381bedb8a79416cbe4e9e16b9a45abbe6175e103d0ccbbb848af2c4000c03db2744cafffaa7d6731a538dc737ce33d5a2b443e4cef01911d08512b74c7062854f0879373737793e1b927f837f8f318cad3ec03ec039999797c7f837b737f318f318f318f318b7f318f318b7f317f317f318b7f317f317f317f317f317f317f317f317f;路径=/

    和被发送的那个

    Cookie:ASPSESSIONIDCWCQTDDT=cinllkkbnlnbkmoppkcfh;rcva%5F=FCDB7353DAFB81C0DBDF61BD76CBBB0B4B6D6E39BC7381BEDB8A79416CBE4E9EEF49F13C3FD75EBFCE526F8984772FCB4A39EE0A356CAFD81050CAE03092E7AF2A56EBEBE06AB9F405A1AABBC521DEF74668744D666327E2F0CEB17EC3757623A074457FF457A197DC38CA680CA44C3677E468B1988B9B3680B4F468B4B4F468B8B4F468B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4B4

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

    c4134bbd3f648974b8ecdc237b5ebe2fd:FCDB7353DAFB81C0DBDF61BD76CBBB0BD085AD5A217BAD80C33CC6A27FDAD06DC7E81968BCC5C18767860BB38E4285D9E02BEE0FDFF9C7B133FAC04ED88B30386B94083AB20C44C4CB94CA067CC376892B9F9E75BF72B28BCD39D19CC818

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

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

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


  • 这并没有提供登录所需的所有信息,但您必须首先进行上述更改,然后查看您的信息来源。

    我编辑了我的问题并添加了所需的信息。我简直无法理解这个
    c4134bbd3f648974b8ecdc237b5ebe2fd
    从何而来。如何检测/捕获负责此操作的JS文件?如果我这样做,我可以模拟这个JS的功能来生成这些cookie?谢谢除了像angular和jquery这样的库导入之外,还有
    app.js
    ,它似乎没有太多内容。html中还包含一些模糊的js。看看您是否成功地正确设置了所有其他内容(除了那些cookie)。否则,您需要使用browser/selenium.Wrt“如果我这样做,我可以模拟这个JS的功能来生成这些cookies?”是的,您应该能够。登录后,无法确定其他页面会做什么。如果你正在收集不应该收集的数据(学生网站),那么我认为站长不会帮你。如果没有,你可以问问写它的人。我使用
    drysrape
    库成功地从那里刮取了数据。我还试着用selenium(phantomjs,铬合金无头)成功地刮了刮。我不想使用这些方法的原因是
     <title>409 Conflict</title>
    
    >>> import json
    
    >>> url = 'https://api.github.com/some/endpoint'
    >>> payload = {'some': 'data'}
    
    >>> r = requests.post(url, data=json.dumps(payload))