-1

我正在尝试从 python 运行 ventrilo 并加入一个频道,

    path= 'ventrilo://91.227.221.73:3824/servername=vGames&serverpassword=9929&channelname=CS.vGames.co.il GatherBot -2-/.Team-A&channelpassword=57'

    os.startfile(path)

我进入腹腔的实际路径是:CS.vGames.co.il GatherBot,因为通道-2-/.Team-A丢失。

我知道这是可以做到的,因为当我从 IRC 客户端执行此操作时,它可以工作。在我的 IRC clinet 中,我使用%20空间来使其工作。

在 python 中,我尝试了我在互联网上可以找到的所有内容。请帮我。

4

1 回答 1

0

这里的正确答案是使用 . 构建 URL 的查询字符串部分urllib.urlencode。例如:

qparams = {
  'servername': 'vGames', 
  'serverpassword': '9929', 
  'channelname': 'CS.vGames.co.il GatherBot -2-/.Team-',
  'channelpassword': '57' }
path = 'ventrilo://91.227.221.73:3824/' + urllib.urlencode(qparams)

如果您从其他地方获得了硬编码的查询字符串,则可以urllib.quote在其上使用:

qstring = 'servername=vGames&serverpassword=9929&channelname=CS.vGames.co.il GatherBot -2-/.Team-A&channelpassword=57'
path = 'ventrilo://91.227.221.73:3824/' + urllib.quote(qstring)

或者,如果您从其他地方获得了完整的硬编码 URL,则该 URL 应该已经正确编码(使用“%20”表示“”等)。如果您手动编写 URL,您始终可以手动对其进行编码,只需用 %20 替换空格,然后对您注意到的任何其他内容进行编码,直到它起作用……但这通常不是一个很好的工作方式,除了非常快速和肮脏的黑客攻击在口译员周围。

您可以尝试以下操作:使用urlparse.urlparse它,然后encode使用quote查询字符串部分并将其重新组合在一起。但是不能保证它会做正确的事情。你给它垃圾,它不一定知道它是什么垃圾。例如,频道名称中有一个未编码的“/”,所以谁知道它urlparse会做什么。更不用说你甚至没有'?引入查询字符串。

因此,您可能需要一些自定义代码来解决该问题。

但最好的解决方案是退后一步:无论 URL 来自何处,都一定有人知道什么是路径、什么是查询字符串以及如何连接查询参数等等;捕获当时的知识并将其传递下去,并以正确的方式做事urllib.urlencode

于 2012-09-27T22:36:30.823 回答