发送带有JSON请求的文件

时间:2019-09-22 19:24:58

标签: python json python-requests

我正在尝试将带有文本消息的文件发送到网页,但是我无法将文件发送到服务器。短信不是问题

使用登录名更新其他代码以对其进行测试。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup
import time
import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser()
browser.set_user_agent(
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36')

base_url = 'https://www.ebay-kleinanzeigen.de/'


def login():
    a = browser.open('https://www.ebay-kleinanzeigen.de/m-einloggen.html')
    time.sleep(2)
    browser.select_form('#login-form')
    browser['loginMail'] = 'testaccount@8.dnsabr.com'
    browser['password'] = 'testaccount'
    csrf_token = a.soup.find('input', {'name': '_csrf'})['value']
    print('crsf', csrf_token)
    browser.submit_selected()

    response = str(browser.get_current_page())
    soup = BeautifulSoup(response, 'html.parser')

    if 'angemeldet als:' in str(soup.find('span', {'id': 'user-email'})):
        print('Erfolgreich eingeloggt!')
        return csrf_token
    else:
        a = soup.find('div', {'class': 'outcomebox-warning l-container-row'})
        a = a.findNext('h2')
        print('ERROR:', a.contents[0])
        return False


crsf = login()



headers = {
    "accept": "application/json, text/javascript, */*; q=0.01",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7",
    "content-type": "multipart/form-data",
    "x-csrf-token": crsf,
    "x-requested-with": "XMLHttpRequest",
    "origin": "https://www.ebay-kleinanzeigen.de",
    "referer": "https://www.ebay-kleinanzeigen.de/m-nachrichten.html"
}

img_file = open('img.jpg', 'rb')

file = {'contents': img_file, 'filename': 'name.jpg', 'format': 'image/jpeg'}

payload = {
    'id': "8td:32br0sx:2ck88rzjt",
    'message': 'message'
}

res = browser.post('https://www.ebay-kleinanzeigen.de/m-nachricht-schreiben.json', json=payload, headers=headers, files=file)

我只收到500的响应代码,消息和图像文件没有发送。

这是来自浏览器的发帖请求: postdata

3 个答案:

答案 0 :(得分:2)

恰好在requests.post('https://www.url.json', payload, headers=headers, files=file)中,payload是一个字符串,因为json.dumps在这里返回了一个字符串:

payload = json.dumps(
    {
        'id': "ID",
        'message': 'message',
        'image': []
    }
)

您应该通过字典本身:

requests.post('https://www.url.json', {'id': "ID", 'message': 'message'}, headers=headers, files=file)

答案 1 :(得分:0)

我认为问题是json.dumps!有效负载应该是字典而不是字符串!因此,只需尝试删除该呼叫即可。

答案 2 :(得分:0)

检查API规范中应发送的内容。标头表示您将发送表单数据,因此我希望json有效负载(字符串)应被编码为某些参数的值;可能是您需要这样的东西:

payload = json.dumps(some_dict)
requests.post('https://www.url.json', data={ 'textmessage': payload }, headers=headers, files=file)

您的api文档将告诉您所需的键名,而不是textmessage。或可能需要其他一些调整。在不知道API期望的情况下很难说。