From 8a90af6d4f58fa4240fb37118b500eee0ba80523 Mon Sep 17 00:00:00 2001 From: norohind <60548839+norohind@users.noreply.github.com> Date: Thu, 10 Oct 2024 17:08:51 +0200 Subject: [PATCH] Update script --- .gitignore | 1 + README.md | 17 ---- Victoria1807.jpg | Bin 36875 -> 0 bytes requirements.txt | 2 +- vk-photos-downloader.py | 216 ++++++++++++++++++++++------------------ 5 files changed, 122 insertions(+), 114 deletions(-) create mode 100644 .gitignore delete mode 100644 README.md delete mode 100644 Victoria1807.jpg mode change 100644 => 100755 vk-photos-downloader.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/README.md b/README.md deleted file mode 100644 index 668c22b..0000000 --- a/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# VK-Photos-Downloader -![](https://github.com/Victoria1807/VK-Photos-Downloader/blob/master/Victoria1807.jpg) -## Version 1.0 | 03.08.17 -A Python script, which allow to download the photos from any album of VK. - -Realized by **Python 3.5** - -## Additional modules: - 1. **[VK](https://github.com/dimka665/vk)** - -## My profiles: - - [VK](https://vk.com/victoria_1807) - - [Telegram](https://telegram.me/Victoria1807) - - [GitHub](https://github.com/Victoria1807) - - E-mail - flamaster1807@gmail.com - - diff --git a/Victoria1807.jpg b/Victoria1807.jpg deleted file mode 100644 index 3587fed5348efe3437da555770cc86aad97eed1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36875 zcmeFYXH-+$+BO^ux-E!wrKtf#sTO*(5vqVlLL{^;ozSF)&enZI2t@-1q-!W?5F`)~ zLV_s0DJ8TJP60f86Zfgpf1KvwK7XEvo97%a{{;bF zK4HFdJc43^!WS=!ii(~W5WgfYa_NGIsL1a^jvVLWI>B|~?8%d7MR<95MgE`D!Dj&P zAIJW6Z06VzAmAwPkz>3^4(b8ofFppTM~@xC{onM*sS_s;kskeh`SE$ckz>b>9^*QG z;^grYr;eUH0yuK?@ZyP+ynpar;lFv$;^`@%-*W*$$y@gy3*C0~e}VcS{2;kh$`X@D zu9H@F3ivyv?911#pE9Z-uuEY1ufsA0{?pjMt^PjC`yUYg=j;&R?6E_5yvKL}cL2Gc z{}|DynLRuo+ni{OY1* z^aNMd(Xz#;?z8)+Q>&Nb$I<0GJMGV9p10;CL23M3*MV!9NgX=9nmC23+tOc1-2|05 zJ6YXS1Em*cv9Y<0iRO=_ujxKnZ*8QjNe)b~NN_eX#~u6qe=&z%l(2OEx|nRcLZoqL zj9wbS72~|*N81pxKJ@GfM9ZhmuASrTm{BOA*_JWr;PZYkSH^hCcV+mL?jOWI*I&$v zj}%;~lHRUw*xx2Um-x0}9(Dk@fA7zsMC6?~Mdg+qc?c`&ZusTj zrT~DsVG=kv>@;$RVk@Am+-@y{%h5|xAIfG2q+za{;$Vk(;p7$zkFM4~meAg;Bx)a} zqY%E;bjiSI83K=5Iif;Bz|KeuQ2H~5JR=3JcSvz=Rj3c-z^7$_yx;DO6ODc~wV1<6 z#5T_-gsfB?B2Ku^jR?cfjX0iVE}I68(dUNdUKjhmh3})$CEGf59$mee&YXuJhx;ZT zqh-i8{boYYovZk&-ax1YEOX#~{8+pk%64K?5>W5Y<6*k(M*CF3?VacLGcwXEg|KT8 z+fkeTlCh(w;+Pkm_uWY#?q|zAxwJhzID269%+S4fy*`^~qRMRF4fOZDoAdJ>vY)!L zT;TQ^n0K_R3V%J3PhB8v@nC)KqrTz9Ruo>?P!i7{AGA_I9N$&wb#ePC>jzGOEk+9le zayA9r-260=Fx|W%3G2g#5lZ~ef3*$SBRi(_4hANto=u$=Axc$s64$P=cK$#nrHvsI zSD?I=aY>5486DOZjt!$aX(tos`aZ|EDFnB5t;$AS5^(bmVbg}x_<9nk+PS4){fNcO z%mq?@enbL%zo$#XW)*x)yJeHmcb4>FrGFXkMSXJ3PS(h5mQVutn+`As8lLpL6P7HGBH@ zYQB336v2-F`MvBYIWjv$)}EuwL4)g){=QVX{;bNf8WUuN!G2L~&8@fo_z!3z*@t#s zaI~>RFrXg_o^4DYW(f+ME*(`=CVQ0`4VSn3M+xl0v*+0xKsMh4@McT*q9P%6RHf4^ zX_>#uIj>BmEZAi1H3}jL0-2&U&@B`0QF5E*E=&_YqJ0*f#8h;;KiAqKZPpnUri(Bb zT(d`R+?*lAZ@{RLi=FltH$^Bdu9Ys;-^`_5>}*7J6kfI#B?&2673~BCpjGY7VzWD0 z2)%?FTe~aO^ZS+to-yj)>uLAk80_=dKD}l~PmK$`GqJCyW^(?7N7(SuUHjk351lXEX6qA&9n+jVtw9hQkDt37grQn!%hxypySMK}r z3r{$Bb~Z?Paj?T-1q_};W(x`mY6^Gi zozqqJiI?q3bE}vOChsM#1h3qrx#b0Pkvwa*1e+%uj!&;1d-&^KJ*}|?_1%NyX}e7n zZ(t?ngpN{i)4MlTl{S3YdcT61fe`t(?~$4 z9aLzTQ(D=bo^~gh__Y1him#SHwJNekT<2&?Rm#MPC%@YO507HI*Awv=!cN-o?4oM5 z)soa|t@CIdE}QMYsiFq?bvY)qK`6Xl|8a-T&;1xe4+u8tj3(5ed0s7>NcM1ey(gEH za_u3f!fi?hbQBAQ)>cv{b_z`$B*!DbH`m+qttfWo-#~*zHo+^C5Q34hbnv^`@G|WI z{*oJ6RkY7rJG?=kG@_|b2uyY{qvPu5=yAP0>5*2_pF59nqHb&|ZBwJM_Tm3pFwhiI zil`xONP{zOYkH{w<+OqIlh|BhKOY3daxz| zE5RNMQ(uUS-J~E#>nfxZFP{-h>o2AQhH2?S(7awL- zkL@mZ1u{cbqRN{w8?<`rTDs>9X-$f#d%3gHRt6xmq*}*fSaUu+{9D2Pw#u6R&H+Fu z40n--Tl>*q&{S_Z#0%N=uB$$&sB$&DOhr@vBY|VJG%~Wj)E_u#byq;^l}o=Dj|^oZ zgkgzerw%fe`BcJWvEdMH7`|FI1Va#ZD;V56f%_pOM(!#5v-)v`K@)vm0N-uc&nPjF zX+B#60Q_A8cYEWJQ$EACIrf-L>Kwvj^OL}yqdd3yU3PI3*1Uq2b>Zt$^lDFOtlkZg z;pC+@9oSxCb$q591T3p07b%j>b~p}N9y}dQoq!hG_C6t{M|v^R&P+C{7o^`gsxi~+ z#9zgWo6z%pbyrQ*qJHGlJY&Vg>Y{XK%qc-DEh`oNu0_|qC3LMjoj^!jdte5a5YByy zP=5WmI4v{Md1Tf3Q$UsU@`f`6jA#K@C8~Gt+8E!Q@e0u)hz3dW3R&~2r6Tr2FO5t` zgi}+TXTmqyqZlbn*9zz0ArlHca0mwfBr5M?ZdD}+$cylOv@)z4+!62GAFee-Jpf>! zMj}cLyul9XlI2T7$M8>RAZ?9&@WsSZk{;SM?)qF+wCj^~pMBj`@!AYTX00_XS4eIg zu9%?%OFi>~y+k04Om{caA4Wr)R;SEg2p#}3|4bLkcEFZSrDnu~Iwdv>eGMw>+Wi9q zpmoiJzicZ|^GO$rgMG0-)s&Mlsu+gN^pIwTi^IvXsHGv(A^K@A#~8l|0_UZ}b)}Gk z*212ke1x)!z|y3Dn9>W(CIta9Ln5EV#QGfoUQe92805q#b?sCyUh4asu)EDtE{f9PfiL#Qkd`gUR!#g} z+B$uC{R}W#8}4TUf8QimK5y=00cDXCp7;vBB}=B8oE&>8kuAt(+tKF{pgEf4>tj!d zWcw>cLFe4Gg<$ab1S(c%Iv}X9M(I}4Dq^||7HUNl zK0v0>mpcoL#LaNR^lT@q}7%h zrqn_sTvbJwQ&x-7ux#iY#Q&^JDEUr0RvIBI>q*B4Ye4o?!z>nv56tMc#6F0*T6k^Q zn6J0s_g$w4rS6Lt8nm2?P{lScTlHnUp}>%;2$Aeyc%XUG9990DW>|>F<)qV3(vR~} zM8*6lB7GPH5E!VZ0RTMi=fBun{fcxkaj?7SZ5LD*`I66x}NIq`wnW(=@D@$p(Bdg>eWQT@&Z#7k(zmwM& z*duRMk~$j@Cq*;iudaJo8!X;a)r}xTIgDti^ZcBA$3kVKr#_bH7dAv!xV!km;4Vv< zF6_V@iHCcW$5g+Yo%z+F+c+y5bh_)_+sPD37ks2`WVt{mlVedD$zV3LA_;UOGGB0V zQpTvcxC)mxxO^Ea2YeaZsG^PH$B6wn^6O*ctf*w3WAn(goMqrv?w8p?nj8Qs2LT$#&-bF z-#l!UQ<~4+n{H>pM~y%s1Q#hmtBvNQ7$_B;)e%;5OAgH&%=F%vGe4TWsr6+v)9++l z{T#yF0FK^(RjO61ejahvh}3e4tF3=o|9{c`$LGm-^kjvtM4fe1o8pb3MP;w49E{7L zXuq@G;lhE~#j6IfAG^V#VMOde4uU$>tT)56efHL}>Bh|ief!P^I%2ilZ%#eq(X5NA zbP+O%ocjuHWx9Mh0k$;joNk<82_FDTXa4#Rd%q8lY!VVdP{rnK2pDT7&q3_i_nj$l zInF9Z_8b5VVC!~6GXs-Ts5_B!lcOsuTl@!rghdzA>)l})qIUN|DCgMi(~3~9nQ`!r zM@k!-NLHE(H_j=wo+FF0D!RPgJglD)kf|rOXl#ATos9QFxu0FRw`D#kR~pAw$=%Xy z@f;>(DmljwHs*4_Bbkp%ZHdh0$(( zA4bl*rF*a`?ro7`#dg`EQwX`N_#e2=AkeCwT)@BDk8&IJC%{L8;%8OoG%ooUIaTK| zPY0-oPsPgsl`>>gphI$MZWy6d-%1bE-OSL%Fc$5QxC( zB~H!+E>}6OnTv#$F^B_Ch&?lLt*-B{e#nNWk4J+8<#B;?xm=00y%k@mD!Qz_cgq_I z6T&CfRjC|r1wBh8{kN8C>pa?>g2 zM~baj{FV!0}5L`fYGX{(IHq9Hh#8C!Vzt zIjzHj@CVJ3`G>wHJgwn#&u(0Wl@2TUI$4qMmZ>&qN6gCoj_o{N#Gp2>*yMaw;4HG~(mg#QHF(8Zc*J3Ff+J~uA%pm=kLHa1vaHx$-S0x!u6U6n zI64a<`Kuai?=Wxbh!8j5o^>-WKLA`G+kttKtaZR``di7QE!*CWKmU$QKO4RV0-Nc} zya1NirG>jT`OUk^IK3x3_4?T?2A;1Ffrq5Hmd0l5%8e06h`pcHqr0e4v9leu68WA| zRfcgEK?HbEPC;{4TkWJT3mz(yfiM3H01!7Rrk|maDn@NYOiZEXQv5ety4nLEgxnUh z!6pmfgX3h4V9yIAh=bnIzuDk;-%ovyWtY}MM}_tyNZqhxov>zZp)FAsx-&Z}v+7^6+wy$j=O?!?itbBj*~WHMuEaU`e;AhxYAsxWSXMkhJ8FrWI zIVlp6nW~kl1vq3m!(w4@*1i_0wyA^#I|x{60l-m|XCAq;b`VpSRHRqsML02!^ghl` z-g_lgfYkwB_V*bDvn5jorZiyd#6$0)g{2EfY3=K+Y{}27Zq*OVcuHB*{$6F^NBXnT zO_ge#qi;*IMy0>ZiR((fv6J_wE@{S;{#uO)g{W<%SGx_h6!{n4;o4DX6LKExJ#VgD z92QDToWakrV`0a|q}^#c#^Bq4imDmv3T=g!`x8ox{!m`JVAT-&z2KaJ+k0{s*1i#$ z{-$gU*K7J2M+5z=Sjr3YGeyn0fR%-r6k|)+!W+XuDL62|Nd6nh3ZsIrl!JuPs3l?Y zdF#*qJcnuWFB%~$LT%k#s^dD%Xj%4a$oL6TfaUnb_nRfXnzXQfoZkY-iXOw#^6Gmx zZpYMShe;*NysFvH+_zFOQR!|!{raKu&ZYXr8WOVKa3B|Wl~qLSGdKY7Gul>u_#O64 z0DwDyq*>|R<*ixmBCKl-m-Kb=Er5DaR1`rIZeMAT2oZ**i^7Mu>`eL8jb(0D@_36HLtTK!6Dw|r<-gDSc-XDA)qv`GxlcU;j)?5E(f@ww{#w#}NM@-fCM9KGEc50My zfomo<_ z5~eZHKtKLxCmE=Okqtp3pJ2;ho&01g9};5+Iy3cw(xM{{r>HF?+k+C@CNfJqMmub# zKoY{`Ns)gts5%vf;?l{ZlAfe)Z+8A!usz5@jq18MNBqH6I>Vt?F!DEbxLNj;wLaNv za~k~!$!;MGW*d`^-;7Pv)5idTUa_xcexv)HL|(_y?%JtziIG>2(-H&U5fP7%GPIDgx zUtI;Q;sun}x+!L=GLg<2oWSdA#KX}X`iRysHx!bV0fKL7g7mp*seg6CXCbY>wxrx920XeJBZ_nT@K> zBq@g%s-S(T%N~l69|rcmyn?y=3Z8G_1hsxU<59?DLG`Ee25U2X7|iuIy_!5<_f1Km z+5*90)*fCrT63-Kaz*mN3(I=;(}wur-ueEZLA6KnWq%uMR!fL}jIq_Inux(X>0-@_ z&PfI6+7ght{NXu4FIqr}PZldYwXbv0S*GF&${w3eP8P-H6R}~J{}VI-aPIWnkf*mG z$ooskEdF|4V3~VX%gE3Df8mu>tmmkW>e`f zS!|qCUek}{S;g6&Y+OS8^pFl|pHIDtzySMu;YVJkglpVzAl}eUQNqXBs7zIrzh#4$ zVvf(@XG+3THUSww{(*m`sXXkWL;i({gi*39=+d1Ak16K9i}!ft_O8{Q7u{M0=83K- z)Xea({MFnfiHfugWGl2KB;4F8;i-BEE?uVtSCFSq1A}&i1Mch%HCuicj?1gg^kpn+ zktb8pp1PUm7>^_?VPP?A$ts&#ku_Zw5f9Dd#JMp2Ue~YXq2FGVF73pX^~*+)Osg9w z&1#Yc)tFTl!e1RvJcHB=gqda-B~Ea3Qf1z>_R$TftULnSnK;oO=$WtJqYyT`@)Bm9u%g4)kwtLTHGw&=5^uI!lnd0&tX0 z`w-T{WmCNU)G=EsNV|wc(@2`>_oBU(n_mhbME$JY%o&U7`p|dLyD$CeCs$6X(svvx zG&xA`Fry%j3LNHPtf0cC*CmKdx}Ra&V? z)WtDTEu5Fe(t5?_y`M+JtaTrPm>t39eC$Q5RvQH}lIb1y(W2{a^W{WZyOT&FT&9lq zkCe|zFFO7jOPSUH$$pJ$270<=+Z0IJCP%eh zu9Yk9oAj&*jOf@gvfQwyxBZw_{^L?(61k8#*S=u!Gu_qWDYefgTyKWv%r{ zhZ797Q2O(`8!}*Q90Ju$H%r0ppXZZ|6~FgNe+_z>W`lZ5QC{-^!4qR+6SHRr8(MQr zM>Bn|UOy9=v;8Pt)g!1^uGd6GA%5YS9nkliHPB~zn|PtNQ_ta;^g3!9xt;LfL_tcP z$WE~nZ#V;ybZI4R>x1kk_ny?*sCdUdqbmy}z8-1suYrSY7Haef2Nvt%FZhv)zYg2; zSrhQmoxEzdcdW`un5csD488beYi@6wDQ~0c0bniqm3F6oZ7OWw1IEpMzt2^rWnb`_ zz^{kqZqkwyecCSyc*E8G2A@o>K*0|xcV!=tqj!`S&K&@jkM6FA6W5HdH_ zZYV=jrj$O_5rDRhtLb!t)%)7p6Nd@boI-|yBc%(rc;i;;3*-sQo-g%-rHzewu-;AJ zW%1Ad3m*aY@rr3;$P##X&n7!VgpR&fbUoTrnL)0cMedpGT29({- z6u0=Nqb~CKKYmPUPKI>i+4c3S4uWhw5M<`1<=|pfu5k6(Bmr$jpH=dNXsTF=dh-kW z#Qo?~IUGRiCr$eivd^m`bF0;?qdO*hJ@ds$}fzw__=d6cBE zu$tf{v$*Ou&~08_dGIxer3-jPX)ZYUO>^hIDc$q2|}7^1jFm?Fecw zO{bSXlhiT@tqSk&i5i#wr-a`bPXqYS85w-&R>98VK4tatEcEN$YOBAs4(aYbtS8I@ zd&IX4jwM>OF8zEYTNdlJ7j)bD)^LnQI84LSj*D-pXJ$Dv3!W=P5nuMt89g;{%WY`q z)uV?k;sy^Oob1OGYM!-OHql~~JS)KVySd~Hx6GUxiRk=nuAOuf#c4B_P8-uOOTtuR=QjkaJ07@x{g8p_ zYkm3QqXkDV01~(k1n3F?;V(?;r!B2ue&s zVCPjqZ20ZwKavPrlMuTJ6nlP*1W{ai@G-C_QL5grz|lZQuv!JLcK|qaGDkVA504do za;=Ll*YW#Ww9+uteXELscE?u---sllB8AbSyP)pB{$b)s1H_cuTe+9vSK%(>l$We_ zb!Lj-g~Lza3gnhg<_Cq{#BW3dyN_}_b114+!`W90!U$z0$VwuVL9p|y!i%=oVeGqz_P_oyQPr zU>+O2=c;V>mJQkUHm|OY(?nol)8Ih}FM{)6?qWVRLjyk%@wjm!K%z;`wjanwBC}in zvQP5GKS|1D_E9yOz1P)MA&%hoIH^oTo}}q8XALgOgIumEFlBu0f);;tDa!t)}^!x1R?c?MQ0J1G*XnXppG1{r+!u`%+ z&H7RZTxY7}I>8r`j|JryZpvbck~UY>esD$D$X5juUHB^c4FX%qr?-TRvKr~3_LKG{ z;WhjW2=6K8*R-SDO+?&EqT9BPi`VJo?tw9XBLQDC+$?LDW8R!u*#Z5O{*EM^^rNql z`D{mlEBR$D%i{AuSKHKL3POp%##Wyk1FGh6$Z97+VLt6Hgt5&^>VHlO#n>f!6|*MNbXpnzK!oZvy>!?-?71msao@$E18 z!}!W_J1kCgaLC>1c_-Za8}RB<^sKYRbEWH+-uvTR^==I794lX+26NA34O>gKI5!tHiDm>$l*2@R?_3xp`J-deJX8QyPsrZ`r#?vmE5!rR)|{eW@lg0 z#3C|oFDYSyWVg4X+Es{}#>9L^`c+dzHZVpNdm9aj92n@G>BGLb+8o#4einPD_u*>X zqCuWp!EdWV5E(%A{<4?4RN+10i5wfGR4!zcem-3^4{?(UW@i z5Ay)t+5~a+;^yTus($hHWam%f0Y2r6@bK=>{VLrQ9ZOWnK9@Ov|ujuXjL>kCbLR4#5W#i zcaC6QN2}*Y-?k(WrOaF3``kUWeiTW$_0l`z^*ak$|2>fnYoQU_GTNO9d%RJN-gkvc zI|?6{Y3=NGm99C;K6m*D$$bhI_DLGPFf-wqGC@t7Hs0^f5XP{RoS@qRXXD9i2YWRo z-=raFd!n>};=UK?SPuXo_xJ1K5Zjn7p?6~(*_|M=ep_gS8S5%x_x#$DzHc>l3cT#0 z7?RmH6v@+L+*ZVsILH;XmKq}7pW$LgmJOlAEh&*&#_sK(RyNMFQsK+fZkLR7Np6Cy zz0!?jtubGeXjwp_He^e*XrY!3chkhgX70PMXOZa}W(ln;Lgd2Qbe*}7iV<}kRS;{m zeA4{*zj;^jsr3X^J_y_{yHcVLwsmpH8=7GR!;mjQgTm{UOBxX=9gnz!8Vm#j!^HL4 zt|~VxhEkj(mcIg5K_HP0BUzcSlAms-JN?**6V-ku#Y-e?Ro_&9hMHM6MaxF?%F6|o zWpHDneiapi^~Zvwgn4XL8FO}#K4pIVlGByFRT~%F=XFL4FfwZ1x1ugs@Uz_fF)}{~ z#RY;YEwTw=Y2nRzj`w_$?Y}V15+}U`P&=hJMY2WNg>!LZlSf1534i=LJYJ4pz zM}V0p7f9TTrVT7DI=M#pji6T=ljgGavf^6_*`api1$+ zLO~^tSTpVjBrDZ$HcQO8-w>kY*1pQsQNm@aCf=fNF_oa#iPscu2{VOB267plQ4;|c z76iszW~kTkS3hME9ulQHyhDTvA2NFs;WIczc)jy-Ya&$Andux35y8`$OBHj}HS|!e z>PP*#6Eg*>O7dn-`|ozzCX7V(deTs$Wx>p-m1^}%Jyen%$;yPKBOmYDWMy1EgodxE zurf16dBdyFY!I_W&;))|z`khL11h)wI<#q4r1nMpOya)rCL zL!#%QD9aWK;aB5uH65N?P8$|sT0WVJ%Zm3}4`X?T8C=Rs zO8w^Cw%ChW8vJVDXLXZGnlH1y+QNXCNt`X`RR3LKb%LRv{OAd)KkTi8M1y6S`EI{K zPm4h1FIkNNs6hFtZgC?=neFQBwCFD!X$05X>Ou2o&HT{5?RN)&F6Ns4sQrfNT9R+w zx22VpCHkIL#np=?oHVFcnB3oe&V!O$j9eFxVL#9as)<=?9G$E#c>%Y@;P~Uo zYgnYIVRvR0-**SXl4@#|mZx1S!u)K)vOW=QrNZ$U!OF6|+D`gbK-kVnIKh z#4K!n?pXbRu&(3!<(hxO)474d5zP!YLh#$N!r`u3h8hU8eE7aiE|1LGYG0@6*E-%d zuDxHw>?2%bgh}hkX17cgg>UTjuE>8n@|UL&X+YWL46(&OR0CD(W@Om(n|>@+^iJv= z{SRcJ%^Qcs0ZKBR6HQEt8N7E4i_ZZK7CBi4IqZ)}I}Wqn`7w)2TuQH2JYAhmOfm1&2d&J90ez2~iKGqaUw_tM5T0cAhVpv2}nWF~vb zo~rb@ebZ)a{&x8sSLTIYIhGmdwLRQgKe^v%$ka%#AN|@$c*JT|Rua`p6Aonhl);yg z@abgnJWjg#m;WrlZt1VSB z5v%gWdi(Dk04LJMWMYXzFPwB}4$@6h#ZJkCo}TO0!h22!0C{)X{P=Lr^VGSVkB*ue zPi^P{0WOl_)s~jGM{#)ns0-su5Y9~87!EpuU7p2hFgzE-o*He-`KIq>$({AEa8TXj z9~rbD&>x!itX}`?=R1jlWfYEsFv)gKzW>@B%Yuv4>VJrj?7lY0qK^iv?m{dHsU~^5 zntx^}_$I!i6{Cft%&gfQZzEY32l4Dp{&gF2MEGZHR;E;|VjApq_dI2YJS~81q31#* zC!M;2tx9gOk?}pgN6nrE)OQ-iPp5jx$XA2y{KDH8^RV9Fc*z-T*rG^j8{-0LkT5ba z8pw1RHJjgm?V@ReLp0wy4A;yYF3oac#!y5IA#n++VzD>ORH_+Sb4boum(^-i<9IJV z#aC3hEPAif;zei+VEd4bC4CahvTzUZQCI#`M=l?UShto$x2+yvEv z!lGn?CfR1x#gqQpe_MD9%gQC0hc)9BgVq*{3o{DouI-yyghZ4Y;ueqy^;zs81P&zc z%KTy&+4!VEDM?cCf)x$YL4wkceb7cCa;X?S`^_E~Flc8kb0c!5i3s}}LI{h0&0yi zCr5pT)t+}SoKU4b{#;OX6%@7$i^*-ED8+euwcv<1JsS;RrDm*xyw@|m=ND>6{PP^a zs|G&AIb)XKk2`1TW@mk1Nqw#wM}a!uTQeVhUb@<}H^pMs20FC%E0@G zaWiEVYShPl2%hgKL4rZNd9{*Qf8g#GV(U5Z^FMRv(`)0Eu^dv4xBM6Q1~#sRv-ePO zxC3Bi55{SJ1nM;sQC+$xM;y-t{Ax%o4Y!? zeMF0v`A*3@ux%CoZg0pvkJ7DUiK&`PHd)p4au}1p(Uo=iN9}tU7qX{=&%h=y&IfI$ z3JKg_RpS`$C~t|jACh%a5CRrZ?g968i0dfJTT7=JNWvO1J|u{JY;4YD{|qJT&61wI z3)VOvK@x4^p;;<19JO*YLJPV#uphONd|hZWZ9J8{s^EGZ!!XBG0E-~dDW5^Ow&3O6 zguU7tx~L4~m3q#VH*=~+=B^FJ94N8Flkr%+C%vtoI5IgCo5?2mFXYIc*kVX%sA$~@ zT&p-;@ih1qJC3^)S{V=x{}8!&00>C=;kl^&UB|4iwaIF{4>r^+6Rlhs{&%0cAmng^ zMl`e}SLs$t<=xE-4Zkj2FVV~t*M%l8yf${L%s`??3>)@5Q&u%pSKx@`p=(aqIMh8+ z$GF%;rwhG$hw=d+;)vbj9kr#vO}j`-@*J$D6cy0@z0Rz-Fd&7{NUjP!jJ5z*Fu;wq zD>_ph&zeY-RN|yq-%g?!35m%GmU9s8p$VS(B^fOcArIrwyQIfHH+v6uh&jw~wEW4X zc-Gn49lMdyzXWB(UL*Be__JCr;HIjGcoAh{2CY9;n$ppYGh|IhhqxbXA4X^%7)72LpDE>?wk89rD*Qda|a#O z3MopRgR2(q@!F0Ij`rEn^`0JW+RNND|9)ekL<#rWLlIr{;c$7g@u)Jr^-wdA;`>95 zM?^z&TwBW}UMxFnLn>zU(qY&_Kkra0rXb;xrT*08ubCJ@mxxI81MhY`9*zZP_)@}@ z>g@3=$|uWX*yY=9aYIigr;2Gst-Z^JAHt%ua3`Rjg{0o?|J@LX$|@UWTQb=A{xZjW z1@l*fRnf6;8%6WqRX>G2jdhx-cUtVraCgx&U*c1qcF07xt=_);dz`oog4CP3VBQK6TyBT^|BTo|*+>nX-KI!f;<^f2b)^VGo%;Fs_ zH~Ai5Wgy2hbaYqx_L0g>yD!4J{SmkNr6LRD1zYUE$V{xu(O^RS458O|Sy&fZQWkK0 z(MKc77a~kO?l*)R!S|%MCYw~&i3)GN{diafhw0KS!)B+zWLi;TEGZz1dZ<(&;4bN1 z9ZN|Ji!kzhws-}PB=2T6*oC-$Lnel!Q6ai|%MR6}5O$q<>A1#50jaM1MO7Cwa>fVx zNxY1pEiQ1*Y$`;qXDK9b?&FI=uVR|5hxdAhHPLf!((BQ^GlEMfwjBx=H$r$HjQ1$H zn0il4pq)r_P(*7N`^?KT_;n)s2?W9h9-bxltjxDdPD?3N>RJD^N@-*bORQB$Y2&6+ z?iAv+f8f&GvkzagB@&px=9L*tai=G6BP}o8$0?=Aq9pzRaJ%P6wi@K^KY#Lf#-ls! z{GrC^os)0Wx0e(2}{nFEeXf*3I zjnE=NZm%EuA&W_B>fJWIC~6V7jq!1f4c#C_fmfdKVxI(LE(wLL8hJNdlq$akjc z2G0!q0I_;#+G={%Vsvgj^Di*nG!F*W_?eCF_1CxIHWAnQTk&OBbQm2PR@F*8bXNY$ z>4(z2=m*P)xvM6oZDI7UZQjm_8~B;Dk~^4YT>K7hRORZQzj?UC*V^n9QKoYk>LO-M zD>nC}i zi8L=bH*0jO&GkKku}(`1F5)F%HKTUWotqlk2}(wR>y;1{zQcgBMe}^3rHyi;IpcoL zT5|Lm-nQjIz{e%GsWdJA?(O#KaUQp4t!@VQ+Ous8_=wiOru>_iz?0HHyUJkKmUlp0 zg*|6HaM!Mn7h>b^U8quAA9h7g>vIHcF)=A3Nxu|N%_5S4p=k3)8NMF)l&RuPBt+wr zDJIAhk~FBuUx{g_dzsOtd{$W6?;0=Tos(~3nhd1b%iyO2ETV5?oF8?u`c8w z7pch4O+~_I3wM0TPw*_L|EJztIT=D5w8IXhqqVaO7_wD&mu|BUh+XU|di##UBi|o3 zg`FE8&G)uvckRf^q(Ocu@?2dUhSXT;PmfjTJfW^Lg22i=gpYiuz#!QlRXpDVpH4KFL z0Jcl}|EOldjf>3xQO%I3R+N8KGy6ueyWjt%9&^(!V^Y;CxU(~Cr`Q?%rjW(^&Hw8B zOeUKi`~FE~S?xpTrt zH5Dx^%qW2U9^cK;E`qBFMnb*&8RpJBX|&SPZ>Z)*6+zoWmjZt~HcB?AJJP2&13x3< zKi2n3H?>0;Y)~pZl5M$ah_8+5(8q>dSNe1S=xh14s~>M(I){ESo2)nMW1cwI-*gvQ zJTbdZX`U*{bV3nwmaX4=EgtU{S@iCWcfD;`f_$}K>W_y?Io%B)`^Y0eA6AF zh%U$hpfN|U5O6Qo0}`oqQ=9K4Gg8(j@nQR_zN%_oEpf=qkwp6tn&Ci6im5Y~(Z0Yb zMKzDMX}1k&?IpEs9VywoRU9eI7jnN8>fwTa*)o+>h`#g9@uzXZkFe&QCf?2AE)_e$ ziqq9q!Y%kS@8b8bi&zVvhm{B=%_jC803^EYCiU{m>nd+`K(Ef!GaLAcXzh&m`Vz8b zp8M5sZ|c3Zs=cBc?So1bZpcEnJ_n4l-1&sE=v)oMATWI243#s!=BY!3ZpSyU^|LrZ zW^gHV06|9iwSx*169NRv_!WP8^t~#ugg0X+RRw;#COs-G7?(DZEakr{rL~12RE_vR zmIhCqKCZDIGk4!<$j$4k`{ZO%i)^xS42EO;L{O}@6ZCpl@e1_xKtxpq{i*Up$7&Jd z^3My7##{I9arhA?Q0I>U~e%P(r3)Pi&0kwT5YYJmTeifX z-JA98`uIs(4~5N%TYG#SsmUFN9D8G!vmHx06CsNUphfcXN4_cByV6a(n)st{*FiK< z@Qqpyp}?kW4h!CxL>z9}(x~a&I}JKRtN2Q$&`Xcq*0z_6HZ~}Tiki0|EeT{6S$jJr zvf8)IayfJU^w;IZ%b#%z!B)3kw73>PjpP`-cCA_6Ccw=q=%JQDSbdja_^d;>!lO}h z$`axr(hqLnsebca4`0U1UnQ}Qk;xN#=^=W_j-#6g%fSj5eMBOs2bpc=66*hK1qOYV=_M-5m2uk%h8dpFp7IBcs50)Y`?v1i)uoD- z(z|BGs@5n<2calR5+PP=v?NAtg1Xzg)F_IE8i_VWmeC?sh`VYlY9wZ;EmrJJpR4_R zpXYeK&mZvp;W_T>hsfc`alPNpx185GUa!~5;^Acr2w{A7q=FOLWmvm|6R=G($#qb2 zao7-lGtFJK*CAPjRvTN8oJo%sTr==fNbrG!{AnF$JFJgA8;_myh1|%Rjv~cD42BcQ z7=g(*TeM};qd$*Z&hvCn_Fc2m{o}3*qmoW6*&4WrF#RBX)xHSQ?d+L zLg9%3F`tCSwZ2@WR<0PxMQ*6Az~(A|4@$Roqs%O zN1njm_UD@C_+fg~%Sewr(#E}%wQLOAYZb{4RQU?WnDxsY{lt%1(TvZZg(|l52X>n~ z*F#-O+3tBTCs>E~cl%Wqg%5&f7}CT{63z6`Af@8p{ivfcqb3nMDlf-mnm=1#Z{B3c zB`tU)yUDZ6l*(mF<4E7 z?j*`8Jd8VUR?3gyDW+~$*j#=N&kZHVMWuwEXezA$>Pj)1%=yu(FZr9^BQLioDKgZj zc01@YnVfAK33{GNh&OFOJZASA-mSSU4KJnRp=Y7wStzM;GnJ_r5d(zsK+G(9Wjg}6 z(tvj&e%isA^{%QK45m(0_<*4tOuJ|Ca|~Q9G~s~N^Y44Qdw+JPnG1ncl_k~m`=L|; zLMK7T3%@IN|0h>%mQ7c>jkoJhE`j>4G*lHcHD;!pg=lDGmJdsk3mSj4E?0b;x<+?Q z)&ntE6en^#pZ~;^7g<@8M@47#p3bvVe?grPBd71=0$H6WQXiS)of?bE!Ni73q7^DP zfF5d}!Uz6rLnA&uC8h3f_kV<|GzbY|1-p&ndB

LgSw39}A64DMVG-rv6xqY7ssh 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 jTHs#`{A+=KE%2`e{ largest: - url = i['url'] - largest = i['width'] - if url: - links.append(url) - - - if collected >= photos_count or len(data) == 0: - collect = False - else: - time.sleep(1) - -if not os.path.exists(folder_name): - os.makedirs(folder_name + '/' + album_title) # creating a folder for download photos - -print("Saving to: " + (folder_name + '/' + album_title)) -print("---------------------------") - -download_count = 0 - -for url in links: - download_count += 1 - try: - try: - filename = url.split("/")[-1] - except: - filename = (download_count + ".jpg") - - destination = (folder_name + '/' + album_title + '/' + filename) - - if not os.path.isfile(destination): - urlretrieve(url, destination) # download photo - else: - skipped += 1 - - perc = (100 * download_count) / photos_count - print("Downloaded {} of {} photos. ({}%)".format(download_count, photos_count, round(perc, 2))) - except: - print("An error occurred, file skipped.") - skipped += 1 - -minutes = int((time.time() - time_now) // 60) -seconds = int((time.time() - time_now) % 60) - -print("---------------------------") -print("Successful downloaded {} photos.".format(count)) -print("Skipped {} photos.".format(skipped)) -print("Time spent: {}.{} minutes.".format(minutes, seconds)) \ No newline at end of file +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +import argparse +import os +import time +import traceback +from pathlib import Path +from urllib.request import urlretrieve + +import vk + + +def main(token: str, album_url: str, folder_name: Path): + vk_api = vk.API(access_token=token, v='5.102') + + count = 0 # count of down. photos + perc = 0 # percent of down. photos + skipped = 0 # unsuccessful down. + time_now = time.time() # current time + + url = "'" + album_url + "'" # url of album + print("-------------------------------------------") + + owner_id = url.split('album')[1].split('_')[0] # id of owner + album_id = url.split('album')[1].split('_')[1][0:-1] # id of album + + get_album = vk_api.photos.getAlbums(owner_id=owner_id, album_ids=album_id) + + photos_count = get_album['items'][0]['size'] # count of ph. in albums + album_title = get_album['items'][0]['title'] # albums title + + collect = True + collected = 0 + + print("Album title: {}".format(album_title)) + print("Photos in album: {}".format(photos_count)) + print("---------------------------") + + links = [] + + while collect is True: + data = vk_api.photos.get(owner_id=owner_id, album_id=album_id, count=200, offset=collected)['items'] + collected = (len(data) + collected) + print("Collecting data " + str(collected) + "/" + str(photos_count) + " ..") + + for item in data: + largest = 0 + url = '' + for i in item['sizes']: + if i['width'] > largest: + url = i['url'] + largest = i['width'] + if url: + links.append(url) + + if collected >= photos_count or len(data) == 0: + collect = False + + else: + time.sleep(1) + + target_folder = (folder_name / album_title) + target_folder.mkdir(exist_ok=True, parents=True) + + print("Saving to: " + str(target_folder)) + print("---------------------------") + + download_count = 0 + + for url in links: + download_count += 1 + try: + try: + filename = url.split("/")[-1] + + except Exception: + print("Failed to convert filename, falling back to sequential naming") + print(traceback.format_exc()) + + filename = f'{download_count}.jpg' + + filename = filename.split('?')[0] + + destination = (target_folder / filename) + + if not os.path.isfile(destination): + urlretrieve(url, destination) # download photo + count += 1 + else: + skipped += 1 + + perc = (100 * download_count) / photos_count + print("Downloaded {} of {} photos. ({}%)".format(download_count, photos_count, round(perc, 2))) + + except Exception: + print("An error occurred, file skipped.") + print(traceback.format_exc()) + skipped += 1 + + minutes = int((time.time() - time_now) // 60) + seconds = int((time.time() - time_now) % 60) + + print("---------------------------") + print("Successful downloaded {} photos.".format(count)) + print("Skipped {} photos.".format(skipped)) + print("Time spent: {}.{} minutes.".format(minutes, seconds)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + prog='vk-photos-downloader.py', + description='A tool to download photos from albums from vk.com' + ) + parser.add_argument('url', help='Url to target album', type=str) + parser.add_argument('-d', '--folder-name', help='Folder to put downloaded photos', type=Path, default=Path('.')) + args = parser.parse_args() + + TOKEN: str = os.environ['VK_TOKEN'] + + main(token=TOKEN, album_url=args.url, folder_name=args.folder_name)