2012-03-31 88 views
1

嗨,大家好,我有一个python脚本,它将一些数据发布到google并获取响应。脚本低于Python到红宝石转换

net, cid, lac = 24005, 40242, 62211 
import urllib 
a = '000E00000000000000000000000000001B0000000000000000000000030000' 
b = hex(cid)[2:].zfill(8) + hex(lac)[2:].zfill(8) 
c = hex(divmod(net,100)[1])[2:].zfill(8) + hex(divmod(net,100)[0])[2:].zfill(8) 
string = (a + b + c + 'FFFFFFFF00000000').decode('hex') 
try: 
    data = urllib.urlopen('http://www.google.com/glm/mmap',string) 
    r = data.read().encode('hex') 
    print r 
except: 
    print 'connect error' 

我想用ruby脚本得到相同的响应。我无法正确地形成请求,我总是得到badimplementation错误或http 501错误。你能告诉我错误在哪里吗? (红宝石脚本附在下面)。

require 'net/http' 
def fact(mnc,mcc,cid,lac) 
    a = '000E00000000000000000000000000001B0000000000000000000000030000' 
    b = cid.to_s(16).rjust(8,'0') + lac.to_s(16).rjust(8,'0') 
    c = mnc.to_s(16).rjust(8,'0') + mcc.to_s(16).rjust(8,'0') 
    string = [a + b + c + 'FFFFFFFF00000000'].pack('H*') 
    url = URI.parse('http://www.google.com/glm/mmap') 
    resp = Net::HTTP.post_form(url,string) 
    print resp 
end 
puts fact(5,240,40242,62211) 

回答

1

From the documentation

帖子HTML表单数据到指定的URI对象。表单数据必须作为从字符串到字符串的散列映射提供。

你要传递的参数,如果我理解的正确,在表单上: {"param1" => "value1", "param2"=>"value2"}

我只是不明白什么是你传递你的请求参数的名称。

下面是该方法的Net :: HTTP :: post_form一些使用的实例,也从官方DOC:

实施例1:

uri = URI('http://www.example.com/search.cgi') 
res = Net::HTTP.post_form(uri, 'q' => 'ruby', 'max' => '50') 
puts res.body 

练习2:

uri = URI('http://www.example.com/search.cgi') 
res = Net::HTTP.post_form(uri, 'q' => ['ruby', 'perl'], 'max' => '50') 
puts res.body 

Link to the examples

希望它有帮助

编辑:接受字符串作为参数传递给POST请求功能:Net::HTTP::request_post

+0

#<的Net :: HTTPNotImplemented:0x107ffa0e8>无我总是得到这个错误。 – 2012-03-31 21:45:57

+0

另外,我不应该根据google api发布为关键值对。我应该像在Python脚本中看到的那样发布HEX字符串 – 2012-03-31 21:48:05

+0

因此,您不能使用post_form,而是使用Net :: HTTP.request_post。它将一个字符串作为参数。试一试,如果服务器仍然以501响应,请参阅实际请求,并将其与python脚本生成的请求进行比较。 – Castilho 2012-03-31 21:49:58