我正在尝试将带有文本消息的文件发送到网页,但是我无法将文件发送到服务器。短信不是问题
使用登录名更新其他代码以对其进行测试。
#!/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的响应代码,消息和图像文件没有发送。
答案 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期望的情况下很难说。