使用 webhook 上传文本文件以进行不和谐

问题描述 投票:0回答:1

我浏览并测试了网上看到的一些例子,但没有成功。 据我了解,它应该类似于下面的代码:

$hookUrl = 'https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXXX'

$Body = @{
  'username' = $env:username
  'content' = "this is a test"
  "file=@C:\Users\User\Desktop\test.txt"
}



Invoke-WebRequest -uri $hookUrl -Method POST -Body $Body -Headers @{'Content-Type' = 'application/json'}

错误

Invoke-WebRequest : {"code": 50109, "message": "The request body contains invalid JSON."}
At line:11 char:1
+ Invoke-WebRequest -uri $hookUrl -Method POST -Body $Body -Headers @{' ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

我在文档中看到了一些很长的方法来实现这一目标,但是如果您看到下面的内容,我将发布一个行,它可以使用 CMD 完成我想要的任务。在 CMD 中真的这么简单,但在 powershell 中却需要 15 行以上?

curl -F "payload_json={\"username\": \"jakoby\", \"content\": \"download me\"}" -F "file=@\"C:\Users\User\Desktop\newUser.txt\"" WEB-HOOK
powershell discord webhooks invoke-webrequest
1个回答
1
投票

更新

  • 下面的答案(下一节)解决了您问题的原始形式。

  • 后来发现您正在寻找相当于

    curl
    命令行的 PowerShell,该命令行使用
    multipart/form-data
    提交来提交 JSON 并上传本地文件。

    • Invoke-WebRequest

      帮助主题中的示例 6 向您展示了如何执行此操作,但它比 
      curl
      命令更详细。

    • 因此,最简单的解决方案可能是简单地从 PowerShell 调用

      curl
      命令,但请务必使用
      curl.exe
      明确定位 外部可执行文件,而不是
      curl
      Invoke-WebRequest
      别名
      ,即内置于 Windows PowerShell 中(已在 PowerShell (Core) 7+ 中删除)。

      # In PowerShell 7.3+, the "\" chars. are *no longer necessary*.
      curl.exe -F "payload_json={\`"username\`": \`"jakoby\`", \`"content\`": \`"download me\`"}" -F "file=@\`"C:\Users\User\Desktop\newUser.txt\`"" WEB-HOOK
      
      • 请注意,不幸的是需要转义嵌入的
        "
        两次
        • 一次,使用
          `
          ,满足 PowerShell 对双引号字符串的语法要求(如预期)。
          • 如果您使用
            '...'
            进行整体引用,则可以避免这种需要,但这会阻止将变量值直接嵌入到字符串中。
        • [更新:在 v7.3+ 中不再需要 - 请参阅这个答案] 意外地 再次,使用
          \
          ,解决有关传递包含逐字
          "
          字符的参数的长期存在的错误。到外部程序。

由于目标 Web 服务需要 JSON,因此您必须先将

$Body
hashtable 转换为 JSON,然后再将其传递给
Invoke-WebRequest
-Body
参数,您可以使用
ConvertTo-Json
执行此操作:

Invoke-WebRequest -uri $hookUrl -Method POST -Body (ConvertTo-Json $Body) -Headers @{'Content-Type' = 'application/json'}

强制性的一般警告:对于嵌套更深的对象,您可能需要将

-Depth
参数传递给
ConvertTo-Json
以防止数据意外截断 - 请参阅这篇文章


看来你也想上传本地文件:

  • 由于 Web 服务无法访问您的本地文件系统,因此无法将 本地文件路径 作为 JSON 的一部分传递 - 必须上传本地文件的 内容

  • Invoke-WebRequest
    文档仅讨论在
    multipart/form-data
    提交上下文中上传本地文件 - 例如,请参阅示例 6

© www.soinside.com 2019 - 2024. All rights reserved.