在python中使用mechanize似乎不能正确处理POST请求。(400错误)

在python中使用mechanize似乎不能正确处理POST请求。(400错误),python,python-2.7,mechanize,steam,cookiejar,Python,Python 2.7,Mechanize,Steam,Cookiejar,我正在用Python编写一个IRC机器人,以便我和我的朋友从steam市场购买物品。这主要是为了好玩和提高我的编程技能。我已经能够得到一个项目的最低价格,但我有麻烦张贴购买请求。我发出了会话id和steamLogin cookies,url可以是http://steamcommunity.com/market/listings/730/Winter%20Offensive%20Weapon%20Case。以下是蒸汽部分的代码: import mechanize, re, datetime, ur

我正在用Python编写一个IRC机器人,以便我和我的朋友从steam市场购买物品。这主要是为了好玩和提高我的编程技能。我已经能够得到一个项目的最低价格,但我有麻烦张贴购买请求。我发出了会话id和steamLogin cookies,url可以是
http://steamcommunity.com/market/listings/730/Winter%20Offensive%20Weapon%20Case
。以下是蒸汽部分的代码:

import mechanize, re, datetime, urllib
from cookielib import Cookie
from cookielib import LWPCookieJar

url = 'http://steamcommunity.com/market/listings/730/blahblah'
sessionid = ''
steamLogin = ''
maximum = int(raw_input('How much are you willing to pay? '))

def makeCookie(name, value):
    return Cookie(
        version=0, 
        name=name, 
        value=value,
        port=None, 
        port_specified=False,
        domain="steamcommunity.com", 
        domain_specified=True, 
        domain_initial_dot=False,
        path="/", 
        path_specified=True,
        secure=False,
        expires=None,
        discard=False,
        comment=None,
        comment_url=None,
        rest=None
    )

br = mechanize.Browser()

cj = LWPCookieJar()
br.set_cookiejar(cj)
cj.set_cookie(makeCookie('sessionid', sessionid))
cj.set_cookie(makeCookie('steamLogin', steamLogin))
br.addheaders = [('User-agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7')]

id = ''
response = br.open(url)
elements = response.read().splitlines()
line = (elements[elements.index('\tvar g_rgCurrency = [];') + 1])[23:]
match = re.search(r'("listingid":")(\d+)(.+?)(converted_price":)(\d+)(,"converted_fee":)(\d+)', line)
if not match: continue
if match.group(2) == id: continue
id = match.group(2)
subtotal = int(match.group(5))
fee = int(match.group(7))
total = subtotal + fee
print "Total at", str(datetime.datetime.now()) + ' for listing id (' + id + '):', '${:,.2f}'.format(float(total)/100)
if total <= maximum:
    data = urllib.urlencode({'sessionid': sessionid,
    'currency': '1',
    'subtotal': subtotal,
    'fee': fee,
    'total': total})
    print data
    try:
        post = br.open('https://steamcommunity.com/market/buylisting/' + id, data)
    except Exception as e:
        print e
import-mechanize、re、datetime、urllib
从cookielib导入Cookie
从cookielib导入LWPCookieJar
url='1〕http://steamcommunity.com/market/listings/730/blahblah'
sessionid=''
蒸汽登录=“”
最大值=整数(原始输入('您愿意支付多少?'))
def makeCookie(名称、值):
返回Cookie(
版本=0,
name=name,
值=值,
端口=无,
指定的端口=False,
domain=“steamcommunity.com”,
指定的域=真,
域\初始\点=假,
path=“/”,
指定的路径=真,
安全=错误,
expires=无,
放弃=错误,
注释=无,
comment_url=None,
剩余=无
)
br=mechanize.Browser()
cj=LWPCookieJar()
br.set_cookiejar(cj)
cj.set_cookie(makeCookie('sessionid',sessionid))
cj.set_cookie(makeCookie('streamlogin',streamlogin))
br.addheaders=[('User-agent'、'Mozilla/5.0(Windows;U;Windows NT 5.1;en-US;rv:1.9.2.7)Gecko/20100713 Firefox/3.6.7')]
id=“”
响应=br.打开(url)
elements=response.read().splitlines()
行=(元素[elements.index('\tvar g_rgCurrency=[];'))+1])[23:]
匹配=重新搜索(r'(“列表ID:)(\d+)(.+?)(转换价格):(\d+)(,“转换费用”)(\d+),行)
如果不匹配:继续
如果匹配。组(2)=id:继续
id=匹配。组(2)
小计=整数(匹配组(5))
费用=整数(匹配组(7))
总计=小计+费用
打印清单id('+id+'):','${:,.2f}'的“总计”,str(datetime.datetime.now())+”。格式(float(Total)/100)

如果您的
的总格式不匹配:continue
很奇怪,则应转到两行以提高可读性。您在代码中使用
continue
是无用的-
continue
打破了循环,但在代码中没有循环。您应该尝试通过web浏览器中的Python代码和FF中的Firebug或Chrome中的DevTools来准确跟踪发送到服务器的内容。然后,比较一下,你就会发现问题所在。由于您将获得400,我假设授权中存在一些问题。您可以尝试一些需要授权的简单操作,这样可以限制需要关注的细节数量。通常,您应该能够深入到一个或两个
curl
调用。虽然curl需要一些学习,但它作为表达http请求(包括cookie)的非常简单的形式得到了回报。我简要地查看了steam站点,并启用了JavaScript。Mechanize根本无法处理这个问题,我怀疑您正因此而遇到麻烦(JavaScript经常用于站点,以防止表单的双重提交,即使对于看起来像普通postt的东西也是如此)。我已经解决了驱动这类网站的问题(例如,通过使用firefox/chrome和selenium,在上查看新项目的评论队列),这与python中的浏览器行为非常接近。@ekansh,如果您想编辑代码,只需删除问题。将问题内容编辑掉没有任何帮助。