【问题标题】:Rapidshare API with PowerShell使用 PowerShell 的 Rapidshare API
【发布时间】:2012-09-04 03:15:50
【问题描述】:
$FreeUploadServer = Invoke-RestMethod -Uri "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver"
Invoke-RestMethod -Uri "http://rs$FreeUploadServer.rapidshare.com/cgi-bin/rsapi.cgi?sub=upload&login=43533592&password=password&filecontent=C:\libs\test.txt" 

我不知道为什么这不起作用,它与 filecontent 参数有关,但我已经阅读了有关 API 的整个文档,但我无法弄清楚。

API Documentation

【问题讨论】:

  • 在这种情况下,我强烈推荐 Fiddler Web 调试代理工具。它可以向您显示 PowerShell 实际发送的内容以及服务器的响应是什么。 fiddler2.com/fiddler2
  • 我试过了,我快疯了哈哈。我通常使用 Charles 进行调试,但我什至决定试一试 fiddler,但我无法弄清楚。
  • 服务器返回什么响应?
  • 错误:没有文件传输。 (f269d341) 它是一个快速共享特定错误,而您在这里我有一个问题要问您,我应该使用 Invoke-WebRequest 而不是 Invoke-RestMethod 吗?无论如何,您可以使用 ((Invoke-WebRequest "someendpoint").ParsedHTML.Body | ConvertFrom-JSON) 获得与 Invoke-RestMethod 相同的结果?

标签: .net powershell rapidshare


【解决方案1】:

确保在第二个 Invoke-RestMethod 调用中使用 -Method Post 参数/arg 组合。另外,看看这个SO response to a similar question about using CURL。查看问题和答案后,RapidShare 似乎需要填写 POST 表单字段。在这种情况下,您需要指定-Body 参数。我认为您将使用 PowerShell 哈希表,其中每个条目对应于一个表单字段名称/值对。看起来需要的一个字段是filecontent 字段。大概该值是文件的内容。

此外,当您使用 POST 时,您必须将 GET 查询参数转换为 POST 表单字段,例如:

$url = "http://rs$FreeUploadServer.rapidshare.com/cgi-bin/rsapi.cgi"
$fields = @{sub='upload';login='43533592';password='password';filename='test.txt';
            filecontent=([IO.File]::ReadAllText('c:\libs\test.txt'))}

Invoke-RestMethod -Uri $url -Body $fields -Method Post

如果[IO.File]::ReadAlltext() 没有成功,不妨试试[IO.File]::ReadAllBytes()

【讨论】:

  • 当我这样做时,我得到一个不同的错误,它说:错误:没有内容的帖子。
  • 我试过这个: Invoke-RestMethod "rs$FreeUploadServer.rapidshare.com/cgi-bin/…:\libs\test.txt" -Body @{filecontent="C:\libs\test.txt"} -Method Post 它失败了但是这次子例程失败了,是否有理由从 URL 中删除文件内容?
  • 我认为这很接近。关键是如何实际传输文件的内容。
  • 是的,无论如何,我会把你标记为答案,告诉你我一直在玩 -Body 的真相,但忘记了在豪华中你用哈希表定义名称/值对,我肯定生病了偶然得到它。
  • 终于。我找到了,我将用解决方案回答我自己的问题:D
【解决方案2】:

原来在 API 文档中有一小部分说如果您使用 POST 方法,所有参数都需要在正文中传递。我在 PowerShell 中编写了一个上传到 RapidShare 的函数,我希望这对未来的人们有所帮助,因为这很烦人。

function Upload-RapidShare([string]$File,[string]$Name)
{
     $FreeUploadServer = Invoke-RestMethod -Uri "http://api.rapidshare.com/cgi-bin/rsapi.cgi?sub=nextuploadserver"
     Invoke-RestMethod "http://rs$FreeUploadServer.rapidshare.com/cgi-bin/rsapi.cgi" -Body  "sub=upload&login=USERNAME&password=PASSWORD&filename=$Name&filecontent=$File" -Method Post
}

【讨论】:

  • 您意识到像这样通过字符串指定正文完全等同于为表单字段使用哈希表。如果您在为 Body 参数指定哈希表时查看 Fiddler,则 HttpRequest 的主体(由 Fiddler 捕获)为 filename=test.txt&sub=upload&password=password&login=43533592&filecontent=...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多