Python socket 웹 사이트 방문 HTTP POST 요청 보 내기

3896 단어 네트워크Python
가장 원시 적 인 패키지 socket 으로 웹 사 이 트 를 방문 하여 POST 요청 을 모 의 전송 할 수 있 습 니 다. 보 낸 문자열 이 HTTP 프로 토 콜 에 부합 하기 만 하면 가장 큰 수확 입 니 다.진일보 한 참고https://www.jianshu.com/p/f196c74e72dd
import socket
input_dict = {'name':'cheng', 'age':23}

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.56.101', 8082))

아 날로 그 POST 요청 Case 1:
s.send('POST /myself_login/ HTTP/1.1\r
Host:192.168.56.101:8082\r
Content-Type:application/x-www-form-urlencoded\r
username:administartor\r
password:start01a\r
Connection:close\r
\r
')

Case 2: 다음 요청 의 문자열 은 브 라 우 저 를 캡 처 하여 로그 인 페이지 에 접근 하여 사용자 이름과 비밀 번 호 를 동시에 입력 할 때의 POST 패키지 입 니 다.
s.send('POST /myself_login/ HTTP/1.1\r
Host: 192.168.56.101:8082\r
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r
Accept-Encoding: gzip, deflate\r
Referer: http://192.168.56.101:8082/myself_login/\r
Content-Type: application/x-www-form-urlencoded\r
Content-Length: 34\r
Connection: keep-alive\r
Cookie: csrftoken=uz8SRQan48GXYbidToOP7QGyDFoMTuGEiJDQiKql0b4cRB8X86OCAMIvzHzkXUZk; sessionid=3axevcp707rdia0jbiedo1dh09zaxvxe; rob_testcookie=robert\r
Upgrade-Insecure-Requests: 1\r
\r
username=administartor&password=start01a')

case 3: 사실 그렇게 많은 내용 을 쓰 지 않 고 Host / Content - Type / Content - Length 만 있 으 면 된다 는 것 을 알 게 되 었 습 니 다. Content - Length 가 없 으 면 Django 백 엔 드 는 body 를 해석 하지 않 거나 해석 하지 못 합 니 다.(send 의 내용 에 따 르 면 setting. py 에 django. middleware. csrf. csrf. csrf ViewMiddleware 가 주석 을 열 고 요청 을 성공 적 으로 보 내 려 면 \ rX - CSRFtoken: abcd \ rCookie: csrftoken = abcd 는 Django csrf 원리 에서 알 수 있 듯 이 crsf 의 값 은 X - CSRFtoken 과 쿠키 의 csrftoken 이 일치 하면 마음대로 작성 할 수 있 습 니 다)
s.send('POST /myself_login/ HTTP/1.1\r
Host: 192.168.56.101:8082\r
Content-Type: application/x-www-form-urlencoded\r
Content-Length: 34\r
\r
username=administartor&password=start01a') print '----------' buffer = [] while True: d = s.recv(1024) if d: buffer.append(d) else: break data = ''.join(buffer) s.close() header, html = data.split('\r
\r
', 1) print 'Response Header is:' print header with open('sina.html', 'wb') as f: f.write(html)
           case 1    : 
s.send('POST /myself_login/ HTTP/1.1\r
Host:192.168.56.101:8082\r
Content-Type:application/x-www-form-urlencoded\r
username:admin\r
password:start01all\r
Connection:close\r
\r
') reqeust.META : if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') print 'request.body = {0}'.format(request.body) print 'request.POST = {0}'.format(request.POST) print 'request.META = {0}'.format(request.META) username = request.META.get('HTTP_USERNAME') password = request.META.get('HTTP_PASSWORD') root@robert-Ubuntu:~# python raw_socket.py Response Header is: HTTP/1.0 302 FOUND Date: Tue, 30 Jul 2019 03:09:25 GMT Server: WSGIServer/0.1 Python/2.7.12 Vary: Cookie X-Frame-Options: SAMEORIGIN Content-Type: text/html; charset=utf-8 Location: http://192.168.56.101:8082/hello name: ==robert=== Set-Cookie: sessionid=wxnc3franlzrqrx1huawdmvei9c3qhsk; expires=Tue, 13-Aug-2019 03:09:25 GMT; httponly; Max-Age=1209600; Path=/ Set-Cookie: rob_testcookie=robert; Path=/ root@robert-Ubuntu:~#

영감:https://www.liaoxuefeng.com/wiki/897692888725344/923056653167136

좋은 웹페이지 즐겨찾기