Skip to content

Commit 9ba78d2

Browse files
committed
2026.5.13.0
API.Base: add 'IThumbList' interface; add the 'ReparseMissing_ClearList' function to the base class API.Instagram: protect all necessary controls; fix error getting user info API.OnlyFans: add the 'CookieDateProvider' class to avoid cookies error API.PornHub: add image and title additional regex; fix subscription downloading bug API.ThisVid: add 'ReparseMissing' function Feed: add the most frequently used buttons to the top FeedMedia: fix subscription bug
1 parent be97752 commit 9ba78d2

15 files changed

Lines changed: 273 additions & 64 deletions

File tree

Changelog.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,31 @@
22
- [ffmpeg](https://github.com/AAndyProgram/SCrawler/wiki/Settings#ffmpeg)
33
- x64 version - [release](https://github.com/GyanD/codexffmpeg/releases/tag/5.1.2); [zip](https://github.com/GyanD/codexffmpeg/releases/download/5.1.2/ffmpeg-5.1.2-full_build.zip); **version `5.1.2-full_build-www.gyan.dev`**
44
- x86 version - [release](https://github.com/yt-dlp/FFmpeg-Builds/releases/tag/autobuild-2022-11-30-12-57); [zip](https://github.com/yt-dlp/FFmpeg-Builds/releases/download/autobuild-2022-11-30-12-57/ffmpeg-N-109274-gd7a5f068c2-win32-gpl.zip); **version `N-109457-geeb280f351-20221226`**
5-
- [Gallery-dl](https://github.com/AAndyProgram/SCrawler/wiki/Settings#gallery-dl) - **1.31.9**
5+
- [Gallery-dl](https://github.com/AAndyProgram/SCrawler/wiki/Settings#gallery-dl) - **1.32.0**
66
- [YT-DLP](https://github.com/AAndyProgram/SCrawler/wiki/Settings#yt-dlp) - **2026.03.17**
77
- [Deno](https://github.com/AAndyProgram/SCrawler/wiki/Settings#deno) - latest *(`2.0.0` or higher)*
88
- [OF-Scraper](https://github.com/AAndyProgram/SCrawler/wiki/Settings#of-scraper) - **3.12.9** ([release](https://github.com/datawhores/OF-Scraper/releases/tag/3.12.9))
99

1010
# 2026
1111

12+
## 2026.5.13.0
13+
14+
*2026-05-13*
15+
16+
- Added
17+
- Sites
18+
- ThisVid: download undownloaded videos
19+
- Feed: the most frequently used buttons are added to the top
20+
- Minor improvements
21+
- Updated
22+
- gallery-dl up to version **1.32.0**
23+
- Fixed
24+
- Sites:
25+
- **Instagram: data is not downloading**
26+
- OnlyFans: cookies error
27+
- PornHub: subscriptions are not downloading
28+
- Minor bugs
29+
1230
## 2026.3.23.0
1331

1432
*2026-03-23*

SCrawler/API/Base/Declarations.vb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Imports PersonalUtilities.Forms
1111
Imports PersonalUtilities.Functions.RegularExpressions
1212
Namespace API.Base
1313
Friend Module Declarations
14+
Friend Interface IThumbList
15+
Property Thumbs As List(Of String)
16+
End Interface
1417
Friend Const UserLabelName As String = "User"
1518
Friend Const SearchRequestLabelName As String = "Search request"
1619
Friend ReadOnly LNC As New ListAddParams(LAP.NotContainsOnly)

SCrawler/API/Base/UserDataBase.vb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,12 @@ BlockNullPicture:
15501550
''' </summary>
15511551
Protected Overridable Sub ReparseMissing(ByVal Token As CancellationToken)
15521552
End Sub
1553+
Protected Sub ReparseMissing_ClearList(ByRef rList As List(Of Integer))
1554+
If rList.Count > 0 Then
1555+
For i% = rList.Count - 1 To 0 Step -1 : _ContentList.RemoveAt(rList(i)) : Next
1556+
rList.Clear()
1557+
End If
1558+
End Sub
15531559
#End Region
15541560
#Region "MD5 support"
15551561
Private Const VALIDATE_MD5_ERROR As String = "VALIDATE_MD5_ERROR"

SCrawler/API/Instagram/Declarations.vb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ Namespace API.Instagram
2020
Friend Const PageTokenRegexPatternDefault As String = "\[\],{""token"":""(.*?)""},\d+\]"
2121
Friend ReadOnly Regex_UserToken_dtsg As RParams = RParams.DMS("DTSGInitialData["":,.\[\]]*?{\s*.token.:\s*""([^""]+)", 1, EDP.ReturnValue)
2222
Friend ReadOnly Regex_UserToken_lsd As RParams = RParams.DMS("LSD["":,.\[\]]*?{\s*.token.:\s*""([^""]+)", 1, EDP.ReturnValue)
23+
Friend ReadOnly Regex_BlockVersionID As RParams = RParams.DMS("""versioningID"":""([^""]+)""", 1, EDP.ReturnValue)
2324
Friend ReadOnly Regex_ProfileID As RParams = RParams.DMS("profilePage_(\d+)", 1, EDP.ReturnValue)
2425
Friend Sub UpdateResponser(ByVal Source As IResponse, ByRef Destination As Responser, ByVal UpdateWwwClaim As Boolean)
2526
Const r_wwwClaimName$ = "x-ig-set-www-claim"

SCrawler/API/Instagram/SiteSettings.vb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,15 @@ Namespace API.Instagram
7070
Friend Const Header_Browser As String = "Sec-Ch-Ua"
7171
Friend Const Header_BrowserExt As String = "Sec-Ch-Ua-Full-Version-List"
7272
Friend Const Header_Platform_Verion As String = "Sec-Ch-Ua-Platform-Version"
73-
<PropertyOption(ControlText:="x-csrftoken", ControlToolTip:="Can be automatically extracted from cookies", IsAuth:=True, AllowNull:=True), PClonable(Clone:=False)>
73+
<PropertyOption(ControlText:="x-csrftoken", ControlToolTip:="Can be automatically extracted from cookies", IsAuth:=True, AllowNull:=False), PClonable(Clone:=False)>
7474
Friend ReadOnly Property HH_CSRF_TOKEN As PropertyValue
7575
<CookieValueExtractor(NameOf(HH_CSRF_TOKEN))>
7676
Private Function GetValueFromCookies(ByVal PropName As String, ByVal c As CookieKeeper) As String
7777
Return c.GetCookieValue(Header_CSRF_TOKEN_COOKIE, PropName, NameOf(HH_CSRF_TOKEN))
7878
End Function
7979
<PropertyOption(ControlText:="x-ig-app-id", IsAuth:=True, AllowNull:=False), PClonable(Clone:=False)>
8080
Friend ReadOnly Property HH_IG_APP_ID As PropertyValue
81-
<PropertyOption(ControlText:="x-asbd-id", IsAuth:=True, AllowNull:=True), PClonable(Clone:=False)>
81+
<PropertyOption(ControlText:="x-asbd-id", IsAuth:=True, AllowNull:=False), PClonable(Clone:=False)>
8282
Friend ReadOnly Property HH_ASBD_ID As PropertyValue
8383
'PropertyOption(ControlText:="x-ig-www-claim", IsAuth:=True, AllowNull:=True)
8484
<PClonable(Clone:=False)>
@@ -89,16 +89,16 @@ Namespace API.Instagram
8989
Return Not v.IsEmptyString AndAlso v = "0"
9090
End Get
9191
End Property
92-
<PropertyOption(ControlText:="sec-ch-ua", IsAuth:=True, AllowNull:=True,
92+
<PropertyOption(ControlText:="sec-ch-ua", IsAuth:=True, AllowNull:=False,
9393
InheritanceName:=SettingsCLS.HEADER_DEF_sec_ch_ua), PClonable, PXML(OnlyForChecked:=True)>
9494
Private ReadOnly Property HH_BROWSER As PropertyValue
95-
<PropertyOption(ControlText:="sec-ch-ua-full", ControlToolTip:="sec-ch-ua-full-version-list", IsAuth:=True, AllowNull:=True,
95+
<PropertyOption(ControlText:="sec-ch-ua-full", ControlToolTip:="sec-ch-ua-full-version-list", IsAuth:=True, AllowNull:=False,
9696
InheritanceName:=SettingsCLS.HEADER_DEF_sec_ch_ua_full_version_list), PClonable, PXML(OnlyForChecked:=True)>
9797
Private ReadOnly Property HH_BROWSER_EXT As PropertyValue
98-
<PropertyOption(ControlText:="sec-ch-ua-platform-ver", ControlToolTip:="sec-ch-ua-platform-version", IsAuth:=True, AllowNull:=True, LeftOffset:=135,
98+
<PropertyOption(ControlText:="sec-ch-ua-platform-ver", ControlToolTip:="sec-ch-ua-platform-version", IsAuth:=True, AllowNull:=False, LeftOffset:=135,
9999
InheritanceName:=SettingsCLS.HEADER_DEF_sec_ch_ua_platform_version), PClonable, PXML(OnlyForChecked:=True)>
100100
Private ReadOnly Property HH_PLATFORM As PropertyValue
101-
<PropertyOption(ControlText:="UserAgent", IsAuth:=True, AllowNull:=True,
101+
<PropertyOption(ControlText:="UserAgent", IsAuth:=True, AllowNull:=False,
102102
InheritanceName:=SettingsCLS.HEADER_DEF_UserAgent), PClonable, PXML(OnlyForChecked:=True)>
103103
Private ReadOnly Property HH_USER_AGENT As PropertyValue
104104
Friend Overrides Function BaseAuthExists() As Boolean
@@ -146,7 +146,7 @@ Namespace API.Instagram
146146
<Provider(NameOf(HH_IG_WWW_CLAIM_UPDATE_INTERVAL), FieldsChecker:=True)>
147147
Private ReadOnly Property TokenUpdateIntervalProvider As IFormatProvider
148148
#End Region
149-
<PropertyOption(ControlText:="Use GraphQL to download", IsAuth:=True), PXML, PClonable>
149+
<PropertyOption(ControlText:="Use GraphQL to download", ControlToolTip:="This feature is in test mode", IsAuth:=True), PXML, PClonable>
150150
Friend ReadOnly Property USE_GQL As PropertyValue
151151
<PropertyOption(ControlText:="Use GraphQL to download user data", IsAuth:=True), PXML, PClonable, HiddenControl>
152152
Friend ReadOnly Property USE_GQL_UserData As PropertyValue

SCrawler/API/Instagram/UserData.GQL.vb

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,17 @@ Namespace API.Instagram
2727
Token_dtsg = String.Empty
2828
Token_lsd = String.Empty
2929
End Sub
30+
Protected Property BlockVersionID As String = String.Empty
3031
#End Region
3132
#Region "Headers"
3233
Friend Const GQL_HEADER_FB_FRINDLY_NAME As String = "x-fb-friendly-name"
3334
Friend Const GQL_HEADER_FB_LSD As String = "x-fb-lsd"
35+
Friend Const GQL_HEADER_BLOCK_VERSION_ID As String = "x-bloks-version-id"
36+
Friend Const GQL_HEADER_ROOT_FIELD_NAME As String = "x-root-field-name"
37+
Friend Const GQL_HEADER_ROOT_FIELD_NAME_Value As String = "fetch__XDTUserDict"
3438
#End Region
3539
#Region "Data constants"
36-
Private Const GQL_UserData_DocId As String = "7381344031985950"
40+
Private Const GQL_UserData_DocId As String = "35710877621861450" '"7381344031985950"
3741
Private Const GQL_UserData_FbFriendlyName As String = "PolarisProfilePageContentQuery"
3842

3943
Private Const GQL_Highlights_DocId As String = "8298007123561120"
@@ -61,18 +65,31 @@ Namespace API.Instagram
6165
Private Const GQL_URL_Q As String = "https://www.instagram.com/graphql/query"
6266
#End Region
6367
#Region "Download functions"
64-
Protected Sub UpdateHeadersGQL(ByVal HeaderValue As String)
65-
Responser.Headers.Add(GQL_HEADER_FB_FRINDLY_NAME, HeaderValue)
66-
Responser.Headers.Add(GQL_HEADER_FB_LSD, Token_lsd)
68+
Protected Sub UpdateHeadersGQL(ByVal HeaderValue As String, Optional ByVal Add As Boolean = True)
69+
With Responser.Headers
70+
If Add Then
71+
.Add(GQL_HEADER_FB_FRINDLY_NAME, HeaderValue)
72+
.Add(GQL_HEADER_FB_LSD, Token_lsd)
73+
'.Add(GQL_HEADER_BLOCK_VERSION_ID, BlockVersionID)
74+
'.Add(GQL_HEADER_ROOT_FIELD_NAME, GQL_HEADER_ROOT_FIELD_NAME_Value)
75+
Else
76+
.Remove(GQL_HEADER_FB_FRINDLY_NAME)
77+
.Remove(GQL_HEADER_FB_LSD)
78+
'.Remove(GQL_HEADER_BLOCK_VERSION_ID)
79+
'.Remove(GQL_HEADER_ROOT_FIELD_NAME)
80+
End If
81+
End With
6782
End Sub
6883
'<Obsolete("Use 'GET' function: 'GetUserData'", False)>
6984
Private Function GetUserDataGQL(ByVal Token As CancellationToken) As String
85+
'Dim vars$ = String.Format(GQL_URL_PATTERN_VARS, GQL_UserData_DocId, Token_lsd, Token_dtsg_Var, GQL_UserData_FbFriendlyName,
86+
' SymbolsConverter.ASCII.EncodeSymbolsOnly("{" & $"""id"":""{ID}"",""relay_header"":false,""render_surface"":""PROFILE""" & "}"))
7087
Dim vars$ = String.Format(GQL_URL_PATTERN_VARS, GQL_UserData_DocId, Token_lsd, Token_dtsg_Var, GQL_UserData_FbFriendlyName,
71-
SymbolsConverter.ASCII.EncodeSymbolsOnly("{" & $"""id"":""{ID}"",""relay_header"":false,""render_surface"":""PROFILE""" & "}"))
88+
SymbolsConverter.ASCII.EncodeSymbolsOnly("{" & $"""enable_integrity_filters"":true,""id"":""{ID}"",""__relay_internal__pv__PolarisCannesGuardianExperienceEnabledrelayprovider"":true,""__relay_internal__pv__PolarisCASB976ProfileEnabledrelayprovider"":false,""__relay_internal__pv__PolarisWebSchoolsEnabledrelayprovider"":false,""__relay_internal__pv__PolarisRepostsConsumptionEnabledrelayprovider"":true" & "}"))
7289
UpdateRequestNumber()
7390
ChangeResponserMode(True)
7491
UpdateHeadersGQL(GQL_UserData_FbFriendlyName)
75-
Dim r$ = Responser.GetResponse(GQL_URL, vars)
92+
Dim r$ = Responser.GetResponse(GQL_URL_Q, vars)
7693
Return r
7794
'If Not r.IsEmptyString Then
7895
' Using j As EContainer = JsonDocument.Parse(r)
@@ -344,6 +361,7 @@ Namespace API.Instagram
344361
.MatchSub = 1
345362
.WhatGet = RegexReturn.Value
346363
End With
364+
BlockVersionID = RegexReplace(r, Regex_BlockVersionID)
347365
For Each tt In tokens
348366
If Not Token_lsd.IsEmptyString And Not Token_dtsg.IsEmptyString Then
349367
Exit For
@@ -362,6 +380,7 @@ Namespace API.Instagram
362380
Case 1
363381
Token_dtsg = RegexReplace(r, Regex_UserToken_dtsg)
364382
Token_lsd = RegexReplace(r, Regex_UserToken_lsd)
383+
BlockVersionID = RegexReplace(r, Regex_BlockVersionID)
365384
End Select
366385
If Not ValidateBaseTokens() And Attempt = 0 Then ParseTokens(r, Attempt + 1)
367386
End If

SCrawler/API/Instagram/UserData.vb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,7 @@ Namespace API.Instagram
362362
With .Headers
363363
.Remove("origin")
364364
.Remove("authority")
365-
.Remove(GQL_HEADER_FB_FRINDLY_NAME)
366-
.Remove(GQL_HEADER_FB_LSD)
365+
UpdateHeadersGQL(String.Empty, False)
367366
Dim hv$ = MySiteSettings.Responser.Headers.Value(HttpHeaderCollection.GetSpecialHeader(MyHeaderTypes.SecFetchDest)).IfNullOrEmpty("empty")
368367
.Add(HttpHeaderCollection.GetSpecialHeader(MyHeaderTypes.SecFetchDest, hv))
369368
hv = MySiteSettings.Responser.Headers.Value(HttpHeaderCollection.GetSpecialHeader(MyHeaderTypes.SecFetchMode)).IfNullOrEmpty("cors")

SCrawler/API/OnlyFans/Declarations.vb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,23 @@ Namespace API.OnlyFans
1717
{{"files", "full", "url"}}
1818
}
1919
Friend Property Rules As DynamicRulesEnv
20+
Friend Class CookieDateProvider : Implements ICustomProvider
21+
Private ReadOnly DefaultProvider As IFormatProvider
22+
Friend Sub New()
23+
DefaultProvider = PersonalUtilities.Tools.Web.Cookies.CookieKeeper.DateProviderDefault
24+
End Sub
25+
Friend Function Convert(ByVal Value As Object, ByVal DestinationType As Type, ByVal Provider As IFormatProvider,
26+
Optional ByVal NothingArg As Object = Nothing, Optional ByVal e As ErrorsDescriber = Nothing) As Object Implements ICustomProvider.Convert
27+
If Not IsNothing(Value) AndAlso TypeOf Value Is String AndAlso Not CStr(Value).IsEmptyString Then
28+
Dim v$ = Value
29+
If v.Contains(",_") Then v = v.Substring(0, v.IndexOf(",_"))
30+
Value = v
31+
End If
32+
Return AConvert(Of Date)(Value, DefaultProvider, Nothing)
33+
End Function
34+
Private Function GetFormat(ByVal FormatType As Type) As Object Implements IFormatProvider.GetFormat
35+
Throw New NotImplementedException("'GetFormat' is not available in the 'CookieDateProvider'")
36+
End Function
37+
End Class
2038
End Module
2139
End Namespace

SCrawler/API/OnlyFans/SiteSettings.vb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ Namespace API.OnlyFans
253253
.CookiesUpdateMode = CookieKeeper.UpdateModes.Disabled
254254
.Cookies.ChangedAllowInternalDrop = False
255255
.Cookies.Changed = False
256+
.Cookies.DateProvider = New CookieDateProvider
256257
With .Headers
257258
.Add(HttpHeaderCollection.GetSpecialHeader(MyHeaderTypes.SecChUaPlatform))
258259
.Add(HttpHeaderCollection.GetSpecialHeader(MyHeaderTypes.SecChUaMobile))

SCrawler/API/PornHub/Declarations.vb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@ Namespace API.PornHub
2424
0, RegexOptions.Singleline, RegexReturn.List, EDP.ReturnValue, UnicodeHexConverter)
2525
Friend ReadOnly RegexVideo_Video_VideoKey As RParams = RParams.DMS("viewkey=([\w\d]+)", 1, EDP.ReturnValue)
2626
Friend ReadOnly RegexVideoPageTitle As RParams = RParams.DMS("meta (property|name)=""[^:]+?:title"" content=""([^""]+)""", 2, EDP.ReturnValue)
27+
Friend ReadOnly RegexVideoPageTitle2 As RParams = RParams.DMS("\<title\>([^\<]+)\</title>", 1, EDP.ReturnValue)
28+
Friend ReadOnly RegexVideoPageTitle3 As RParams = RParams.DMS("videoTitle...([^""]+)", 1, EDP.ReturnValue)
29+
Friend ReadOnly RegexVideoPageTitle_NoTitle As RParams = RParams.DMS("(?<=(\=|/))([\w\d]+)(?=(\?|\&|\Z))", 2, EDP.ReturnValue)
2730
Friend ReadOnly RegexDataToken As RParams = RParams.DMS("data-token=""([^""]+)", 1, EDP.ReturnValue)
31+
Friend ReadOnly RegexVideoAdditImg As RParams = RParams.DMS("twitter.image..content=""([^""]+)""", 1, EDP.ReturnValue)
32+
Friend ReadOnly RegexVideoAdditImg2 As RParams = RParams.DMS("thumbnailUrl""[^""]*?""([^""]+)""", 1, EDP.ReturnValue)
2833
#End Region
2934
#Region "Declarations M3U8"
3035
Friend ReadOnly Regex_M3U8_FilesList As RParams = RParams.DM("RESOLUTION=\d+x(\d+).*?[\r\n]*?(.+?m3u8.*)", 0, RegexReturn.List, EDP.ReturnValue)

0 commit comments

Comments
 (0)