【问题标题】:Passing a String variable or String array into a curl script from python将字符串变量或字符串数​​组从 python 传递到 curl 脚本
【发布时间】:2021-08-06 13:59:53
【问题描述】:

我有一个来自 Vonage 网站的 curl 脚本,该脚本向我的个人 WhatsApp 发送一条消息,其中包含 "text": 之后的 " " 内的任何内容

curl -X POST https://messages-sandbox.nexmo.com/v0.1/messages \
-u '5bbb*************2mI' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"from": { "type": "whatsapp", "number": "1415*********" },
"to": { "type": "whatsapp", "number": "38*********" },
"message": {
  "content": {
    "type": "text",
    "text": "This message has been sent from Vonage API"
      }
     }
   }'

我像这样从 curltest.py 调用脚本

import os 
os.system("bash /home/pi/Desktop/curltest.sh") 

由 crontable 作为 cronjob 每 30 分钟执行一次。这工作得很好,但是我想要做的是发送一个字符串变量或字符串数​​组的值,而不是在"text": 字段中输入确切的消息,并且该字符串数组将被声明并填充在同一个 python 文件中(如果可能)。

这是针对本科论文的,因此只要可行,就可以尽可能粗略。

我已经尝试声明一个简单的变量,删除“”并将变量放在那里,但它给了我一个语法错误,当我试图从-d '关闭'时,把变量放在那里,然后重新打开声明的其余部分的 '。 我们根本没有使用 curl,所以我在这里有点超出我的深度。

【问题讨论】:

    标签: python bash curl cron


    【解决方案1】:

    一种简单的方法是将消息设置为 python 程序中的 bash 环境变量,然后在 bash 脚本中引用该环境。例如,如果python代码使用bash数组语法设置环境变量CURLY_TEXT

    import os 
    props=['Hello, world!', '555-1212', '121-5555']
    props_str=" ".join(f'"{p}"' for p in props)
    os.environ["CURLY_TEXT"] = f"({props_str})"
    os.system("bash /home/pi/Desktop/curltest.sh")
    

    ...那么 bash 脚本可以像这样引用数组元素:

    eval declare -a props="${CURLY_TEXT}"
    
    curl -X POST https://messages-sandbox.nexmo.com/v0.1/messages \
    -u '5bbb*************2mI' \
    -H 'Content-Type: application/json' \
    -H 'Accept: application/json' \
    -d '{
    "from": { "type": "whatsapp", "number": '\"${props[1]}\"' },
    "to": { "type": "whatsapp", "number":  '\"${props[2]}\"' },
    "message": {
      "content": {
        "type": "text",
        "text": '\"${props[0]}\"'
          }
         }
       }'
    
    

    注意: 你必须用单引号做一些棘手的事情,因为-d 之后的内容被单引号包围:例如要获取 bash 数组变量来替换,您需要结束单引号块,添加变量${props[0]},然后恢复单引号块。

    【讨论】:

    • 如果您查看我对另一个答案的回复,您会发现您误解了"from": { "type": "whatsapp", "number": "<Vonage'"'"'s number>" },我再次为此道歉。考虑到这一点,我认为我不需要更改该行的任何内容,只需按照您的建议更改其余部分,它给了我一个 curl: (3) Unmatched close brace/bracket in position 14: world! } } } 我编辑了帖子以纠正我的错误。
    • 我编辑了我的答案以展示一种传递 Python 数组并分配给 bash 数组的方法。我还修复了原始答案的 -d 参数中的引用错误。
    【解决方案2】:

    首先请将curltest.sh修改为:

    message="$1"
    curl -X POST https://messages-sandbox.nexmo.com/v0.1/messages \
    -u '5bbb*************2mI' \
    -H 'Content-Type: application/json' \
    -H 'Accept: application/json' \
    -d '{
    "from": { "type": "whatsapp", "number": "<Vonage-s number>" },
    "to": { "type": "whatsapp", "number": "<my number>" },
    "message": {
      "content": {
        "type": "text",
        "text": "'"$message"'"
        }
      }
    }'
    

    然后从curltest.py调用脚本:

    import subprocess
    subprocess.call(["bash", "/home/pi/Desktop/curltest.sh", "put your message here"])
    

    【讨论】:

    • 我必须为混乱道歉,当我说 ("from": { "type": "whatsapp", "number": "&lt;Vonage's number&gt;" },) 我并不是说那里有一个实际的 ('),这是我的疏忽。我的意思是这只是他们的 API 编号所在的位置。看起来像这样: ("from": { "type": "whatsapp", "number": "1415*****" }, "to": { "type": "whatsapp", "number": "38******" },) 所以 ("number": "&lt;Vonage'\''s number&gt;") 不是我认为我需要做的事情。但是没有做任何事情,只是添加 $message 我得到了一个 InvalidParams 错误,“title”,未能读取 HTTP
    • 感谢您的反馈。该错误可能是因为我忘记用额外的双引号将 $message 变量括起来。我已经更新了我的答案,在单引号周围加上了额外的双引号。请你测试一下好吗? BR。
    • 是的,它有效!十分感谢你的帮助。不幸的是我不能传递一个字符串数组(TypeError: expected str, bit or os.PathLike object),但这没问题,我可以将每个值存储到它自己的字符串中,因为我只有固定数量的它们(5 或 7 不记得顶部我的脑袋),然后将它们合并到 subprocess.call 中。再次感谢您,将其标记为正确答案。
    • 感谢您的及时反馈。很高兴知道它现在有效。干杯。
    • 如果您不介意,我可以问一下message="$1" 的作用吗?看起来像是一个变量的声明和初始化,但是为什么$1,有什么具体原因吗?
    猜你喜欢
    • 2018-11-28
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多