Kategoria: (Programowanie) Autor: admin Data 27 grudnia 2007

01.Do czego to ma służyć

Często słuchamy fajnego kawałka na wrzucie i chcemy go ściągnąć na dysk,
wtedy zastanawiamy się jak to ściągnąć. Metoda jest bardzo łatwa, przedstawiam ją poniżej.

Cały program, gotowy do otworzenia (exe) znajduje się w linku poniżej:

Program do ściągania plików z wrzuty - Pobierz Teraz!

Naciśnij czytaj dalej, aby zobaczyć algorytm zaimplementowany w C++/Java.

02.Algorytm
Mamy przykładowy link:
http://www.wrzuta.pl/audio/6HeShIhpgL/fenomen-powiedz
Aby wywołać ściągnięcie pliku z serwera ftp wrzuty, musimy link zamienić na postać:

http://www.wrzuta.pl/aud/file/6HeShIhpgL/1

Widzimy, audio zamienić na aud lub vid(w przypadku filmów), po tym dodać file/kod oraz na końcu jakąś cyfrę.

03.Implementacja
Wczytujemy link, dzielÄ…c je miÄ™dzy ‘/’ wrzucamy do tablicy. Odpowiednie części tablicy
zamieniamy i między nie, dodajemy /file/.

Obiekty:
string adres_down; //Adres,ktory wczytujemy(http://www.wrzuta.pl/audio/6HeShIhpgL/fenomen-powiedz )
string adres_new; //Adres,ktory chcemy otrzymac(http://www.wrzuta.pl/aud/file/6HeShIhpgL/1)
string skladowe[6]; //6 czesci, na ktore dzielimy link (obiekt adres_down)

Cała funkcja zmien_adres();

Kod:


string zmien_adres(string adres_down) //W argumencie funkcji podajemy stringa z adresem do wczytania
{
int x,dlugosc,y=0; //zmienne
string bufor,rodzaj; //zmienne
/* Cala petla, dzielaca linka na skladowe */
for(x=1; x<=adres_down.length(); ++x)
{
if (adres_down[x]==’/') //Idzie od lewej, jeżeli znajdzie ‘/’
{
skladowe[y]=bufor; //Przypisze do skladowe[y] to co jest w buforze
bufor=”"; //wyzeruje bufor
y++; //inkrementuje zmienna y
}
else //w przeciwnym wypadku,idzie do nastepnej czesci
{
bufor+=adres_down[x];
}
}
skladowe[y]=bufor; //ostatnia czesc skladowych przypisujemy zmiennej bufor
/*Okreslamy jaki jest rodzaj pliku*/

if (skladowe[3]==”film”) rodzaj=”/vid”;
if (skladowe[3]==”audio”) rodzaj=”/aud”;
//kompletny link
adres_new=”http://”+skladowe[2]+rodzaj+”/file/”+skladowe[4]+”/1″ ;
return adres_new;
}

04.Jak ściągnąć plik, czyli UrlDownloadToFile.
Adres do dokladnego opisu biblioteki: [ www ]

Inicjalizacja: (zgodnie z MSDN Library)

Kod:


typedef HRESULT (*P_URLDownloadToFile)(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
void*
);

HRESULT uRet = 1;
HINSTANCE hLib;
HMODULE urlmon=LoadLibrary(”urlmon.dll”);
if(urlmon)
_URLDownloadToFile=(P_URLDownloadToFile)GetProcAddress(url mon,”URLDownloadToFileA”);

uRet = _URLDownloadToFile(NULL,adres_new.c_str(),plik.c_str(),0,NULL); //Funkcja c.str() zamienia zawartość obiektu string na C-string.

if ( uRet == S_OK )
{ std::cout << “\nPobieranie zakonczone pomyslnie!:))\n” << endl; }
else { std::cout << “\nBlad pobierania!\n” << endl; break;}

FreeLibrary(hLib);

/******************************************
* 05.Kompletny kod *
*******************************************/

Kod:
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;

typedef HRESULT (*P_URLDownloadToFile)(
LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
void*
);
/*****************************************/
string adres_down;
string adres_new;
string skladowe[6];
/****************************************/
string zmien_adres(string adres_down)
{
int x,dlugosc,y=0;
string bufor,rodzaj;

for(x=1; x<=adres_down.length(); ++x)
{
if (adres_down[x]==’/')
{
skladowe[y]=bufor;
bufor=”";
y++;
}
else
{
bufor=bufor+adres_down[x];

}
}
cout << bufor;
skladowe[y]=bufor;
if (skladowe[3]==”film”) rodzaj=”/vid”;
if (skladowe[3]==”audio”) rodzaj=”/aud”;
adres_new=”http://”+skladowe[2]+rodzaj+”/file/”+skladowe[4]+”/1″ ;

return adres_new;
}
////////////////////////////////////////////////////////////////
P_URLDownloadToFile _URLDownloadToFile;

int main()
{
string adres;
string plik;
while(1)
{
cout << “Adres(z http://www.):”;
cin >> adres;
cout << endl;
cout << “Wpisz nazwe pliku: “;
cin >> skladowe[4];
plik = skladowe[4] + “.mp3″;

zmien_adres(adres);

cout << “+ Link wzgledny:” << adres_new << endl << ” Download… \n\n”;

HRESULT uRet = 1;
HINSTANCE hLib;
HMODULE urlmon=LoadLibrary(”urlmon.dll”);
if(urlmon)
_URLDownloadToFile=(P_URLDownloadToFile)GetProcAddress(url mon,”URLDownloadToFileA”);

uRet = _URLDownloadToFile(NULL,adres_new.c_str(),plik.c_str(),0,NULL);

if ( uRet == S_OK )
{ std::cout << “\nPobieranie zakonczone pomyslnie!:))\n” << endl; }
else { std::cout << “\nBlad pobierania!\n” << endl; break;}

FreeLibrary(hLib);
}
getch();
}

Implementacja w Javie:

  1. import java.io.*;

  2. import java.net.*;

  3. import java.util.*;

  4. import java.util.Arrays;

  5.  

  6. public class FileDownload {

  7. public static void download(String address, String localFileName) {

  8. OutputStream out = null;

  9. URLConnection conn = null;

  10. InputStream in = null;

  11. try {

  12. URL url = new URL(address);

  13. out = new BufferedOutputStream(

  14. new FileOutputStream(localFileName));

  15. conn = url.openConnection();

  16. in = conn.getInputStream();

  17. byte[] buffer = new byte[1024];

  18. int numRead;

  19. long numWritten = 0;

  20. while ((numRead = in.read(buffer)) != -1) {

  21. out.write(buffer, 0, numRead);

  22. numWritten += numRead;

  23. }

  24. System.out.println(localFileName + \t + numWritten);

  25. } catch (Exception exception) {

  26. exception.printStackTrace();

  27. } finally {

  28. try {

  29. if (in != null) {

  30. in.close();

  31. }

  32. if (out != null) {

  33. out.close();

  34. }

  35. } catch (IOException ioe) {

  36. }

  37. }

  38. }

  39.  

  40. public static void download(String address) {

  41. int lastSlashIndex = address.lastIndexOf(‘/’);

  42. if (lastSlashIndex >= 0 &&

  43. lastSlashIndex < address.length() - 1) {

  44. download(address, address.substring(lastSlashIndex + 1));

  45. } else {

  46. System.err.println(“Could not figure out local file name for “ +

  47. address);

  48. }

  49. }

  50. //*****************************************************************

  51. public static String zmiana_adresu(String url) {

  52. String address; //Adres,ktory wczytujemy(http://www.wrzuta.pl/audio/6HeShIhpgL/fenomen-powiedz )

  53. String adres_new; //Adres,ktory chcemy otrzymac(http://www.wrzuta.pl/aud/file/6HeShIhpgL/1)

  54. String skladowe[];

  55. int x,dlugosc;

  56. int y = 0;

  57. String bufor, rodzaj;

  58. for(x = 1; x<=address.length(); ++x)

  59. {

  60. if ( address[x]==‘/’){

  61. skladowe[y]=bufor;

  62. bufor = “”;

  63. y++;

  64. } else {

  65. bufor +=address[x];

  66. }

  67. skladowe[y]=bufor;

  68. if (skladowe[3]==“film”) rodzaj=“/vid”;

  69. if (skladowe[3]== “audio”) rodzaj=“/aud”;

  70. adres_new=“http://”+skladowe[2]+rodzaj+“/file/”+skladowe[4]+“/1″ ;

  71. return address;

  72. }

  73. }

  74. //*****************************************************************

  75.  

  76. public static void main(String[] args) {

  77. for (int i = 0; i < args.length; i++) {

  78. download( zmiana_adresu(args[i]) );

  79. }

  80. }

  81.  

  82. }


mrx1 @ 6 maja 2008 - 18:39 #

Ogromne dzięki za opisanie tego, wszyscy tylko zamieszczają swoje własne programy, a człowiek tu chciałby napisać swój własny :-) Stokrotne dzięki.

Odpowiedz
Nick: 
Email: 
WWW: 
Treśą: