[VB/C#] Pobieranie webclientem ZIPa z GitHuba

Dzięki, nie wiedziałem tego bo z githuba nie korzystam.

W takim razie trzeba użyć jednego z poniższych uchwytów API:

  • Get a single release
  • Get the latest release
  • Get a release by tag name

Stąd: https://developer.github.com/v3/repos/releases/ zależnie od konkretnego przypadku.

1 polubienie

Dokładnie tak jak napisał @krystian3w to jest zip, który nie jest w repo. I API GitHuba nie pomoże z tym bo pozwala zwrócić jedynie link do pobierania, który już dostarczam aplikacji w inny sposób. Dodałem do kod te dwie linijki o których wspominał gość z tamtego forum, ale połączenie nie chce się nadal utworzyć.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
Dim req As HttpWebRequest = WebRequest.Create("link")
req.AllowAutoRedirect = True
req.ProtocolVersion = HttpVersion.Version10
Try
    Dim resp As HttpWebResponse = req.GetResponse()
Catch ex As Exception
    Debug.WriteLine("ERR: " & ex.Message)
End Try

Powoli się zastanawiam czy nie zacząć szukać już jakiegoś zamiennika z trzymania tych zipów bo te problemy z durnym pobieraniem z GH mnie denerwują. Pierwsza myśl to była chmura od Google’a lub MS no ale zgaduję, że tam dopiero będzie problem z uzyskaniem takiego “czystego linku” do pobierania i bez tych przekierowań. W ostateczności myślę też nad rozwiązaniem z własnych hostingiem www. Miałem sobie taki za niedługo zakładać (oczywiście płatny bo już nie ma darmowych godnych uwagi) i może nim bym obskoczył działanie tego kodu.

1 polubienie

Jak to nie pomoże? API zawraca Ci link do downloadu bezpośredniego, a ty dostarczasz link z przeglądarki który jest dopiero przekierowywany do pliku.

Jak wrócę do domu to poszukam jeszcze jakiegoś rozwiązania problemu z tls, ale równie dobrze mógłbyś sam coś wygooglować.

No właśnie nie, już testowałem to API kilkukrotnie, dokładnie mówiąc tą funkcję:

https://developer.github.com/v3/repos/releases/#get-a-single-release-asset

i w pozycji “browser_download_url” dostaję właśnie ten link który używam od początku, ten przed przekierowaniem, znajduje się on ten pod przyciskiem pobierania na stronie GH. Przechwyciłem link, który jest po przekierowaniu, zawiera on już dane w formie parametrów GET o przeglądarce, identyfikatorze pobierania i masę innych danych oraz wiem że jest on tymczasowy (po jakimś czasie przestaje on pobierać plik i wyświetla komunikat odmowy dostępu). Zaraz zrobię próbę z wykorzystaniem OneDrive’a i sprawdę czy tam też są takie jaja od których webclient zgłupieje.

Próba z chmurami od Google’a i Microsoftu połowicznie udana.

OneDrive pozwolił webclientowi pobrać aż 6KB danych i zakończył pobieranie.
Natomiast Google Drive pozwolił pobrać 119KB pliku oraz pokazywał w czasie pobierania, że ilość bitów do pobrania wynosi -1.

No oczywiście nie mogło to zadziałać tak jak powinno, a teraz wracam do przeszukiwania internetu…

Ja nie wiem co Ty robisz. Przy pomocy linków które podał @krystian3w, w 5 minut napisałem działający program w C#. Tu masz cały kod jaki był mi do tego potrzebny.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;

namespace HttpFileDownloader
{
	class Program
	{
		static void Main(string[] args)
		{
			string url = "https://github.com/Aris-t2/CustomCSSforFx/releases/download/1.8.5/custom_css_for_fx_v1.8.5.1.zip";
			string dest = "downloaded.zip";

			WebClient wc = new WebClient();

			System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

			wc.DownloadFile(url, dest);
		}
	}
}

Musiałem na własne oczy sprawdzić, że się nie da bo nie chciało mi się w to po prostu wierzyć.

EDIT:
Oczywiście sprawdziłem plik, rozpakowuje się i wszystko jest ok.

Przełożyłem kod na VB.NET i mam 2 spostrzeżenia:

  1. U mnie jeśli chce przypisać wartość do SecurityProtocol mam do wyboru tylko 2 opcje: Ssl3 oraz Tls (nie mam do wyboru wartości Tls11 i Tls12)
  2. Wypróbowałem zgodnie z przykładem pobieranie w wątku głównym (bez asynca), spowodowało to zgodnie z planem zawieszenie na chwile aplikacji, ale dzięki temu pojawił się wyjątek do linijki pobierania, komunikat ten co w przypadku httpwebrequest: nie można utworzyć kanału SSL/TLS

Także dla nieścisłości dodam jeszcze raz mój aktualny kod:

client = New WebClient()
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 Or SecurityProtocolType.Tls
AddHandler client.DownloadProgressChanged, AddressOf DownloadProgressChanged
AddHandler client.DownloadFileCompleted, AddressOf DownloadFileCompleted
client.DownloadFile(New Uri("link"), Application.StartupPath & "\download.zip")

Kod oczywiście testowałem na moim przykładzie i na przykładzie linku do CSSa Firefoxa. I tak jak pisałem wcześniej użycie DownloadFile wyrzuca wspomniany błąd, a użycie DownloadFileAsync tylko go ukrywa. Teraz przynajmniej wiadomo dlaczego przerywa nagle pobieranie i znamy komunikat. Zerknąłem jeszcze szybko do internetu w sprawie tego SecurityProtocol i widzę, że chyba jest to związane z frameworkiem na którego się pisze. Ja piszę przy użyciu .NETa w wersji 4.0

Podaj link do tego pliku firefoxa, tak dla pewności, że testujemy to samo.

Nie ma możliwości, że u Ciebie nie ma jakiś opcji ponieważ to jest z .net core i język tutaj nie ma znaczenia.
Ja używam .net framework 4.5.2.

EDIT:
Zobacz co na to dokumentacja: https://msdn.microsoft.com/pl-pl/library/system.net.securityprotocoltype(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1 wszystko jest.

1 polubienie

Sprawdziłem w internecie wartości tych stałych Ttl11 i Ttl12, są to 768 i 3072. Wprowadziłem je w taki sposób:

ServicePointManager.SecurityProtocol = CType(768, SecurityProtocolType) Or CType(3072, SecurityProtocolType)

I muszę przyznać działa przy obu plikach oraz przy obu funkcjach. Czyli tak, kod @Fizyda działa perfekcyjnie, tylko nie miałem u siebie podpowiedzi do tych protokołów. Pobieranie mojego pliku trochę trwa, ale to wina jego rozmiaru. Także jesteś wielki @Fizyda!

Możesz je wpisać, to że IDE ich nie widzi nie znaczy, że kod się nie skompiluje, bo na 100% się skompiluje.

PS. Czemu w ogóle piszesz w VB? Pytam z ciekawości nie z docinki, chociaż nie ukrywam nie lubię VB.