【问题标题】:Mechanize uploading image returns 403 error机械化上传图片返回403错误
【发布时间】:2019-07-14 14:41:19
【问题描述】:

我正在尝试使用 mechanize 将图像上传到 ebay-kleinanzeigen.de,但每次尝试时都会收到 403 错误。

登录代码:

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')

a = browser.open('https://www.ebay-kleinanzeigen.de/m-einloggen.html')
browser.select_form('#login-form')
# browser.get_current_form().print_summary()
browser['loginMail'] = 'testaccount@8.dnsabr.com'
browser['password'] = 'testaccount'
browser.submit_selected()

选择列出产品的类别:

response = browser.open(
    'https://www.ebay-kleinanzeigen.de/p-anzeige-aufgeben.html#?path=161/173/motorola_handy&isParent=false')
crsf = response.soup.find('input', {'name': '_csrf'})['value']

payload_select_category = {"_csrf": crsf,
                           "parentCategoryId": "210",
                           "categoryId": "223",
                           "attributeMap[autoteile_reifen.art_s]": "ersatz_reparaturteile"}

response = browser.post('https://www.ebay-kleinanzeigen.de/p-anzeige-aufgeben-schritt2.html', payload_select_category)

上传图片:

img_file = open(r'C:/Users/Oli/Google Drive/IMG_20190616_153432.jpg', 'rb')

payload_img_upload = {'name': 'Image.jpg'}

file = {'name': 'Image.jpg',
        'file': ('Image.jpg', img_file, 'image/jpeg')}

response = browser.post('https://www.ebay-kleinanzeigen.de/p-bild-hochladen.html', payload_img_upload, files=file)

顺便说一下,我在这里提供的登录数据是有效的。

【问题讨论】:

    标签: python python-requests


    【解决方案1】:

    尝试使用此代码:

    header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    header['content-type'] = 'text/html'
    
    base_url = 'https://www.ebay-kleinanzeigen.de/'
    
    session = requests.session()
    res = BeautifulSoup(session.get(f'{base_url}m-einloggen.html').content, 'lxml')
    csrf_token = res.find('input', {'name': '_csrf'})['value']
    print(f'Found token: {csrf_token}')
    
    payload = dict()
    payload['targetUrl'] = '/'
    payload['loginMail'] = 'testaccount@8.dnsabr.com'
    payload['password'] = 'testaccount'
    payload['_csrf'] = csrf_token
    payload['fingerprint'] = '4dd6ba9367ddc34f0b00cf9566e01b63'
    
    res = session.post(f'{base_url}m-einloggen.html', data=payload, allow_redirects=True)
    print(f'Logged in: {res.status_code}')
    
    img_file = open(r'C:/Users/Oli/Google Drive/IMG_20190616_153432.jpg', 'rb')
    files = {'name': 'TestImg.jpg', 'file': ('TestImg.jpg', img_file, 'image/jpeg', {'Expires': '10'})}
    
    header['content-type'] = 'multipart/form-data; boundary=----moxieboundary1563218428568'
    header['x-csrf-token'] = csrf_token
    res = session.post(f'{base_url}p-bild-hochladen.html',headers = header, files=files)
    print(f'Image uploaded: {res.status_code}')
    

    此外,还有这种编码。图片正在以某种编码方式上传,你能告诉我这是哪种编码吗?我认为这是问题所在:

    .

    【讨论】:

    • 感谢尼丁的帮助!响应显示我现在 200,但内容中有一条错误消息,用德语告诉我我不应该选择空图像。
    • 我没有检查。如果我找到任何解决方案,会通知您。
    • 不知道是什么编码。 Base64也是错的,希望能找到正确的编码。
    • 我很确定它是:ISO 8859-9,但我不知道如何将图像编码为这种编码
    猜你喜欢
    • 2014-10-21
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多