# encoding: ascii # api: powershell # title: Twitter Moduleb # description: Social Media Scripting Framework – Twitter Library # version: 0.2 # type: script # author: Carlos Veira Lorenzo # license: GNU GPL # function: Get-TweetRetweetsFromPage # x-poshcode-id: 3988 # x-archived: 2013-05-23T06:20:09 # x-published: 2013-02-24T12:45:00 # # <# ------------------------------------------------------------------------------- Name: Social Media Scripting Framework Module: Twitter Version: 0.2 BETA Date: 2013/02/03 Author: Carlos Veira Lorenzo e-mail: cveira [at] thinkinbig [dot] org blog: thinkinbig.org twitter: @cveira facebook: www.facebook.com/cveira Google+: gplus.to/cveira LinkedIn: es.linkedin.com/in/cveira/ ------------------------------------------------------------------------------- Support: http://thinkinbig.org/oms/ Forums & Communities: facebook.com/ThinkInBig gplus.to/ThinkInBig http://bit.ly/SMSF-Forum ------------------------------------------------------------------------------- Code Mirror Sites: https://smsf.codeplex.com/ https://github.com/cveira/social-media-scripting-framework https://code.google.com/p/social-media-scripting-framework/ http://sourceforge.net/projects/smsf/ ------------------------------------------------------------------------------- Social Media Scripting Framework. Copyright (C) 2013 Carlos Veira Lorenzo. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ------------------------------------------------------------------------------- #> [Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null [Reflection.Assembly]::LoadWithPartialName("System.Net") | Out-Null [string] $TweetContentPattern = '((?s)]*js-tweet-text tweet-text[^>]*>(?.*?)

.*?' + ` ']*js-stat-count js-stat-retweets stat-count[^>]*>(?.*?).*?' + ` ']*js-stat-count js-stat-favorites stat-count[^>]*>(?.*?))|' + ` '((?s)]*js-tweet-text tweet-text[^>]*>(?.*?)

.*?' + ` ']*js-stat-count js-stat-retweets stat-count[^>]*>(?.*?))|' + ` '((?s)]*js-tweet-text tweet-text[^>]*>(?.*?)

.*?' + ` ']*js-stat-count js-stat-favorites stat-count[^>]*>(?.*?))|' + ` '((?s)]*js-tweet-text tweet-text[^>]*>(?.*?)

)' $TwitterTimeOut = 3 * 60 * 1000 # seconds $TwitterUserAgent = "PowerShell" # -------------------------------------------------------------------------------------------------- function Get-TweetRetweetsFromPage( [ref] $PageSourceCode ) { # $SourceCode = Get-PageSourceCode https://twitter.com/cveira/status/275929500183830529 # Get-TweetRetweetsFromPage ([ref] $SourceCode) [string] $RetweetsCountPattern = ']*[^>]*>(?.*?)' if ( $PageSourceCode.Value -match $TweetContentPattern ) { if ( $Matches.ReTweetStats -match $RetweetsCountPattern ) { $Matches.RetweetsCount } else { 0 } } else { 0 } } function Get-TweetFavoritesFromPage( [ref] $PageSourceCode ) { # $SourceCode = Get-PageSourceCode https://twitter.com/cveira/status/275929500183830529 # Get-TweetFavoritesFromPage ([ref] $SourceCode) [string] $FavoritesCountPattern = ']*[^>]*>(?.*?)' if ( $PageSourceCode.Value -match $TweetContentPattern ) { if ( $Matches.FavoritesStats -match $FavoritesCountPattern ) { $Matches.FavoritesCount } else { 0 } } else { 0 } } function Get-TweetContentFromPage( [ref] $PageSourceCode ) { # $SourceCode = Get-PageSourceCode https://twitter.com/cveira/status/275929500183830529 # Get-TweetContentFromPage ([ref] $SourceCode) if ( $PageSourceCode.Value -match $TweetContentPattern ) { $Matches.TweetContent } else { "N/D" } } function Get-TweetLinksFromPage( [ref] $PageSourceCode ) { # $SourceCode = Get-PageSourceCode https://twitter.com/cveira/status/275929500183830529 # Get-TweetLinksFromPage ([ref] $SourceCode) [RegEx] $LinksPattern = '(data-expanded-url="(.*?)")+' [string[]] $TweetLinks = @() if ( $PageSourceCode.Value -match $TweetContentPattern ) { $CurrentMatch = $LinksPattern.match($Matches.TweetContent) if (!$CurrentMatch.Success) { $TweetLinks += "N/D" } while ($CurrentMatch.Success) { $TweetLinks += $CurrentMatch.Value.Split('"')[1] $CurrentMatch = $CurrentMatch.NextMatch() } } else { $TweetLinks += "N/D" } $TweetLinks } function Get-TweetHashTagsFromPage( [ref] $PageSourceCode ) { # $SourceCode = Get-PageSourceCode https://twitter.com/cveira/status/275929500183830529 # Get-TweetHashTagsFromPage ([ref] $SourceCode) [string] $HashTagNamePattern = "%23(?.*?)&" [RegEx] $LinksPattern = '(href="(.*?)")+' [string[]] $TweetLinks = @() if ( $PageSourceCode.Value -match $TweetContentPattern ) { $CurrentMatch = $LinksPattern.match($Matches.TweetContent) if (!$CurrentMatch.Success) { $TweetLinks += "N/D" } while ($CurrentMatch.Success) { if ( $CurrentMatch.Value -match $HashTagNamePattern ) { $TweetLinks += $Matches.HashTag } $CurrentMatch = $CurrentMatch.NextMatch() } } else { $TweetLinks += "N/D" } $TweetLinks } # -------------------------------------------------------------------------------------------------- function EscapeDataStringRfc3986( [string] $text ) { [string[]] $Rfc3986CharsToEscape = @( "!", "*", "'", "(", ")" ) [string] $EscapedText = [System.Uri]::EscapeDataString($text) for ( $i = 0; $i -lt $Rfc3986CharsToEscape.Length; $i++ ) { $EscapedText = $EscapedText.Replace( $Rfc3986CharsToEscape[$i], [System.Uri]::HexEscape($Rfc3986CharsToEscape[$i]) ) } $EscapedText } function Set-OAuthSignature( [string] $HttpRequestType, [string] $HttpEndpoint, [string] $HttpQueryString, [string] $OAuthNonce, [string] $OAuthTimeStamp, [string] $OAuthConsumerKey, [string] $OAuthConsumerSecret, [string] $OAuthToken, [string] $OAuthTokenSecret ) { [string[]] $HttpQueryStringParameters $ParameterString = @{} if ( $HttpQueryString.Length -gt 0 ) { $HttpQueryStringParameters = $HttpQueryString.Split("&") $HttpQueryStringParameters | ForEach-Object { $ParameterString.Add( $_.Split("=")[0], $_.Split("=")[1] ) } } $ParameterString.Add( "oauth_consumer_key", $OAuthConsumerKey ) $ParameterString.Add( "oauth_nonce", $OAuthNonce ) $ParameterString.Add( "oauth_signature_method", "HMAC-SHA1" ) $ParameterString.Add( "oauth_timestamp", $OAuthTimeStamp ) $ParameterString.Add( "oauth_token", $OAuthToken ) $ParameterString.Add( "oauth_version", "1.0" ) $signature = $HttpRequestType + "&" # 1. The URL in the signature string HAS NO QUERY_STRING PARAMETERS $signature += [System.Uri]::EscapeDataString($HttpEndpoint) + "&" # 2. All the parameters included in the QUERY_STRING {when calling [System.Net.WebRequest]::Create()} have to be included in the signature # 3. When building the signature string, parameters must be in alphabetical order. $ParameterString.Keys | Sort-Object | ForEach-Object { # [System.Uri]::EscapeDataString($_ + "=" + $ParameterString.$_ + "&") is not RFC3986 compliant in .NET < 4.x! # RFC3986 compliancy is documented in OAuth 1.0A, not in Twitter documentation! $signature += EscapeDataStringRfc3986 $($_ + "=" + $ParameterString.$_ + "&") } $signature = $signature.Substring(0, $signature.Length - 3) $SignatureKey = [System.Uri]::EscapeDataString($OAuthConsumerSecret) + "&" + [System.Uri]::EscapeDataString($OAuthTokenSecret) $Hasher = New-Object System.Security.Cryptography.HMACSHA1 $Hasher.Key = [System.Text.Encoding]::ASCII.GetBytes($SignatureKey) $OAuthSignature = [System.Convert]::ToBase64String($Hasher.ComputeHash([System.Text.Encoding]::ASCII.GetBytes($signature))) $OAuthSignature } function Set-OAuthHeader( [string] $OAuthConsumerKey, [string] $OAuthNonce, [string] $OAuthSignature, [string] $OAuthTimeStamp, [string] $OAuthToken ) { $OAuthHeader = 'OAuth ' $OAuthHeader += 'oauth_consumer_key="' + [System.Uri]::EscapeDataString($OAuthConsumerKey) + '", ' $OAuthHeader += 'oauth_nonce="' + [System.Uri]::EscapeDataString($OAuthNonce) + '", ' $OAuthHeader += 'oauth_signature="' + [System.Uri]::EscapeDataString($OAuthSignature) + '", ' $OAuthHeader += 'oauth_signature_method="HMAC-SHA1", ' $OAuthHeader += 'oauth_timestamp="' + [System.Uri]::EscapeDataString($OAuthTimeStamp) + '", ' $OAuthHeader += 'oauth_token="' + [System.Uri]::EscapeDataString($OAuthToken) + '", ' $OAuthHeader += 'oauth_version="1.0"' $OAuthHeader } function Get-RawTweetRetweetedByAsXml( [string] $TweetPermaLink ) { # Get-RawTweetRetweetedByAsXml https://twitter.com/cveira/status/275929500183830529 [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1/statuses/" + $TweetPermaLink.Split("/")[5] + "/retweeted_by.xml" $HttpEndpoint = $ApiURL $HttpQueryString = "" $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() | Select-String -NotMatch "api.twitter.com" | ForEach-Object { $TwitterRawResponse += $_ } | Out-Null $TwitterRawResponse } $response.Close() } catch { $_.Exception.Message } } function Get-RawTweetRetweetedBy( [string] $TweetPermaLink ) { # Get-RawTweetRetweetedBy https://twitter.com/cveira/status/275929500183830529 [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1/statuses/" + $TweetPermaLink.Split("/")[5] + "/retweeted_by.xml" $HttpEndpoint = $ApiURL $HttpQueryString = "" $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() | Select-String -NotMatch "api.twitter.com" | ForEach-Object { $TwitterRawResponse += $_ } | Out-Null [xml] $TwitterRawResponse | ForEach-Object { $_.users.user } | ForEach-Object { New-Object PSObject -Property @{ Name = $_.name ScreenName = $_.screen_name Description = $_.description URL = $_.url Friends = $_.friends_count Followers = $_.followers_count Tweets = $_.statuses_count Listed = $_.listed_count } } } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterMentionsAsJson { # https://dev.twitter.com/docs/api/1.1/get/statuses/mentions_timeline # Get-RawTwitterMentionsAsJson | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/statuses/mentions_timeline.json?count=20&include_entities=true&include_rts=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTweetRetweetsAsJson( [string] $TweetPermaLink ) { # https://dev.twitter.com/docs/api/1.1/get/statuses/retweets/%3Aid # Get-RawTweetRetweetsAsJson https://twitter.com/cveira/status/275929500183830529 | ConvertFrom-Json # Get-RawTweetRetweetsAsJson http://twitter.com/TechCrunch/status/282712924752060417 | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/statuses/retweets/" + $TweetPermaLink.Split("/")[5] + ".json?count=100" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterUserAsJson( [string] $UserName ) { # https://dev.twitter.com/docs/api/1.1/get/users/show # Get-RawTwitterUserAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/users/show.json?screen_name=" + $UserName.Trim() + "&include_entities=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTweetAsJson( [string] $TweetPermaLink ) { # https://dev.twitter.com/docs/api/1.1/get/statuses/show/%3Aid # Get-RawTweetAsJson https://twitter.com/cveira/status/275929500183830529 | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/statuses/show.json?id=" + $TweetPermaLink.Split("/")[5] + "&include_entities=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterFavoritesAsJson( [string] $UserName ) { # https://dev.twitter.com/docs/api/1.1/get/favorites/list # Get-RawTwitterFavoritesAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/favorites/list.json?count=20&screen_name=" + $UserName.Trim() + "&include_entities=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTweetsFromUserAsJson( [string] $UserName, [int] $results = 20, [string] $FirstId = "", [string] $LastId = "" ) { # https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline # Get-RawTweetsFromUserAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $FilterParameters = "" if ( ( $FirstId -ne "" ) -and ( $FirstId -match "\d+" ) ) { $FilterParameters += "&max_id=" + $FirstId } if ( ( $LastId -ne "" ) -and ( $LastId -match "\d+" ) ) { $FilterParameters += "&since_id=" + $LastId } [string] $ApiURL = "http://api.twitter.com/1.1/statuses/user_timeline.json?include_entities=true&include_rts=true&exclude_replies=true&count=" + $results + $FilterParameters + "&screen_name=" + $UserName.Trim() if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterTimeLineAsJson { # https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline # Get-RawTwitterTimeLineAsJson | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/statuses/home_timeline.json?include_entities=true&count=20" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterSearchAsJson( [string] $query, [int] $ResultsPerPage = 20, [string] $Language = "", [string] $ResultType = "", [string] $StartDate = "", [string] $GeoCode = "", [int64] $SinceId = 0, [int64] $MaxId = 0 ) { # https://dev.twitter.com/docs/api/1.1/get/search/tweets # https://dev.twitter.com/docs/using-search # https://dev.twitter.com/docs/working-with-timelines # Get-RawTwitterSearchAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $SearchParameters = "include_entities=true" if ( $ResultType -eq "" ) { $SearchParameters += "&result_type=mixed" } else { switch ( $ResultType ) { "mixed" { $SearchParameters += "&result_type=mixed" } "recent" { $SearchParameters += "&result_type=recent" } "popular" { $SearchParameters += "&result_type=popular" } default { $SearchParameters += "&result_type=mixed" } } } if ( ( $StartDate -ne "" ) -and ( $StartDate -match "\d{4}-\d{2}-\d{2}" ) ) { $SearchParameters += "&until=" + $StartDate } if ( ( $GeoCode -ne "" ) -and ( $GeoCode -match "(\-*[\d\.]+),(\-*[\d\.]+),(\d+)(km|mi)" ) ) { $SearchParameters += "&geocode=" + $GeoCode } if ( $SinceId -ne 0 ) { $SearchParameters += "&since_id=" + $SinceId } if ( $MaxId -ne 0 ) { $SearchParameters += "&max_id=" + $MaxId } $SearchParameters += "&count=" + $ResultsPerPage + "&q=" [string] $ApiURL = "http://api.twitter.com/1.1/search/tweets.json?" + $SearchParameters + [System.Uri]::EscapeDataString($query.Trim()) if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Send-Tweet ( [string] $TweetMessage ) { # https://dev.twitter.com/docs/api/1.1/post/statuses/update # Send-Tweet "This is my first Tweet from #PowerShell using, raw #DotNet and #OAuth!" [string] $HttpRequestType = "POST" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/statuses/update.json" if ( $TweetMessage.Length -gt 140 ) { $TweetMessage = $TweetMessage.Substring(0,140) } # Body POST Data format is NOT documented! # look at how the supplied example looks like @ https://dev.twitter.com/docs/api/1.1/post/statuses/update [byte[]] $HttpPostBody = [System.Text.Encoding]::UTF8.GetBytes( "status=" + ( EscapeDataStringRfc3986 ($TweetMessage) ) ) $HttpEndpoint = $ApiURL # The 'status' parameter gets encoded TWICE in the OAuth signature. This detail is NOT documented! # Run an example with the OAuth Tool and look at the results for the OAuth signature. # [System.Uri]::EscapeDataString() is not RFC3986 compliant in .NET < 4.x! # RFC3986 compliancy is documented in OAuth 1.0A, not in Twitter documentation! $HttpQueryString = "status=" + (EscapeDataStringRfc3986 $TweetMessage) $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.ContentLength = $HttpPostBody.Length $request.ServicePoint.Expect100Continue = $false $request.Headers.Add("Authorization", $OAuthHeader) try { [System.IO.Stream] $RequestBody = $request.GetRequestStream() $RequestBody.Write($HttpPostBody, 0, $HttpPostBody.Length) # $RequestBody.Flush() $RequestBody.Close() [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterListSubscribersAsJson( [string] $TweetPermaLink, [string] $PageId = "-1" ) { # https://dev.twitter.com/docs/api/1.1/get/lists/subscribers # Get-RawTwitterListSubscribersAsJson https://twitter.com/cveira/cloud | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/lists/subscribers.json?slug=" + $TweetPermaLink.Split("/")[4] + "&owner_screen_name=" + $TweetPermaLink.Split("/")[3] + "&include_entities=true&cursor=" + $PageId + "&skip_status=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterListMembersAsJson( [string] $TweetPermaLink, [string] $PageId = "-1" ) { # https://dev.twitter.com/docs/api/1.1/get/lists/members # Get-RawTwitterListMembersAsJson https://twitter.com/cveira/cloud | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/lists/members.json?slug=" + $TweetPermaLink.Split("/")[4] + "&owner_screen_name=" + $TweetPermaLink.Split("/")[3] + "&include_entities=true&cursor=" + $PageId + "&skip_status=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterListTimeLineAsJson( [string] $TweetPermaLink, [int] $ResultsPerPage = 20 ) { # https://dev.twitter.com/docs/api/1.1/get/lists/statuses # Get-RawTwitterListTimeLineAsJson https://twitter.com/cveira/cloud | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/lists/statuses.json?slug=" + $TweetPermaLink.Split("/")[4] + "&owner_screen_name=" + $TweetPermaLink.Split("/")[3] + "&count=" + $ResultsPerPage + "&include_entities=true&include_rts=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterUserFriendsFromUserAsJson( [string] $UserName, [string] $PageId = "-1" ) { # https://dev.twitter.com/docs/api/1.1/get/friends/list # Get-RawTwitterUserFriendsFromUserAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/friends/list.json?screen_name=" + $UserName.Trim() + "&include_entities=true&cursor=" + $PageId + "&skip_status=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterFollowersFromUserAsJson( [string] $UserName, [string] $PageId = "-1" ) { # https://dev.twitter.com/docs/api/1.1/get/followers/list # Get-RawTwitterFollowersFromUserAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/followers/list.json?screen_name=" + $UserName.Trim() + "&include_entities=true&cursor=" + $PageId + "&skip_status=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } function Get-RawTwitterUserAsJson( [string] $UserName ) { # https://dev.twitter.com/docs/api/1.1/get/users/show # Get-RawTwitterUserAsJson cveira | ConvertFrom-Json [string] $HttpRequestType = "GET" [string] $HttpEndpoint = "" [string] $HttpQueryString = "" [string] $TwitterRawResponse = "" [string] $ApiURL = "http://api.twitter.com/1.1/users/show.json?screen_name=" + $UserName.Trim() + "&include_entities=true" if ( $ApiURL.IndexOf("?") -ne -1 ) { $HttpEndpoint = $ApiURL.Split("?")[0] $HttpQueryString = $ApiURL.Split("?")[1] } else { $HttpEndpoint = $ApiURL $HttpQueryString = "" } $OAuthConsumerKey = $TwitterConsumerKey $OAuthConsumerSecret = $TwitterConsumerSecret $OAuthToken = $TwitterAccessToken $OAuthTokenSecret = $TwitterAccessTokenSecret $OAuthNonce = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes([System.DateTime]::Now.Ticks.ToString())) $TimeStamp = [System.DateTime]::UtcNow - [System.DateTime]::ParseExact("01/01/1970", "dd/MM/yyyy", $null).ToUniversalTime() $OAuthTimeStamp = [System.Convert]::ToInt64($TimeStamp.TotalSeconds).ToString() $OAuthSignature = Set-OAuthSignature $HttpRequestType $HttpEndpoint $HttpQueryString $OAuthNonce $OAuthTimeStamp $OAuthConsumerKey $OAuthConsumerSecret $OAuthToken $OAuthTokenSecret $OAuthHeader = Set-OAuthHeader $OAuthConsumerKey $OAuthNonce $OAuthSignature $OAuthTimeStamp $OAuthToken [System.Net.HttpWebRequest] $request = [System.Net.WebRequest]::Create($ApiURL) $request.Method = $HttpRequestType $request.UserAgent = $TwitterUserAgent $request.Timeout = $TwitterTimeOut $request.ContentType = "application/x-www-form-urlencoded" $request.Headers.Add("Authorization", $OAuthHeader) try { [System.Net.HttpWebResponse] $response = $request.GetResponse() if ( $response -ne $null ) { $ResponseStream = New-Object System.IO.StreamReader($response.GetResponseStream()) $ResponseStream.ReadToEnd().Trim() } $response.Close() } catch { $_.Exception.Message } } # -------------------------------------------------------------------------------------------------- function Get-TwitterProfile( [string] $UserName ) { Get-RawTwitterUserAsJson $UserName | ConvertFrom-JSON } function Get-UnpagedFollowerList( [object[]] $PagedFollowersList ) { $UnpagedFollowers = @() $PagedFollowersList | ForEach-Object { $UnpagedFollowers += $_.users } $UnpagedFollowers = $UnpagedFollowers | Select-Object * -unique $UnpagedFollowers } function Get-TwitterFollowers( [string] $UserName ) { begin { [PSCustomObject[]] $RawFollowersPages = @() $CurrentPage = $null $TimeToWait = 66 $FollowersPerPage = 20 $PageCount = 0 [int] $TotalFollowers = ( Get-RawTwitterUserAsJson $UserName | ConvertFrom-JSON ).followers_count } process { try { $PageCount = 1 $CurrentPage = Get-RawTwitterFollowersFromUserAsJson $UserName | ConvertFrom-JSON $RawFollowersPages += $CurrentPage do { Write-Progress -Activity "Retrieving Followers ..." -Status "Progress: " -PercentComplete ( (($PageCount * $FollowersPerPage) / $TotalFollowers) * 100 ) $PageCount++ $RawFollowersPages += $CurrentPage Start-Sleep -Seconds $TimeToWait $CurrentPage = Get-RawTwitterFollowersFromUserAsJson $UserName -PageId $CurrentPage.next_cursor | ConvertFrom-JSON } until ( $CurrentPage.next_cursor -eq 0 ) } catch { [PSCustomObject[]] $RawFollowersPages = @() $_.Exception.Message } } end { Get-UnpagedFollowerList $RawFollowersPages # $RawFollowersPages } } function Get-TweetsFromUser( [string] $UserName, [int] $results = 20, [switch] $quick, [switch] $IncludeAll ) { # Get-TweetsFromUser cveira -results 250 -quick # $DebugPreference = "Continue" [PSObject[]] $TimeLine = @() [PSObject[]] $tweets = @() $SourcePattern = '((?s)]*[^>]*>(?.*?))' $TwitterMaxResults = 100 $TimeToWait = 6 $ExtendedTimeToWait = 0 $TimeToWaitForRTs = 66 $TimeToWaitForFavs = 66 $IncludeRTs = $false $IncludeFavorites = $false if ( $quick ) { $IncludeAll = $false $IncludeRTs = $false $IncludeFavorites = $false } elseif ( $IncludeAll ) { $IncludeRTs = $true $IncludeFavorites = $true } if ( $TimeToWaitForRTs -ge $TimeToWaitForFavs ) { $ExtendedTimeToWait = $TimeToWaitForRTs } else { $ExtendedTimeToWait = $TimeToWaitForFavs } if ( $results -lt $TwitterMaxResults ) { $tweets = Get-RawTweetsFromUserAsJson -UserName $UserName -results $results | ConvertFrom-Json } else { do { Write-Progress -Activity "Retrieving Tweets ..." -Status "Progress: $($tweets.Count) / $results" -PercentComplete ( ( $($tweets.Count) / $results ) * 100 ) $CurrentTweets = Get-RawTweetsFromUserAsJson -UserName $UserName -results $TwitterMaxResults -FirstId $LastId | ConvertFrom-Json Write-Debug "[INFO] Retrieved Tweets: $($tweets.Count)" Write-Debug "[INFO] CurrentTweets count: $($CurrentTweets.Count)" Write-Debug "[INFO] LastId: $LastId" Write-Debug "[INFO] FirstId: $($CurrentTweets[0].id)" if ( $CurrentTweets[0].id -eq $LastId ) { $FirstTweet = 1 } else { $FirstTweet = 0 } $LastId = $CurrentTweets[ ( $CurrentTweets.Count - 1 ) ].id $tweets += $CurrentTweets[ $FirstTweet..($CurrentTweets.Count - 1) ] Start-Sleep -Seconds $TimeToWait } until ( $tweets.Count -gt $results ) $tweets = $tweets[0..( $results - 1 )] } if ( $quick ) { $tweets } else { $i = 1 $tweets | ForEach-Object { if ( $IncludeAll ) { Write-Progress -Activity "Normalizing Information ..." -Status "Progress: $i / $results - ETC: $( (( $results - $i ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes - Time Elapsed: $( (( $i - 1 ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes" -PercentComplete ( ( $i / $results ) * 100 ) } else { Write-Progress -Activity "Normalizing Information ..." -Status "Progress: $i / $results" -PercentComplete ( ( $i / $results ) * 100 ) } $NewTweet = $_ $NewTweet.user = $NewTweet.user.screen_name if ( $NewTweet.source -match $SourcePattern ) { $NewTweet.source = $Matches.TweetSource } Write-Debug ".Links not exists: $( $NewTweet.Links -eq $null )" if ( $NewTweet.Links -eq $null ) { $NewTweet | Add-Member -NotePropertyName Links -NotePropertyValue $NewTweet.entities.urls.expanded_url } else { $NewTweet.Links = $NewTweet.entities.urls.expanded_url } Write-Debug ".HashTags not exists: $( $null -eq $NewTweet.HashTags )" if ( $null -eq $NewTweet.HashTags ) { $NewTweet | Add-Member -NotePropertyName HashTags -NotePropertyValue $NewTweet.entities.hashtags.text -force } else { $NewTweet.HashTags = $NewTweet.entities.hashtags.text } Write-Debug ".Mentions not exists: $( $null -eq $NewTweet.Mentions )" if ( $null -eq $NewTweet.Mentions ) { $NewTweet | Add-Member -NotePropertyName Mentions -NotePropertyValue $NewTweet.entities.user_mentions.screen_name -force } else { $NewTweet.Mentions = $NewTweet.entities.user_mentions.screen_name } Write-Debug ".PermaLink not exists: $( $NewTweet.PermaLink -eq $null )" if ( $NewTweet.retweeted_status.user.screen_name -eq $null ) { if ( $NewTweet.PermaLink -eq $null ) { $NewTweet | Add-Member -NotePropertyName PermaLink -NotePropertyValue "https://twitter.com/$($NewTweet.user)/status/$($NewTweet.id)" } else { $NewTweet.PermaLink = "https://twitter.com/$($NewTweet.user)/status/$($NewTweet.id)" } } else { if ( $NewTweet.PermaLink -eq $null ) { $NewTweet | Add-Member -NotePropertyName PermaLink -NotePropertyValue "https://twitter.com/$($NewTweet.retweeted_status.user.screen_name)/status/$($NewTweet.retweeted_status.id)" } else { $NewTweet.PermaLink = "https://twitter.com/$($NewTweet.retweeted_status.user.screen_name)/status/$($NewTweet.retweeted_status.id)" } } Write-Debug "[INFO] PermaLink: $($NewTweet.PermaLink)" if ( $IncludeRTs ) { if ( $IncludeAll ) { Write-Progress -Activity "Retrieving Retweets ..." -Status "Progress: $i / $results - ETC: $( (( $results - $i ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes - Time Elapsed: $( (( $i - 1 ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes" -PercentComplete ( ( $i / $results ) * 100 ) } else { Write-Progress -Activity "Retrieving Retweets ..." -Status "Progress: $i / $results" -PercentComplete ( ( $i / $results ) * 100 ) } Write-Debug ".retweets not exists: $( $NewTweet.entities.retweets -eq $null )" if ( $NewTweet.entities.retweets -eq $null ) { $NewTweet.entities | Add-Member -NotePropertyName retweets -NotePropertyValue @() } else { $NewTweet.entities.retweets = @() } Write-Debug ".Interactions not exists: $( $NewTweet.Interactions -eq $null )" if ( $NewTweet.Interactions -eq $null ) { $NewTweet | Add-Member -NotePropertyName Interactions -NotePropertyValue @() } else { $NewTweet.Interactions = @() } $NewTweet.entities.retweets = Get-RawTweetRetweetsAsJson $NewTweet.PermaLink | ConvertFrom-Json # $NewTweet.retweet_count = $NewTweet.entities.retweets.Count $NewTweet.Interactions += $NewTweet.entities.retweets | ForEach-Object { New-Object PSObject -Property @{ screen_name = $_.user.screen_name location = $_.user.location } } Write-Debug "[INFO] Retrieved Retweets: $($NewTweet.entities.retweets.Count)" Write-Debug "[INFO] Interactions: $($NewTweet.Interactions.Count)" } if ( $IncludeFavorites ) { if ( $IncludeAll ) { Write-Progress -Activity "Retrieving Favorites ..." -Status "Progress: $i / $results - ETC: $( (( $results - $i ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes - Time Elapsed: $( (( $i - 1 ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes" -PercentComplete ( ( $i / $results ) * 100 ) } else { Write-Progress -Activity "Retrieving Favorites ..." -Status "Progress: $i / $results" -PercentComplete ( ( $i / $results ) * 100 ) } Write-Debug ".favorites_count not exists: $( $NewTweet.favorites_count -eq $null )" if ( $NewTweet.favorites_count -eq $null ) { $NewTweet | Add-Member -NotePropertyName favorites_count -NotePropertyValue 0 } else { $NewTweet.favorites_count = 0 } $SourceCode = Get-PageSourceCode $NewTweet.PermaLink $NewTweet.favorites_count = Get-TweetFavoritesFromPage ([ref] $SourceCode) Write-Debug "[INFO] Retrieved Favorites: $($NewTweet.favorites_count)" } if ( $IncludeAll ) { Start-Sleep -Seconds $ExtendedTimeToWait } $TimeLine += $NewTweet $i++ } $TimeLine } # $DebugPreference = "SilentlyContinue" } function Normalize-TwitterTimeLine( [PSObject[]] $TimeLine, [switch] $IncludeAll ) { # $TimeLine = Normalize-TwitterTimeLine $tweets -IncludeAll # $DebugPreference = "Continue" [PSObject[]] $NewTimeLine = @() $TimeToWait = 0 $TimeToWaitForRTs = 66 $TimeToWaitForFavs = 66 $SourcePattern = '((?s)]*[^>]*>(?.*?))' $i = 1 $IncludeRTs = $false $IncludeFavorites = $false if ( $IncludeAll ) { $IncludeRTs = $true $IncludeFavorites = $true } if ( $TimeToWaitForRTs -ge $TimeToWaitForFavs ) { $TimeToWait = $TimeToWaitForRTs } else { $TimeToWait = $TimeToWaitForFavs } $TimeLine | ForEach-Object { $NewTweet = $_ if ( $IncludeAll ) { Write-Progress -Activity "Normalizing Information ..." -Status "Progress: $i / $($TimeLine.Count) - ETC: $( (( $TimeLine.Count - $i ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes - Time Elapsed: $( (( $i - 1 ) * ( $TimeToWaitForRTs + $TimeToWaitForFavs )) / 60 ) minutes" -PercentComplete ( ( $i / $TimeLine.Count ) * 100 ) } else { Write-Progress -Activity "Normalizing Information ..." -Status "Progress: $i / $($TimeLine.Count)" -PercentComplete ( ( $i / $TimeLine.Count ) * 100 ) } $NewTweet.user = $NewTweet.user.screen_name if ( $NewTweet.source -match $SourcePattern ) { $NewTweet.source = $Matches.TweetSource } Write-Debug ".Links not exists: $( $NewTweet.Links -eq $null )" if ( $NewTweet.Links -e