ПОЛУЧИТЬ страницу через сокет python3 - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь получить страницу через прокси-сокет в Python 3. Сначала я подключаюсь к прокси, указанному в https://sslproxies.org, а затем отправляю запрос GET:

GET https://icanhazip.com HTTP/1.1\r\n

Но выдает ошибку:

HTTP Bad Request 400 (данные недействительны)

Поэтому я попытался избежать параметра Host с помощью HTTP/1.0, но это также не сработало.

Какой запрос работает?

Полный код:

import socket

s = socket.socket()
host = "xx.xx.xx.xx"
port = 80
s.connect((host, port))
s.sendall("GET https://icanhazip.com HTTP/1.0\r\n".encode("utf-8"))

res = s.recv(10000)
while len(res) > 0:
    print(res)
    res = s.recv(10000)

1 Ответ

0 голосов
/ 29 мая 2018

Сервер правильный: вы отправляете неверный запрос.К сожалению, в вашем запросе много неправильного, что означает, что не существует простого простого решения.Определенно неправильно:

  • Отсутствует разделитель конца заголовка (т. Е. Пустая строка \r\n).
  • Нет заголовка Host, который требуется для HTTP/1.1 (как вы используете в своем примере, как выглядит запрос) и не требуется стандартом, но все же требуется большинством серверов с HTTP / 1.0 (как вы используете в своем реальном коде).
  • Вы не можетепросто укажите в запросе https:// url и предположите, что он будет волшебным образом использовать https.Вместо этого вам нужно подключиться к серверу, к рукопожатию SSL, а затем отправить правильный HTTP-запрос, который содержит только путь, но не полный URL-адрес.При подключении к прокси-серверу (как вы, похоже, пытаетесь) вам даже нужно добавить некоторый запрос CONNECT и прочитать его ответ, прежде чем обновлять сокет до SSL.
  • Предполагается, что вы можете использовать порт 80 для HTTPS,но его порт 443 по умолчанию, но при подключении к прокси вы фактически используете один и тот же порт для HTTP и HTTP, хотя обычно это что-то вроде 8000, 8080 или аналогичное.
  • И, возможно, больше.

Вкратце: используйте библиотеку HTTP.Если вы не хотите использовать один из них, изучите стандарт HTTP и не просто смотрите на примеры (если вы даже делали это до сих пор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...