PowerShell / .Net - Google API联系人修改:PUT请求401未经授权

时间:2015-03-27 09:36:15

标签: powershell gdata google-contacts google-shared-contacts google-profiles-api

我正在尝试使用.Net API修改Gmail帐户中的联系人,并将其加载到PowerShell中。 我正在执行described here步骤(更新联系人,Doh!)

  

要更新联系人,请首先检索联系人条目,修改数据并将授权的PUT请求发送到联系人的编辑URL以及正文中修改后的联系人条目。

好的,得到它所以我成功地使用这段代码检索联系信息:

$Settings = New-Object Google.GData.Client.RequestSettings( "MyApp", $username , $password )
$Credentials = New-Object System.Net.NetworkCredential( $username, $password )

$Request = New-Object Google.Contacts.ContactsRequest( $Settings )
$Contacts = $Request.GetContacts()
$GoogleContact = $Contacts.Entries |? { $_.PrimaryEmail.Address -eq "john.doe@gmail.com" }
$GoogleContact.Title

当然,我收到了来自谷歌的邮件消息,表明外部应用程序出现了问题,我更改了一个安全参数以允许此代码工作...... 它有效,代码正在提示我的Google联系人标题。

现在,我的问题:
我正在更改我的对象上的属性:

$GoogleContact.Title = "Mac Gyver"

我正在使用一个名为Execute-HTTPPostCommand的函数,稍加修改以添加谷歌所需的Etag值,以确保我没有修改在其他地方实际修改过的条目:

function Execute-HTTPPostCommand() {
    param(
        [string] $TargetUrl = $null
        ,[string] $PostData = $null
        ,$Credentials
        ,$Etag
    )

    $ErrorActionPreference = "Stop"
    $global:webRequest = [System.Net.WebRequest]::Create($TargetUrl)
    $webRequest.Headers.Add("etag", $Etag )
    $webRequest.ContentType = "text/html"
    $PostStr = [System.Text.Encoding]::UTF8.GetBytes($PostData)
    $webrequest.ContentLength = $PostStr.Length
    $webRequest.ServicePoint.Expect100Continue = $false
    $webRequest.Credentials = $Credentials

    $webRequest.PreAuthenticate = $true
    $webRequest.Method = "PUT"

    $Global:requestStream = $webRequest.GetRequestStream()
    $requestStream.Write($PostStr, 0,$PostStr.length)
    $requestStream.Close()

    [System.Net.WebResponse] $global:resp = $webRequest.GetResponse();
    $rs = $resp.GetResponseStream();
    [System.IO.StreamReader] $sr = New-Object System.IO.StreamReader -argumentList $rs;
    [string] $results = $sr.ReadToEnd();

    return $results;
}

以这种方式调用它:

Execute-HTTPPostCommand -TargetUrl $GoogleContact.Id -PostData $GoogleContact -Credentials $Credentials -Etag $GoogleContact.ETag

Contact.ID值是Google更新联系人所需的网址,如下所示:https://www.google.com/m8/feeds/contacts/userEmail/full/ {contactId}

我收到错误401:未经授权。 作为Windows系统管理员,我不熟悉Web服务PUT请求...... 我使用相同的凭据来读取数据并尝试更新数据。 我错过了什么?

1 个答案:

答案 0 :(得分:0)

好的,这很简单,我应该有RTFM ......

#Loading Google API
$Settings = New-Object Google.GData.Client.RequestSettings( "MyApp", $username , $password )
$Credentials = New-Object System.Net.NetworkCredential( $username, $password )

#Loading Contacts, and getting the one I want
$Request = New-Object Google.Contacts.ContactsRequest( $Settings )
$Contacts = $Request.GetContacts()
$GoogleContact = $Contacts.Entries |? { $_.PrimaryEmail.Address -eq "john.doe@gmail.com" }

#Updating the fields
$GoogleContact.Name.FullName = "Mac Gyver"
$GoogleContact.Name.GivenName = "Mac"
$GoogleContact.Name.FamilyName = "Gyver"
$GoogleContact.Title = "Handyman Masterchief"

#Update
$MAJ = $ContactRequest.Update($GoogleContact)

它的工作原理就像.Net示例一样。

无需加载繁重的PUT请求,API可以完成他的工作。

抱歉时间没人了!