6

直到最近,惠普保修信息的网络抓取工作正常,但是在过去几周他们已经更改了网页,似乎他们现在在新页面上使用 POST 而不是 GET,这意味着我真的不能通过URL 的信息。

我确实在此页面上的解决方案中找到了一些希望:http:
//ocdnix.wordpress.com/2013/03/14/hp-server-warranty-via-the-isee-api/
但我不明白这个例子脚本,因为我以前没有使用过 Python。

我还发现这个网页向我展示了戴尔保修的一个很好的例子,但是惠普没有我可以使用的 WSDL。(我会发布链接但没有足够的代表)

使用这些功能,我可以形成请求:
http ://www.iislogs.com/steveschofield/execute-a-soap-request-from-powershell

我认为一切都会按预期工作,但我正在努力形成注册客户端的请求,我不断收到 500 个错误,这意味着他们的服务器已损坏或我的请求导致内部错误。

我第一次完全不知所措。

有人让它在 PowerShell 中工作或遇到类似问题吗?

22-10-13 更新

我现在有了信封,我设法让 Python 脚本运行,但由于我的代理而失败,所以提取了我想要的生成的 XML,因为我不确定它应该如何形成,这看起来像:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iseeReg="http://www.hp.com/isee/webservices/">
<SOAP-ENV:Body>
    <iseeReg:RegisterClient2>
    <iseeReg:request><isee:ISEE-Registration xmlns:isee="http://www.hp.com/schemas/isee/5.00/event" schemaVersion="5.00">
<RegistrationSource>
    <HP_OOSIdentifiers>
    <OSID>
        <Section name="SYSTEM_IDENTIFIERS">
        <Property name="TimestampGenerated" value="2013/10/22 09:40:35 GMT Standard Time"/>
        </Section>
    </OSID>
    <CSID>
        <Section name="SYSTEM_IDENTIFIERS">
        <Property name="CollectorType" value="MC3"/>
        <Property name="CollectorVersion" value="T05.80.1 build 1"/>
        <Property name="AutoDetectedSystemSerialNumber" value="10"/>
        <Property name="SystemModel" value="HP ProLiant"/>
        <Property name="TimestampGenerated" value="2013/10/22 09:40:35 GMT Standard Time"/>
        </Section>
    </CSID>
    </HP_OOSIdentifiers>
    <PRS_Address>
    <AddressType>0</AddressType>
    <Address1/>
    <Address2/>
    <Address3/>
    <Address4/>
    <City/>
    <Region/>
    <PostalCode/>
    <TimeZone/>
    <Country/>
    </PRS_Address>
</RegistrationSource>
<HP_ISEECustomer>
    <Business/>
    <Name/>
</HP_ISEECustomer>
<HP_ISEEPerson>
    <CommunicationMode>255</CommunicationMode>
    <ContactType/>
    <FirstName/>
    <LastName/>
    <Salutation/>
    <Title/>
    <EmailAddress/>
    <TelephoneNumber/>
    <PreferredLanguage/>
    <Availability/>
</HP_ISEEPerson>
</isee:ISEE-Registration></iseeReg:request>
    </iseeReg:RegisterClient2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

然后我构建了一个执行如下的 Powershell 脚本:

function Execute-SOAPRequest {
Param (
[Xml]$SOAPRequest,
[String]$URL,
[switch]$UseProxy
)

write-host "Sending SOAP Request To Server: $URL" 
$soapWebRequest = [System.Net.WebRequest]::Create($URL) 
$soapWebRequest.Headers.Add("SOAPAction",'"http://www.hp.com/isee/webservices/RegisterClient2"') 

$soapWebRequest.ContentType = 'text/xml; charset=utf-8'
$soapWebRequest.Accept = "text/xml" 
$soapWebRequest.Method = "POST" 
$soapWebRequest.UserAgent = 'RemoteSupport/A.05.05 - gSOAP/2.7'

#$soapWebRequest.ServicePoint.Expect100Continue = $False
#$soapWebRequest.ServicePoint.MaxIdleTime = 2000
$soapWebRequest.ProtocolVersion = [system.net.httpversion]::version10

if($UseProxy){
    $soapWebRequest.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
}


write-host "Initiating Send." 
$requestStream = $soapWebRequest.GetRequestStream() 
$SOAPRequest.Save($requestStream) 
$requestStream.Close() 

write-host "Send Complete, Waiting For Response." 
$resp = $soapWebRequest.GetResponse() 
$responseStream = $resp.GetResponseStream() 
$soapReader = [System.IO.StreamReader]($responseStream) 
$ReturnXml = [Xml]$soapReader.ReadToEnd() 
$responseStream.Close() 

write-host "Response Received." 

return $ReturnXml 
} 

$SOAPRequest = [Xml](Get-Content 'C:\Temp\SoapEnv.xml')
$URL = 'https://services.isee.hp.com/ClientRegistration/ClientRegistrationService.asmx'

Execute-SOAPRequest $SOAPRequest $URL -UseProxy

但是现在我得到了更多的错误,而不是我越来越接近的 500?错误详情如下:

Exception calling "GetRequestStream" with "0" argument(s): "The server committed a protocol violation. Section=ResponseStatusLine"
At C:\Temp\HP Register Client.ps1:29 char:54
+     $requestStream = $soapWebRequest.GetRequestStream <<<< () 
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
4

6 回答 6

3

我已将其构建到 PowerShell 模块中,我将 SOAP 请求移动到单独的 XML 文件中,并使用 CDATA 使它们更具可读性。它对我来说效果很好。它可以在 GitHub 上找到:

https://github.com/dotps1/HPWarranty

感谢此页面上的所有信息,真的很有帮助!

于 2014-08-22T13:14:19.003 回答
3

尝试这个。. 对我来说很好:注意:只有请求标签需要转义。

$SOAPRequest= [xml]@"
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iseeReg="http://www.hp.com/isee/webservices/">
<SOAP-ENV:Body>
    <iseeReg:RegisterClient2>
    <iseeReg:request>&lt;isee:ISEE-Registration xmlns:isee="http://www.hp.com/schemas/isee/5.00/event" schemaVersion="5.00"&gt;
&lt;RegistrationSource&gt;
    &lt;HP_OOSIdentifiers&gt;
    &lt;OSID&gt;
        &lt;Section name="SYSTEM_IDENTIFIERS"&g`enter code here`t;
        &lt;Property name="TimestampGenerated" value="2013/12/06 14:04:24 EST"/&gt;
        &lt;/Section&gt;
    &lt;/OSID&gt;
    &lt;CSID&gt;
        &lt;Section name="SYSTEM_IDENTIFIERS"&gt;
        &lt;Property name="CollectorType" value="MC3"/&gt;
        &lt;Property name="CollectorVersion" value="T05.80.1 build 1"/&gt;
        &lt;Property name="AutoDetectedSystemSerialNumber" value="10"/&gt;
        &lt;Property name="SystemModel" value="HP ProLiant"/&gt;
        &lt;Property name="TimestampGenerated" value="2013/12/06 14:04:24 EST"/&gt;
        &lt;/Section&gt;
    &lt;/CSID&gt;
    &lt;/HP_OOSIdentifiers&gt;
    &lt;PRS_Address&gt;
    &lt;AddressType&gt;0&lt;/AddressType&gt;
    &lt;Address1/&gt;
    &lt;Address2/&gt;
    &lt;Address3/&gt;
    &lt;Address4/&gt;
    &lt;City/&gt;
    &lt;Region/&gt;
    &lt;PostalCode/&gt;
    &lt;TimeZone/&gt;
    &lt;Country/&gt;
    &lt;/PRS_Address&gt;
&lt;/RegistrationSource&gt;
&lt;HP_ISEECustomer&gt;
    &lt;Business/&gt;
    &lt;Name/&gt;
&lt;/HP_ISEECustomer&gt;
&lt;HP_ISEEPerson&gt;
    &lt;CommunicationMode&gt;255&lt;/CommunicationMode&gt;
    &lt;ContactType/&gt;
    &lt;FirstName/&gt;
    &lt;LastName/&gt;
    &lt;Salutation/&gt;
    &lt;Title/&gt;
    &lt;EmailAddress/&gt;
    &lt;TelephoneNumber/&gt;
    &lt;PreferredLanguage/&gt;
    &lt;Availability/&gt;
&lt;/HP_ISEEPerson&gt;
&lt;/isee:ISEE-Registration&gt;</iseeReg:request>
    </iseeReg:RegisterClient2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
"@

您必须像这样对保修 xml 做同样的事情,然后重新运行肥皂网络请求。

$hpgdid = $ReturnXml.envelope.body.RegisterClient2Response.RegisterClient2Result.Gdid
$hptoken = $ReturnXml.envelope.body.RegisterClient2Response.RegisterClient2Result.registrationtoken


$warrantyxml = [xml]@"
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:isee="http://www.hp.com/isee/webservices/">
  <SOAP-ENV:Header>
    <isee:IseeWebServicesHeader>
      <isee:GDID>$hpgdid</isee:GDID>
      <isee:registrationToken>$hptoken</isee:registrationToken>
      <isee:OSID/>
      <isee:CSID/>
    </isee:IseeWebServicesHeader>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
    <isee:GetOOSEntitlementList2>
      <isee:request>
        &lt;isee:ISEE-GetOOSEntitlementInfoRequest
    xmlns:isee="http://www.hp.com/schemas/isee/5.00/entitlement"
    schemaVersion="5.00"&gt;
  &lt;HP_ISEEEntitlementParameters&gt;
    &lt;CountryCode&gt;ES&lt;/CountryCode&gt;
    &lt;SerialNumber&gt;CZ10130050&lt;/SerialNumber&gt;
    &lt;ProductNumber&gt;519841-425&lt;/ProductNumber&gt;
    &lt;EntitlementType&gt;&lt;/EntitlementType&gt;
    &lt;EntitlementId&gt;&lt;/EntitlementId&gt;
    &lt;ObligationId&gt;&lt;/ObligationId&gt;
  &lt;/HP_ISEEEntitlementParameters&gt;
&lt;/isee:ISEE-GetOOSEntitlementInfoRequest&gt;
      </isee:request>
    </isee:GetOOSEntitlementList2>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
"@

$xmlstring = [string]$ReturnXml.Envelope.Body.GetOOSEntitlementList2Response.GetOOSEntitlementList2Result.Response

$warranty_info = [xml]@"
$xmlstring
"@

 $warranty_info."ISEE-GetOOSEntitlementInfoResponse"
于 2013-12-06T21:30:40.927 回答
0

您需要转义正在传输的 XML,如下所示。还要确保 TimestampGenerated 的格式也正确。

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:iseeReg="http://www.hp.com/isee/webservices/">
<SOAP-ENV:Body>
    <iseeReg:RegisterClient2>
    <iseeReg:request>&lt;isee:ISEE-Registration xmlns:isee="http://www.hp.com/schemas/isee/5.00/event" schemaVersion="5.00"&gt;
&lt;RegistrationSource&gt;
    &lt;HP_OOSIdentifiers&gt;
    &lt;OSID&gt;
        &lt;Section name="SYSTEM_IDENTIFIERS"&gt;
        &lt;Property name="TimestampGenerated" value="2013/12/05 19:24:58 GMT"/&gt;
        &lt;/Section&gt;
    &lt;/OSID&gt;
    &lt;CSID&gt;
        &lt;Section name="SYSTEM_IDENTIFIERS"&gt;
        &lt;Property name="CollectorType" value="MC3"/&gt;
        &lt;Property name="CollectorVersion" value="T05.80.1 build 1"/&gt;
        &lt;Property name="AutoDetectedSystemSerialNumber" value="10"/&gt;
        &lt;Property name="SystemModel" value="HP ProLiant"/&gt;
        &lt;Property name="TimestampGenerated" value="2013/12/05 19:24:58 GMT"/&gt;
        &lt;/Section&gt;
    &lt;/CSID&gt;
    &lt;/HP_OOSIdentifiers&gt;
    &lt;PRS_Address&gt;
    &lt;AddressType&gt;0&lt;/AddressType&gt;
    &lt;Address1/&gt;
    &lt;Address2/&gt;
    &lt;Address3/&gt;
    &lt;Address4/&gt;
    &lt;City/&gt;
    &lt;Region/&gt;
    &lt;PostalCode/&gt;
    &lt;TimeZone/&gt;
    &lt;Country/&gt;
    &lt;/PRS_Address&gt;
&lt;/RegistrationSource&gt;
&lt;HP_ISEECustomer&gt;
    &lt;Business/&gt;
    &lt;Name/&gt;
&lt;/HP_ISEECustomer&gt;
&lt;HP_ISEEPerson&gt;
    &lt;CommunicationMode&gt;255&lt;/CommunicationMode&gt;
    &lt;ContactType/&gt;
    &lt;FirstName/&gt;
    &lt;LastName/&gt;
    &lt;Salutation/&gt;
    &lt;Title/&gt;
    &lt;EmailAddress/&gt;
    &lt;TelephoneNumber/&gt;
    &lt;PreferredLanguage/&gt;
    &lt;Availability/&gt;
&lt;/HP_ISEEPerson&gt;
&lt;/isee:ISEE-Registration&gt;</iseeReg:request>
    </iseeReg:RegisterClient2>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

另一种选择而不是自己转义 XML 是将它放在 CDATA 中,这样它就不会被解析:http ://www.w3schools.com/xml/xml_cdata.asp

于 2013-12-05T19:48:13.240 回答
0

我们不能只针对公开 URL 执行 http POST 的任何原因:http: //h20564.www2.hpe.com/hpsc/wc/public/find

我们可以像这样使用 curl 进行 http POST(例如,将其放入脚本中):

/usr/bin/curl ' http://h20564.www2.hpe.com/hpsc/wc/public/find ' \ --compressed \ -H '接受:text/html,application/xhtml+xml,application/xml ;q=0.9, / ;q=0.8' \ -H '接受编码:gzip,放气' \ -H '接受语言:en-US,en;q=0.5' \ -H '连接:保持连接' \ -H '主机:h20564.www2.hpe.com' \ -H '推荐人:(此处缺少 https:)h20564.www2.hpe.com/hpsc/wc/public/home' \ -H '升级-不安全-请求:1' \ -H '用户代理:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0' \ -H '内容类型:应用程序/x-www-form -urlencoded' \ --data-binary '@/tmp/data' | grep hpui-标准表

它唯一需要 -H 'Cookie: ' 标头的额外内容。我可以从网络查找中复制相同的 cookie,但我不确定它可以使用多长时间。

数据文件在 /tmp/data 中,格式如下:

rows[0].item.countryCode=US rows[0].item.serialNumber=XXXXXXXXX rows[1].item.countryCode=US rows[1].item.serialNumber=YYYYYYYYY rows[2].item.countryCode=US rows[2].item.serialNumber= rows[3].item.countryCode=US rows[3].item.serialNumber= rows[4].item.countryCode=US rows[4].item.serialNumber= rows[5 ].item.countryCode=美国行[5].item.serialNumber=行[6].item.countryCode=美国行[6].item.serialNumber=行[7].item.countryCode=美国行[7]。 item.serialNumber= rows[8].item.countryCode=US rows[8].item.serialNumber= rows[9].item.countryCode=US rows[9].item.serialNumber= submitButton=Submit

于 2016-10-26T23:19:41.493 回答
0

现在惠普已经开发了获取机器产品保修的api。它处于测试阶段,但是我们可以尝试一下。希望它尽快投入生产。您必须在此处浏览文档并填写他们所需的详细信息。您将拥有自己的 api 密钥来使用。

https://developers.hp.com/css-enroll

谢谢,普拉巴。

于 2016-12-02T10:44:56.440 回答
0

结合我在网上找到的所有信息,我创建了以下函数,它基于Serial Number. 特别感谢dotps1的辛勤工作。

对于惠普:

Function Get-HPAssetInformationHC {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory,ValueFromPipeline)]
        [String]$SerialNumber
    )

    Begin {
        Function Invoke-HPIncSOAPRequest {
            Param (
                [Parameter(Mandatory)]
                [Xml]$SOAPRequest,
                [String]$Url = 'https://api-uns-sgw.external.hp.com/gw/hpit/egit/obligation.sa/1.1'
            )

            $soapWebRequest = [System.Net.WebRequest]::Create($URL) 
            $soapWebRequest.Headers.Add('X-HP-SBS-ApplicationId','hpi-obligation-hpsa')
            $soapWebRequest.Headers.Add('X-HP-SBS-ApplicationKey','ft2VGa2hx9j$')
            $soapWebRequest.ContentType = 'text/xml; charset=utf-8'
            $soapWebRequest.Accept = 'text/xml'
            $soapWebRequest.Method = 'POST'

            try {
                $SOAPRequest.Save(($requestStream = $soapWebRequest.GetRequestStream()))
                $requestStream.Close() 
                $responseStream = ($soapWebRequest.GetResponse()).GetResponseStream()
                [XML]([System.IO.StreamReader]($responseStream)).ReadToEnd()
                $responseStream.Close() 
            }
            catch {
                throw $_
            }
        }
    }

    Process {
        foreach ($S in $SerialNumber) {
            $request = @"
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:int="http://interfaces.obligation.sbs.it.hp.com/">
  <soapenv:Header />
  <soapenv:Body>
    <int:retrieveServiceObligationResponsesByServiceObligationRequests>
      <context>
        <appContextName>HPSF</appContextName>
        <userLocale>en-US</userLocale>
      </context>
      <obligationRequests>
        <lnkServiceObligationDepthFilter>
          <includeProductObjectOfServiceInstance>true</includeProductObjectOfServiceInstance>
          <includeServiceObligation>true</includeServiceObligation>
          <includeServiceObligationHeaderOffer>true</includeServiceObligationHeaderOffer>
          <includeServiceObligationMessage>true</includeServiceObligationMessage>
          <maxNumberOfProductObjectOfServiceInstance>100</maxNumberOfProductObjectOfServiceInstance>
        </lnkServiceObligationDepthFilter>
        <lnkServiceObligationEnrichment>
          <iso2CountryCode>US</iso2CountryCode>
        </lnkServiceObligationEnrichment>
        <lnkServiceObligationProductObjectOfServiceIdentifier>
          <hpSerialNumber>$S</hpSerialNumber>
        </lnkServiceObligationProductObjectOfServiceIdentifier>
      </obligationRequests>
    </int:retrieveServiceObligationResponsesByServiceObligationRequests>
  </soapenv:Body>
</soapenv:Envelope>
"@

            Try {
                [XML]$entitlement = Invoke-HPIncSoapRequest -SOAPRequest $request -ErrorAction Stop
            }
            Catch {
                $P = $_
                $Global:Error.RemoveAt(0)
                throw "Failed to invoke SOAP request: $P"
            }

            Try {
                if ($entitlement) {
                    $HPAsset = $entitlement.Envelope.Body.retrieveServiceObligationResponsesByServiceObligationRequestsResponse.return

                    [PSCustomObject][Ordered]@{
                        SerialNumber           = $S
                        ProductNumber          = $HPAsset.lnkProductObjectOfServiceInstance.ProductNumber
                        SalesOrderNumber       = $HPAsset.lnkServiceObligations.salesOrderNumber | where {$_}
                        ProductDescription     = $HPAsset.lnkProductObjectOfServiceInstance.productDescription
                        ProductLineDescription = $HPAsset.lnkProductObjectOfServiceInstance.productLineDescription
                        ActiveEntitlement      = $HPAsset.lnkServiceObligations.serviceObligationActiveIndicator
                        OfferDescription       = $HPAsset.lnkServiceObligationHeaderOffer | where serviceQuantity -GE 1 | Select-Object -ExpandProperty offerDescription
                        StartDate              = $HPAsset.lnkServiceObligations.serviceObligationStartDate | ForEach-Object {[DateTime]$_}
                        EndDate                = $HPAsset.lnkServiceObligations.serviceObligationEndDate | ForEach-Object {[DateTime]$_}
                    }

                    Write-Verbose "HP asset '$($HPAsset.lnkProductObjectOfServiceInstance.productDescription)' with serial number '$S'"
                }
                else {
                    Write-Warning "No HP asset information found for serial number '$S'"
                    continue
                }
            }
            Catch {
                $P = $_
                $Global:Error.RemoveAt(0)
                throw "Failed to invoke SOAP request: $P"
            }
        }
    }
}

对于戴尔:

Function Get-DellAssetInformationHC {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [String[]]$SerialNumber
    )

    Begin {
        # Possible API keys
        # 1adecee8a60444738f280aad1cd87d0e
        # d676cf6e1e0ceb8fd14e8cb69acd812d
        # 1adecee8a60444738f280aad1cd87d0e
        # 849e027f476027a394edd656eaef4842

        $APIKey = '849e027f476027a394edd656eaef4842'
    }

    Process {
        foreach ($S in $SerialNumber) {
            Try {
                $DellURL = "https://api.dell.com/support/v2/assetinfo/warranty/tags.xml?svctags=$S&apikey=$APIKey"

                $XML = New-Object System.Xml.XmlDocument
                $XML.Load($DellURL)
                $DellAsset = $XML.GetAssetWarrantyResponse.GetAssetWarrantyResult.Response.DellAsset

                if ($DellAsset) {
                    [PSCustomObject][Ordered]@{
                        SerialNumber            = $S
                        CustomerNumber          = $DellAsset.CustomerNumber
                        OrderNumber             = $DellAsset.OrderNumber
                        MachineDescription      = $DellAsset.MachineDescription
                        ShipDate                = $DellAsset.ShipDate
                        ServiceLevelDescription = $DellAsset.Warranties.Warranty.ServiceLevelDescription
                        StartDate               = $DellAsset.Warranties.Warranty.StartDate | ForEach-Object {[DateTime]$_}
                        EndDate                 = $DellAsset.Warranties.Warranty.EndDate | ForEach-Object {[DateTime]$_}
                    }

                    Write-Verbose "Dell asset '$($DellAsset.MachineDescription)' with serial number '$S'"
                }
                else {
                    Write-Warning "No Dell asset information found for serial number '$S'"
                }
            }
            Catch {
                $P = $_
                $Global:Error.RemoveAt(0)
                throw "Failed retrieving Dell asset information for serial number '$S': $P"
            }
        }
    }
}
于 2016-08-31T08:23:12.250 回答