【问题标题】:How to connect to Splunk API via Python, receiving javascript error如何通过 Python 连接到 Splunk API,收到 javascript 错误
【发布时间】:2020-07-16 16:19:28
【问题描述】:

我正在尝试使用 python 通过 API 连接到 Splunk。我可以连接并获得 200 状态码,但是当我阅读内容时,它不会阅读页面的内容。如下图:

这是我的代码:

import json
import requests
import re

baseurl = 'https://my_splunk_url:8888'
username = 'my_username'
password = 'my_password'

headers={"Content-Type": "application/json"}

s = requests.Session()
s.proxies = {"http": "my_proxy"}

r = s.get(baseurl, auth=(username, password), verify=False, headers=None, data=None)

print(r.status_code)
print(r.text)

我是 Splunk 和 python 的新手,所以任何关于为什么会发生这种情况的想法或建议都会有所帮助。

【问题讨论】:

  • 你期望输出是什么?

标签: python json python-requests splunk splunk-sdk


【解决方案1】:

您需要先进行身份验证才能获取令牌,然后才能访问其余的 REST 端点。身份验证端点位于/servicesNS/admin/search/auth/login,它将为您提供session_key,然后您将其提供给后续请求。

以下代码使用请求对 Splunk 实例进行身份验证,然后开始搜索。然后它会检查搜索是否完成,如果没有,请稍等片刻,然后再次检查。继续检查并休眠,直到搜索完成,然后打印出结果。

import time # need for sleep
from xml.dom import minidom

import json, pprint

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)


base_url = 'https://localhost:8089'
username = 'admin'
password = 'changeme'

search_query = "search=search index=*"

r = requests.get(base_url+"/servicesNS/admin/search/auth/login",
    data={'username':username,'password':password}, verify=False)

session_key = minidom.parseString(r.text).getElementsByTagName('sessionKey')[0].firstChild.nodeValue
print ("Session Key:", session_key)

r = requests.post(base_url + '/services/search/jobs/', data=search_query,
    headers = { 'Authorization': ('Splunk %s' %session_key)},
    verify = False)

sid = minidom.parseString(r.text).getElementsByTagName('sid')[0].firstChild.nodeValue
print ("Search ID", sid)

done = False
while not done:
    r = requests.get(base_url + '/services/search/jobs/' + sid,
        headers = { 'Authorization': ('Splunk %s' %session_key)},
        verify = False)
    response = minidom.parseString(r.text)
    for node in response.getElementsByTagName("s:key"):
        if node.hasAttribute("name") and node.getAttribute("name") == "dispatchState":
            dispatchState = node.firstChild.nodeValue
            print ("Search Status: ", dispatchState)
            if dispatchState == "DONE":
                done = True
            else:
                time.sleep(1)

r = requests.get(base_url + '/services/search/jobs/' + sid + '/results/',
    headers = { 'Authorization': ('Splunk %s' %session_key)},
    data={'output_mode': 'json'},
    verify = False)

pprint.pprint(json.loads(r.text))

使用的许多请求调用都包含标志 verify = False 以避免默认自签名 SSL 证书出现问题,但如果您有合法证书,则可以放弃它。

不久前发布于https://gist.github.com/sduff/aca550a8df636fdc07326225de380a91

【讨论】:

    【解决方案2】:

    很好的编码。 Python 的一大优点是能够使用其他人编写良好的包。在这种情况下,为什么不使用 Splunk 的 Python 包来完成所有这些工作,而周围的编码要少得多。

    pip 安装 splunklib。

    然后将以下内容添加到您的导入块中

    导入 splunklib.client 作为客户端

    导入 splunklib.results 作为结果

    pypi.org 有一些使用的文档,Splunk 有一套优秀的操作文档。记住,偷懒,利用别人的作品让你的作品看起来更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多