2

我需要帮助。基本上我需要使用这个命令。这是使用 CURL 给出的示例。我需要做的只是将它粘贴到 cmd 中,它就完成了它的工作。

curl \
-H "Content-Type: application/json" -X POST \
-u "{username}":"{password}" \
-d "{\"dialog_node\":\"greeting\",\"conditions\":\"#hello\",\"output\":{\"text\":\"Hi! How can I help you?\"},\"title\":\"greeting\"}" "https://gateway-s.watsonplatform.net/conversation/api/v1/workspaces/bec28d8f-18c1-4e97-8d08-9c842c658b51/dialog_nodes?version=2017-05-26"

可以在此处找到 URL 文档: https ://www.ibm.com/watson/developercloud/conversation/api/v1/?curl#create_dialognode

现在的问题是我想在 python 脚本而不是 CMD 中运行它.. 我已经搜索了几个小时的谷歌和 stackOverflow.. 但我似乎找不到正确的答案..

到目前为止,我看到 ppl 使用 1.requests 2.urllib 3.urllib2 4.pycurl 5.subprocess

我想以正确的方式去做。在 python 脚本中运行上述命令的最佳方法是什么,我该怎么做?

我也在使用 python 3

4

3 回答 3

3

喜欢 Simon O'Doherty 说的,你可以使用Python SDK来使用 Conversation 服务。http 使用 SDK 或requests使用服务确实是最佳实践。

“如果某件事值得做,那就值得做对了,对吧?”。所以你要问的是“我如何从我的程序中运行这个其他程序,只是为了发出一个微不足道的网络请求?” .

您可以使用 cURL 命令,是的,您可以。但它看起来并不像 Pythonic。仅仅为了一个小小的请求,就需要做很多工作。Python的不止于此。

作者来自这里的短语。

但是,您的问题看起来您确实想cURL在 Python 代码中使用该命令,因此,这里有一个示例。在这种情况下,您可以使用subprocess

呼叫转换:

import subprocess
subprocess.call(['curl', '-x', 'POST', '-H', '"Accept: application/json"', '-u', '{"userNameFromServiceCredentials:PasswordFromServiceCredentials" }', '"https://gateway-s.watsonplatform.net/conversation/api/v1/workspaces/bec28d8f-18c1-4e97-8d08-9c842c658b51/dialog_nodes?version=2017-05-26"'])

重要提示:要发送消息并获取输出,您需要使用subprocess.check_output();示例中的函数。并为正确的路由器发送消息,您的 cURL 命令需要看起来像来自@German Atannasio@Pridkkett的这个示例。

注意:这个答案只是为了告诉你更好的方法是什么,如果你真的想使用,一条“石头路径”供你遵循。

  • 将 Watson Conversation Service 与Python结合使用的 API 参考。
  • 在此处请求文档。
于 2017-09-18T13:00:07.207 回答
1

如果您使用的是 Watson Conversation,那么您可以只使用 Python WDC SDK。

https://github.com/watson-developer-cloud/python-sdk

对于上面的示例,它将是:

from watson_developer_cloud import ConversationV1

username = 'USERNAME',
password = 'PASSWORD',
version = '2017-05-26',
workspace_id = 'bec28d8f-18c1-4e97-8d08-9c842c658b51'
url = 'https://gateway-s.watsonplatform.net/conversation/api'

conversation = ConversationV1(
    username=username
    password=password,
    version=version,
    url=url
}

dialog_nodes = []

welcome_node = {
    'output': { 
        'text': { 'values': [ 'Welcome!' ],
                  'selection_policy': 'sequential' 
        } 
    },
    'parent': None,
    'context': None,
    'metadata': None,
    'next_step': None,
    'conditions': 'welcome',
    'dialog_node': 'Welcome',
    'previous_sibling': None
}

dialog_nodes.append(welcome_node)

# this appends to the previous node above, set by previous_sibling
node = {
    'dialog_node': 'greeting',
    'conditions': '#hello',
    'context': None,
    'metadata': None,
    'next_step': None,
    'output':{ 
        'text': { 'values': [ 'Hi! How can I help you?' ]},
                  'selection_policy': 'sequential'
        }
    },
    'title': 'greeting ',
    'previous_sibling': 'Welcome',
    'parent': None
}

dialog_nodes.append(node)

## Update the workspace.
response = conversation.update_workspace(
    workspace_id=workspace_id, 
    dialog_nodes=dialog_nodes
)

print(response)

此调用是全有或全无,因此如果您有现有节点,它将删除它们。原因是 SDK 没有单独的节点编辑。但这是一种更快的方法,而不是编辑单个节点(如果您有多个节点)。

如果您想进行单独调用,那么您将需要使用类似requests, 直到 SDK 更新。

示例(使用上面相同的变量):

import requests
from requests.auth import HTTPBasicAuth

endpoint = '{}/v1/workspaces/{}/dialog_nodes?version={}'.format(url,workspace_id,version)

basic_auth = HTTPBasicAuth(username, password)

# Change the condition to always execute. 
node['conditions'] = 'true'

response = requests.post(url=endpoint, auth=basic_auth, json=node)
于 2017-09-17T16:01:18.317 回答
0

在python3中使用pycurl发送文件时,我想了解为什么我必须直接发送二进制文件而不是提供其路径

IBM 沃森

#coding:utf-8

import certifi
import pycurl
import io

response = io.BytesIO()
c = pycurl.Curl()

#"apikey" is a key word

user = "apikey"
pwd = "YouRaPiKey"

#the file you want to submit
with open("path_to_file/audio-file.flac","rb") as f:
    audiofile = f.read()

c.setopt(c.URL,  "https://api. .... /.... /.. /v1/recognize")
c.setopt(pycurl.USERPWD, "{}:{}".format(user, pwd))
c.setopt(c.WRITEFUNCTION, response.write)
c.setopt(c.HTTPHEADER, ['Content-Type: audio/flac','Transfer-Encoding: chunked'])
c.setopt(c.POSTFIELDS, audiofile)
c.setopt(c.CAINFO,certifi.where())


c.perform()
c.close()

body = response.getvalue()
body = body.decode('iso-8859-1')

print(body)
于 2020-02-06T01:33:37.847 回答