• 목록
  • 아래로
  • 위로

안녕하세요?


requests를 이용하여 POST로 multipart/form-data 전송을 하려고 하는데요.


예로 들 수 있는 사이트가 마땅하지 않아서 부득이 스포어에 파일을 업로드했을 때 개발자도구의 Requests header를 예로 들어 질문드리겠습니다 ^^



[Requests header]


  1. :authority: studyforus.com

  2. :method: POST

  3. :path: /index.php

  4. :scheme: https

  5. accept: */*

  6. accept-encoding: gzip, deflate, br

  7. accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

  8. content-length: 6051402

  9. content-type: multipart/form-data; boundary=----WebKitFormBoundaryHuF3DiVfQquXgAtB

  10. cookie: _f_=20190331151047; _ga=GA1.2.1465693216.1555800735; em_cdn_uid=t%3D1570157398541%26u%3Dc6e0d214e01f4b63b569e65355f6369c; em_p_uid=l:1576558688928|t:1570881221609|u:2f3327beebcb435da9a71713a91382f7; PHPSESSID=0e8f5250h4gk3sb12isro4hu73; rx_uatype=rE1qamI9vminnwqB1gBh6Q%3A0; rx_sesskey1=nrtR9A9tk4J21aGWkUl7lZFE; rx_sesskey2=XBtWzJITQmAaVIiLRbkZkIOO; arp_scroll_position=0

  11. dnt: 1

  12. origin: https://studyforus.com

  13. referer: https://studyforus.com/index.php?mid=humor&act=dispBoardWrite

  14. sec-fetch-mode: cors

  15. sec-fetch-site: same-origin

  16. user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36



[Form data]

  1. vid: null

  2. mid: humor

  3. act: procFileUpload

  4. upload_target_srl: false

  5. editor_sequence: 1

  6. Filedata: (binary)



다른 것은 그대로 복붙해서 headers에 넣어주면 될 것 같은데요.


(1) cookie는 requests.Session()을 이용하면 headers에서는 굳이 작성할 필요가 없는 것 맞는지요?


(2) content-length는 str(os.path.getsize('파일명')) 이런 식으로 처리하는데 적절하지 모르겠네요.


(3) content-type이 가장 문제가 되는 것 같네요 ㅠㅠ


https://indesire.tistory.com/42

https://stackoverflow.com/questions/12385179/how-to-send-a-multipart-form-data-with-requests-in-python


위 글을 참고하니 MultipartEncoder라는 것을 사용하면 되는 것 같은데요.


제가 이해한 바로는 다음과 같이 Form data에 있는 것을 그대로 긁고 Content-type을 추가하여 MultipartEncoder에 넣은 값을 data 값에 넣고,


headers에는 위 값을 복붙하여 'Content-Type': m.content_type을 추가하면 되는 것 같은데요.





m = MultipartEncoder(

    fields={

  1. 'vid': 'null',

  2. 'mid': 'humor',

  3. 'act': 'procFileUpload',

  4. 'upload_target_srl': 'false',

  5. 'editor_sequence': '1',

'Content-Type': ('filename', open('파일명', 'rb'))

        }

    )


upload = s.post(URL, data=m, headers=headers)





제가 어디에서 실수를 했는지 모르겠지만 파일전송이 안 되는 것 같은데요.


대략적인 방법이나 다른 방법을 알려주시면 감사하겠습니다!


그럼 즐겁고 뜻깊은 연말 되시고 감기 조심하세요 ^^


작성자
이니스프리 119 Lv. (0%) 1894870/115200000EXP

Make StudyForUs Great Again!

 

CSVpuymXAAAVVpd.jpg

댓글 4

title: 황금 서버 (30일)humit
profile image

(1) Session으로 로그인 요청을 보낸 적이 있다면 따로 cookie를 명시해주지 않아도 될 것 같네요.

 

(2) Content-Length 부분의 경우 requests가 알아서 계산을 해주기 때문에 명시해주지 않아도 됩니다.

 

(3) requests 에서는 파일 업로드가 쉽습니다. 아래와 같이 사용하면 됩니다.

requests.post('https://studyforus.com/index.php', headers={'Cookie': cookie}, data={'vid':'null', 'mid':'help', 'act':'procFileUpload','upload_target_srl': 'false', 'editor_sequence':1}, files={'Filedata':open(파일경로, 'rb')}).content

comment menu
2019.12.25. 13:52

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

연말이라 바쁘실텐데 답변해주셔서 감사합니다 ^^

우리가 웹 서핑을 할 때 브라우저가 엄청난 일들을 하고 있는 것이었군요!

브라우저가 수행하는 GET, POST 요청을 저같은 초보가 구현하려고 하니 잘 안 되네요 ㅠㅠ

 

말씀해주신 (3)번 방법대로 테스트해보려고 with requests.Session() as s: 으로 로그인하여 로그인 된 것은 확인한 후에

upload = s.post('https://studyforus.com/index.php', data={'vid':'null', 'mid':'help', 'act':'procFileUpload', 'upload_target_srl': 'false', 'editor_sequence':'1'}, files={'Filedata':open('파일명', 'rb')}).content

XE/RXE 계열의 몇몇 사이트에서 이런 방식으로 시도해봤는데 에러를 반환하거나 빈 문자열을 반환하네요 ㅠㅠ

세션이 유지되고 있으니 쿠키는 따로 헤더에 넣어줄 필요는 없을 것 같은데, 제가 어디를 잘못 처리했는지 모르겠네요.

 

content-type: multipart/form-data; boundary=----WebKitFormBoundaryKUMwOuSfPKanezmz

그런데 헤더의 content-type에서 "KUMwOuSfPKanezmz" 이 부분은 파일 데이터의 구분자로 기능하기 때문에 MultipartEncoder 등을 이용하여 제가 직접 붙여줘야 되는 것 아닌가요?

 

그럼 남은 휴일 즐겁게 보내시고, 뜻깊은 연말 되세요!!

번번이 웹 공부에 큰 도움을 주셔서 진심으로 감사드립니다~ ^^

comment menu
2019.12.25. 15:41

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

title: 황금 서버 (30일)humit → 이니스프리
profile image

1. content-type 부분의 경우 requests 부분에서 알아서 처리를 해주므로 따로 신경쓸 필요가 없습니다.

2. 빈 문자열이 리턴되는 이유는 모르겠네요.... 일단 스포어 홈페이지에서는 PHPSESSID 만 있더라도 잘 동작하는 것 같더라고요.. 혹시 한번 로그인 요청을 보낸 다음 글쓰기 페이지로 이동하는 코드를 추가해보시는 건 어떨까요?

comment menu
2019.12.25. 16:00

신고

"humit님의 댓글"

이 댓글을 신고 하시겠습니까?

이니스프리 작성자 → humit
profile image

앗 그렇군요!! humit 님 덕분에 많은 것을 배웠네요 :)

requests는 정말 엄청난 라이브러리이군요 ㅎㄷㄷ

말씀해주신 방법대로 계속 시도하다보니 POST 전송이 되네요~

다만 같은 스크립트를 반복해서 실행해보니 editor_sequence 값 때문인지 잘 될 때가 있고, 안 될 때가 있네요.

그럼 저녁식사 맛있게 드세요~

감사합니다 ^-^

comment menu
2019.12.25. 17:16

신고

"이니스프리님의 댓글"

이 댓글을 신고 하시겠습니까?

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
공지 [작업 완료] 설 명절 맞이 서버 업데이트 안내 3 마스터 24.02.11.17:21 652
공지 [중요] 호스팅 만료와 관련하여 일부 수칙이 변경됩니다. 4 마스터 23.01.14.02:23 4330
공지 [필독] 질문하는 방법 17 마스터 18.02.23.03:09 4474
662 파이썬 에디터로 어떤 것이 좋나요? 14 NoYeah 20.01.08.21:08 4532
661 이미지 외부링크가 엑박으로 나온다면 어느 부분을 우선적으로 검토해야 될까요? 이니스프리 20.01.05.23:15 549
660 해상도는 다르지만 동일한 이미지인지 체크하는 방법이 있을까요? 2 이니스프리 20.01.05.20:52 511
659 Beautifulsoup에서 .find(text=True, recursive=False)과 관련하여 질문 드립니다. 2 이니스프리 20.01.03.23:11 1147
658 [Selenium] 특정 XPath에서 parent 노드의 iframe을 알아낼 수 있을까요? 2 이니스프리 20.01.02.16:04 393
657 [파이썬] 윈도우에서 pip install로 모듈 설치시에 문제가 발생하는 것과 관련하여 질문 드립니다 2 이니스프리 19.12.29.00:51 248
656 여러 개의 반복작업을 켜고 끄는 버튼을 비동기적으로 구현해보려고 하는데요 ㅠㅠ 2 이니스프리 19.12.27.23:10 200
655 유튜브 채널 주소 잘아시는분있나요? 2 슬기 19.12.27.09:55 187
654 Requests나 Selenium에서 어떤 XHR 전송이 있었는지 확인할 수 있는 방법이 있을까요? 3 이니스프리 19.12.26.18:47 226
653 카고야 VPS에서 메일이 왔는데 일본어 관련해서 질문 드립니다. 5 이니스프리 19.12.26.11:45 200
652 [파이썬] 결과를 print 문으로 출력하는 것과 파일로 출력하는 것과 결과가 왜 다른가요? 8 image 이니스프리 19.12.25.13:19 770
651 음성번역기 앱 중에 켜놓으면 계속 번역을 해주는 앱이 있을까요? 이니스프리 19.12.25.11:16 215
650 https://imgnbvip.com/ 라는 이미지 호스팅 사이트가 있나요? image 이니스프리 19.12.24.11:08 267
649 Google Developer Console의 API 라이브러리 무료 이용에 대해 질문 드립니다. 5 image 이니스프리 19.12.23.12:58 198
648 부산 맛집 추천 부탁드려요~! 3 image 이니스프리 19.12.20.19:00 174
[Requests] multipart/form-data의 전송에 대해 질문 드립니다 ^^ 4 이니스프리 19.12.18.22:00 2972
646 프로그래머스 코딩테스트 연습에서 효율성 심사를 통과하려면 어떻게 해야할까요? 2 이니스프리 19.12.18.01:55 2867
645 논논비요리 만화책을 보려고 하는데 일본어를 얼마나 공부해야 될까요? 4 image 이니스프리 19.12.15.16:38 460
644 머신러닝 오프라인 강좌를 수강해보려고 하는데요~ 이거 괜찮을까요? 5 image 이니스프리 19.12.11.03:12 314
643 프로그래머스의 코딩테스트 연습과 COS PRO 난이도에 대해 질문 드립니다. 5 이니스프리 19.12.08.22:26 441