Last active
July 9, 2021 14:17
-
-
Save thedavecarroll/8794b49437af7c19b79c9f8e7b8478bc to your computer and use it in GitHub Desktop.
PSFollowFriday
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| function Split-Array { | |
| [CmdletBinding()] | |
| param ( | |
| [Parameter(Mandatory, ValueFromPipeline)] | |
| [String[]] $InputObject | |
| , | |
| [ValidateRange(1, [int]::MaxValue)] | |
| [int] $Size = 10 | |
| ) | |
| begin { $items = New-Object System.Collections.Generic.List[object] } | |
| process { $items.AddRange($InputObject) } | |
| end { | |
| $chunkCount = [Math]::Floor($items.Count / $Size) | |
| foreach ($chunkNdx in 0..($chunkCount-1)) { | |
| , $items.GetRange($chunkNdx * $Size, $Size).ToArray() | |
| } | |
| if ($chunkCount * $Size -lt $items.Count) { | |
| , $items.GetRange($chunkCount * $Size, $items.Count - $chunkCount * $Size).ToArray() | |
| } | |
| } | |
| } | |
| function Get-PSFollowFridayTweetText { | |
| [CmdletBinding()] | |
| param( | |
| [Parameter(Mandatory)] | |
| [ValidateNotNullOrEmpty()] | |
| [string]$UserName, | |
| [Parameter(Mandatory)] | |
| [ValidateNotNullOrEmpty()] | |
| [string]$ListSlug, | |
| [int]$ActiveWithin = 7, | |
| [ValidateSet('Retweets','Replies')] | |
| [string[]]$Exclude = 'Retweets' | |
| ) | |
| $TweetTemplate = @' | |
| Today's #PowerShell #PSFollowFriday list comes from @{0}'s Twitter List, {1}. | |
| {2} | |
| {3} | |
| '@ | |
| Set-BluebirdPSConfiguration -OutputType CustomClasses | |
| try { | |
| 'Getting Twitter List for {0} with Slug of {1}' -f $UserName, $ListSlug | Write-Verbose | |
| $PSFollowFridayListOwners = Get-TwitterList -Id 1400680326754615296 | |
| $PSFollowFridayUsers = Get-TwitterList -Id 1403723956373360641 | |
| $List = Get-TwitterList -Slug $ListSlug -OwnerUserName $UserName | |
| if ($null -eq $List) { | |
| Write-Warning -Message "Did not find Twitter List for $UserName with Slug of $ListSlug" | |
| return | |
| } | |
| Write-Verbose -Message "Retrieving the list membership" | |
| $ListMembers = $List | Get-TwitterListMember | |
| 'Found {0} members' -f $ListMembers.Count | Write-Verbose | |
| if ($ListMembers.Count -gt 100) { | |
| $ListMemberUsers = $ListMembers | Split-Array -Size 100 | ForEach-Object { Get-TwitterUser -User $_ } | |
| } else { | |
| $ListMemberUsers = $ListMembers | Get-TwitterUser | |
| } | |
| if ($ListMemberUsers.Protected -eq $true) { | |
| $SkippingUsers = $ListMemberUsers | Where-Object Protected | |
| 'Skipping {0} protected users.' -f $SkippingUsers.Count | Write-Warning | |
| $ListMemberUsers = $ListMemberUsers | Where-Object -Not Protected | |
| } | |
| $TimeLineParams = @{ | |
| StartTime = (Get-Date).AddDays(-$ActiveWithin) | |
| Exclude = $Exclude | |
| } | |
| 'Checking for user activitiy within the last {0} days' -f $ActiveWithin | Write-Verbose | |
| $UserCount = 1 | |
| $Activity = $ListMemberUsers | | |
| ForEach-Object { | |
| Write-Progress -Activity 'Getting user timelines...' -Status $_.UserName -PercentComplete ($UserCount / $ListMemberUsers.Count * 100) | |
| if ((Get-TwitterTimeline -User $_ @TimeLineParams).Count -gt 0) { | |
| $_.UserName | |
| } | |
| $UserCount++ | |
| } | |
| $FollowList = $Activity | Get-Random -Count 10 | |
| 'Selected users: {0}' -f ($FollowList -join ', ') | Write-Verbose | |
| 'Adding selected users to {0} (Id: {1})' -f $PSFollowFridayUsers.Name,$PSFollowFridayUsers.Id | Write-Verbose | |
| $PSFollowFridayUsers | Add-TwitterListMember -UserName $FollowList | Out-Null | |
| 'Adding list owner, {0}, to {1} (Id: {2})' -f $UserName,$PSFollowFridayListOwners.Name,$PSFollowFridayListOwners.Id | Write-Verbose | |
| $PSFollowFridayListOwners | Add-TwitterListMember -UserName $UserName | Out-Null | |
| $TweetFollowList = $FollowList | ForEach-Object { '@{0}' -f $_ } | |
| $TweetTemplate -f $List.UserName,$List.Name,$List.Uri,($TweetFollowList -join ' ') | |
| } | |
| catch { | |
| $PSCmdlet.ThrowTerminatingError($_) | |
| } | |
| } |
Author
Author
Updated to work with v0.5.0 release.
The Get-TwitterListMember returns a string array of usernames. I need a [BluebirdPS.APIV2.UserInfo.User] for Get-TwitterTimeline so I needed to use Get-TwitterUser which has a limit of 100 usernames per call.
To easily chunk the returned members list into 100 (or less), I included Split-Array from a StackOverflow answer from @mklement0. Thanks! That's some awesome code.
Author
Updated. Only use Split-Array if the membership count is greater than 100.
Author
Updated. Added Out-Null to Add-TwitterListMember statements.
Author
Update. Added logic to skip protected users and to enforce CustomClasses output.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
2021-05-28