Форум программистов, компьютерный форум CyberForum.ru

Python: Сети

Войти
Регистрация
Восстановить пароль
 
Albaz
-116 / 2 / 0
Регистрация: 31.05.2013
Сообщений: 363
#1

Создать http запрос используя socket - Python

01.02.2017, 18:56. Просмотров 321. Ответов 5
Метки нет (Все метки)

Как используя только socket-либ создать полноценный заголовок - протокол, юзерагент и тд... В общем, интересуют только низкоуровневые варианты.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import socket
 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print socket.gethostbyname('2ip.ru')
print socket.gethostbyaddr('127.0.0.1')
sock.connect(('2ip.ru', 80))
sock.send("HEAD / HTTP/1.0\n") # вот тут тормозит
 
data = sock.recv(1024)
sock.close()
 
udata = data.decode("utf-8")
print udata
input()
Добавлено через 7 часов 37 минут
В общем все дело в
Python
1
("\r\n")
, вернее в
Python
1
sock.send("\r\n")
Но почему-то косо работает, зависит от
Python
1
sock.send("Host: google.ru \r\n")
Код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket
 
sock = socket.socket()
print socket.gethostbyname('2ip.ru')
print socket.gethostbyaddr('127.0.0.1')
sock.connect(('google.ru', 80))
sock.send("GET / HTTP/1.1 \r\n")
sock.send("Accept: */*")
sock.send("Accept-Language: ru \r\n")
sock.send("User-Agent: HTTPClient \r\n")
#sock.send("Host: google.ru \r\n")
sock.send("\r\n")
data = sock.recv(1024)
sock.close()
 
udata = data.decode("utf-8")
print udata
input()
выдает в консоли:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
HTTP/1.1 302 Found
 
Cache-Control: private
 
Content-Type: text/html; charset=UTF-8
 
Location: [url]http://www.google.ru/?gfe_rd=cr&ei=dQGSWMOXEs3EZMzrlYgJ[/url]
 
Content-Length: 256
 
Date: Wed, 01 Feb 2017 15:40:37 GMT
 
 
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.ru/?gfe_rd=cr&amp;ei=dQGSWMOXEs3EZMzrlYgJ">here</A>.
 
</BODY></HTML>
Если же включить
Python
1
sock.send("Host: google.ru \r\n")
, то итог в ссылке будет иным.
Вот какой скрипт:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import socket
 
sock = socket.socket()
print socket.gethostbyname('2ip.ru')
print socket.gethostbyaddr('127.0.0.1')
sock.connect(('google.ru', 80))
sock.send("GET / HTTP/1.1 \r\n")
sock.send("Accept: */*")
sock.send("Accept-Language: ru \r\n")
sock.send("User-Agent: HTTPClient \r\n")
sock.send("Host: google.ru \r\n")
sock.send("\r\n")
data = sock.recv(1024)
sock.close()
 
udata = data.decode("utf-8")
print udata
input()
дает итог:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
HTTP/1.1 301 Moved Permanently
 
Location: [url]http://www.google.ru/[/url]
 
Content-Type: text/html; charset=UTF-8
 
Date: Wed, 01 Feb 2017 15:47:33 GMT
 
Expires: Fri, 03 Mar 2017 15:47:33 GMT
 
Cache-Control: public, max-age=2592000
 
Server: gws
 
Content-Length: 218
 
X-XSS-Protection: 1; mode=block
 
X-Frame-Options: SAMEORIGIN
 
 
 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.ru/">here</A>.
 
</BODY></HTML>
Т.е. меняется ссылка
HTML5
1
<A HREF="http://www.google.ru/">here</A>
на
HTML5
1
<A HREF="http://www.google.ru/?gfe_rd=cr&amp;ei=dQGSWMOXEs3EZMzrlYgJ">here</A>
Ну и в любом случае, полноценную страницу № 200 так и не удается получить...


Да, и из аргумента
Python
1
sock = socket.socket()
выкинул всякие там
Python
1
(socket.AF_INET, socket.SOCK_STREAM)
без к-либо изменений. Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.02.2017, 18:56     Создать http запрос используя socket
Посмотрите здесь:

Python Проблемы с модулем socket
socket & HTTP: отправка нетекстового файла Python
Python Как через модуль socket с сервера считать в клиент строку?
Email socket API Python
Python Python socket telnet, потоки и ответ сервера
Python Правильный socket send и json
Реализовать чтение данных ИБП Ippon через serial socket Python
Python Windows socket server python + socket client js
Python Синхронизация файлов с http сервера
C# Как отправить запрос по https, используя socket()?
HTTP. Python 27 Python

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Albaz
-116 / 2 / 0
Регистрация: 31.05.2013
Сообщений: 363
02.02.2017, 22:07  [ТС]     Создать http запрос используя socket #2
Что то тихо совсем))
Порассуждаем сам - на -сам))
Что то и с почтой не получается...
Python
1
2
3
4
5
6
7
8
9
10
import socket
 
sock = socket.socket()
sock.connect(('pop3.mail.ru', 110))
sock.send("\r\n")
data = sock.recv(1024)
udata = data.decode("utf-8")
print udata
sock.close()
input()
Результат:
Bash
1
2
>>> 
+OK
Очень скромненький, хотя и положительный... А дальше никакие команды USER PASS не работают((
Avazart
03.02.2017, 21:19
  #3

Не по теме:

Цитата Сообщение от Albaz Посмотреть сообщение
Что то тихо совсем))
Во первых через сокеты это изврат, во вторых у вас репа минусовая так что не удивляйтесь.

null_0
1 / 1 / 0
Регистрация: 09.10.2016
Сообщений: 28
Завершенные тесты: 2
12.02.2017, 21:04     Создать http запрос используя socket #4
Avazart,
Цитата Сообщение от Avazart Посмотреть сообщение
через сокеты это изврат
А через что, простите?
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,058
Записей в блоге: 17
12.02.2017, 21:25     Создать http запрос используя socket #5
Цитата Сообщение от null_0 Посмотреть сообщение
А через что, простите?
requests, curl ?
Вованя
122 / 122 / 47
Регистрация: 20.02.2014
Сообщений: 433
18.02.2017, 17:54     Создать http запрос используя socket #6
Albaz, RFC SNMP, RFC HTTP
Yandex
Объявления
18.02.2017, 17:54     Создать http запрос используя socket
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru