#1 Le 20/01/2019, à 12:12
- k3c
extraire une info de la ligne de commande d'un process et la diffuser
Je télécharge régulièrement des vidéos sur les sites de replay de la
BBC
https://www.bbc.co.uk/iplayer/categorie … s/featured
et ITV
https://www.itv.com/hub/categories
Les téléchargements se font via l'utilitaire get_iplayer pour la BBC et youtube-dl pour ITV, et j'ajoute à la fin de la commande quelque chose dans ce genre
--proxy http://1.2.3.4:8080
Actuellement j'ai en cours 2 téléchargements sur la BBC
gg@gg-UX305UA:~$ pgrep perl
9126
10508
gg@gg-UX305UA:~$ ps -o cmd -p 9126
CMD
perl /usr/bin/get_iplayer --pid p06kbg8t --nopurge --modes=tvgood --subtitles --force -p http://5.148.128.44:8080
gg@gg-UX305UA:~$ ps -o cmd -p 10508
CMD
perl /usr/bin/get_iplayer --pid p06kc8mb --nopurge --modes=tvgood --subtitles --force -p http://82.206.132.106:80
et 2 sur ITV
gg@gg-UX305UA:~$ pgrep perl
9126
10508
gg@gg-UX305UA:~$ pgrep youtube-dl
14100
15418
gg@gg-UX305UA:~$ ps -o cmd -p 14100
CMD
/usr/bin/python /usr/local/bin/youtube-dl -v -4 https://www.itv.com/hub/dci-banks/1a9089a0003 --all-subs --convert-subs srt --proxy http://217.40.97.210:8080
gg@gg-UX305UA:~$ ps -o cmd -p 15418
CMD
/usr/bin/python /usr/local/bin/youtube-dl -v -4 https://www.itv.com/hub/dci-banks/1a9089a0004 --all-subs --convert-subs srt --proxy http://62.56.240.106:38291
gg@gg-UX305UA:~$
4 proxys, un super efficace, 2 autres moyens à lents, 1 qui ne fonctionne pas
C'est dommage que les 4 process n'utilisent pas le proxy le plus efficace
J'aimerai automatiser le fait de "publier" chaque proxy et récupérer le proxy le plus rapide pour le re-utiliser
Je peux mettre dans des fichiers une info du genre
BBC_p06kc8m=http://82.206.132.106:80
par contre je manque d'idée sur comment trouver le proxy le plus rapide
nethogs tourne souvent chez moi, et montre les process qui consomment le plus de bande passante
je peux essayer de calculer en combien de temps un fichier d'une taille donnée a été téléchargé, j'ai la taille, et je pense la date de création (encore que stat ne me la montre pas)
Merci pour toute idée
Le code utilisé pour la BBC
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# bbc_proxy version 0.3 par k3c, sortie quand deja telecharge
# passage de proxy en 2 ème parametre
import subprocess, sys, shlex
import random
import urllib2
import requests
import bs4 as BeautifulSoup
import socket
import glob
from threading import Thread
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13\
',
'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
allTimeouts = (3, 10, 15, 20)
class FlushFile(object):
"""Write-only flushing wrapper for file-type objects."""
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
global Finished
for line in iter(infile.readline, ''):
if 'Finished writing to temp file.' in line:
Finished = True
if 'Already in history' in line:
Finished = True
print line,
infile.close()
def getProxy():
import re
import requests
import bs4 as BeautifulSoup
html = requests.get('http://www.gatherproxy.com/proxylist/country/?c=United%20Kingdom')
soup = BeautifulSoup.BeautifulSoup(html.text,"lxml")
mastr = soup.find_all('script')
lst = []
for x in mastr:
slst = []
if "gp.insertPrx" in x.text:
m = re.search('"PROXY_IP":"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',x.text)
if m:
slst.append(m.group(1))
mport = re.search('"PROXY_PORT":"(\w*[0-9]*)',x.text)
if mport:
slst.append(int(mport.group(1),16))
mportype = re.search('"PROXY_TYPE":"(\w*)',x.text)
if mportype:
slst.append(mportype.group(1))
lst.append(slst)
for href in lst:
yield href
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
print host, type(host), port, type(port)
params = (host, port)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
def main():
global Finished
# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)
sys.stderr = FlushFile(sys.__stderr__)
idvideo = sys.argv[1]
for host, port, typeproxy in getValidProxy():
print host, port, typeproxy
# if len(sys.argv) > 1 and sys.argv[2] == '1':
cmds = "get_iplayer --pid "+idvideo + " --nopurge --modes=tvgood --subtitles --force -p 'http://"+host+":"+str(port)+"'"
print cmds
arguments = shlex.split(cmds)
Finished = False
file_down = '/home/gg/bbc/*' + sys.argv[1] + '*mp4'
file_success = glob.glob(file_down)
print file_success
if file_success :
break
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pid = process.pid
thread1 = start_thread(consume, process.stdout)
thread2 = start_thread(consume, process.stderr)
thread1.join() # wait for IO completion
thread2.join() # wait for IO completion
retcode = process.wait()
print retcode
if Finished:
break
if __name__ == "__main__":
main()
le code utilisé pour ITV
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# bbc_proxy version 0.3 par k3c, sortie quand deja telecharge
# passage de proxy en 2 ème parametre
import urlparse, glob
import subprocess, sys, shlex
import random
import urllib2
import requests
import bs4 as BeautifulSoup
import socket
from threading import Thread
from os import system
import os
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13\
',
'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
allTimeouts = (3, 10, 15, 20)
class FlushFile(object):
"""Write-only flushing wrapper for file-type objects."""
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
global Finished
for line in iter(infile.readline, ''):
if 'Finished writing to temp file.' in line:
Finished = True
if 'Already in history' in line:
Finished = True
print line,
infile.close()
def getProxy():
import re
import requests
import bs4 as BeautifulSoup
html = requests.get('http://www.gatherproxy.com/proxylist/country/?c=United%20Kingdom')
soup = BeautifulSoup.BeautifulSoup(html.text,"lxml")
mastr = soup.find_all('script')
lst = []
for x in mastr:
slst = []
if "gp.insertPrx" in x.text:
m = re.search('"PROXY_IP":"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',x.text)
if m:
slst.append(m.group(1))
mport = re.search('"PROXY_PORT":"(\w*[0-9]*)',x.text)
if mport:
slst.append(int(mport.group(1),16))
mportype = re.search('"PROXY_TYPE":"(\w*)',x.text)
if mportype:
slst.append(mportype.group(1))
lst.append(slst)
for href in lst:
yield href
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
print host, type(host), port, type(port)
params = (host, port)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
def main():
global Finished
# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)
sys.stderr = FlushFile(sys.__stderr__)
idvideo = sys.argv[1]
p = urlparse.urlparse(idvideo)
id = p.path.split("/")[-1]
print "identifiant de la vidéo ",id
for host, port, typeproxy in getValidProxy():
print host, port, typeproxy
cmds = "youtube-dl -v -4 "+sys.argv[1] + " --all-subs --convert-subs srt --proxy 'http://"+host+":"+str(port)+"'"
print cmds
arguments = shlex.split(cmds)
Finished = False
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pid = process.pid
thread1 = start_thread(consume, process.stdout)
thread2 = start_thread(consume, process.stderr)
thread1.join() # wait for IO completion
thread2.join() # wait for IO completion
retcode = process.wait()
print retcode
file_down = 'bbc/*' + id + '*mp4'
file_success = glob.glob(file_down)
print "file_success ",file_success
if file_success :
file_suc = file_success[0]
print "file_suc ",file_suc
file_srt = file_suc[:-3] + "en.srt"
new_srt = file_suc[:-3] + "srt"
print file_srt
print new_srt
#process = system(str("/home/gg/bbc/ren.sh"))
#process = system(str("mv \"${file_srt}\" \"${new_srt}\""))
#subprocess.call('mv -- "$file_srt" "$new_srt"',shell=True)
#subprocess.call('mv "${file_srt}" "${new_srt}"', shell=True)
os.rename(file_srt,new_srt)
break
if __name__ == "__main__":
main()
Dernière modification par k3c (Le 20/01/2019, à 12:26)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#2 Le 20/01/2019, à 18:04
- kholo
Re : extraire une info de la ligne de commande d'un process et la diffuser
salut,
je suis très intéressé pour une prof d'anglais qui voulait justement télécharger des trucs depuis bbc...
je n'ai trouvé que l'astuce pas très simple de faire une capture d'écran avec kazam...
un exemple ici :
https://www.bbc.co.uk/programmes/p0572w00
aussi je suivrai assidûment tes recherches
et j'essaierai cette semaine tes explications
merci pour le partage
Hors ligne
#3 Le 21/01/2019, à 09:02
- kholo
Re : extraire une info de la ligne de commande d'un process et la diffuser
salut
merci pour ta proposition en MP mais c'est pour l'expérience
donc on peut finir ça ici pour que je pige bien et fasse un truc le plus simple possible pour ma prof d'anglais...
encore Merci !
Hors ligne
#4 Le 21/01/2019, à 09:32
- kholo
Re : extraire une info de la ligne de commande d'un process et la diffuser
ok, donc, j'installe get-iplayer et je l'utilise comme expliqué ici
snap install get-iplayer
ensuite, je vais sur la page pour choper l'adresse et je la colle derrière get-iplayer
get-iplayer https://www.bbc.co.uk/programmes/p0573v6m
et ça marche direct !
NB : ça m'a mis le fichier où était lancé le script... en l'occurrence dans mon dossier perso
donc, avec nautilus, je dois pouvoir faire un nautilus-script facilement...
à suivre...
Hors ligne
#5 Le 21/01/2019, à 12:29
- k3c
Re : extraire une info de la ligne de commande d'un process et la diffuser
le site de get_iplayer
https://github.com/get-iplayer/get_iplayer
avec le pavé installation, dans mon cas avec pip, et je mets régulièrement à jour avec
sudo pip install -U get_iplayer
Debian 12 sur Thinkpad reconditionné
Hors ligne
#6 Le 21/01/2019, à 12:43
- kholo
Re : extraire une info de la ligne de commande d'un process et la diffuser
ok, cool..
snap m'a fait une installation en sudoer (donc pour tout le système) et je présuppose que snap est maintenu par Canonical donc validé au même titre que les paquets des dépôts...
Hors ligne
#7 Le 09/02/2019, à 20:09
- k3c
Re : extraire une info de la ligne de commande d'un process et la diffuser
j'ai modifié mon programme qui télécharge la BBC
!/usr/bin/env python
# -*- coding:utf-8 -*-
# bbc_proxy version 0.3 par k3c, sortie quand deja telecharge
# passage de proxy en 2 ème parametre
import subprocess, sys, shlex, os
import random
import urllib2
import requests
import bs4 as BeautifulSoup
import socket
import glob
from threading import Thread
from datetime import datetime
ON_POSIX = 'posix' in sys.builtin_module_names
Finished = False
listeUserAgents = [ 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_5; fr-fr) AppleWebKit/525.18 (KHTML, like Gecko) Version/3.1.2 Safari/525.20.1',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1',
'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13\
',
'Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/528.5+ (KHTML, like Gecko, Safari/528.5+) midori',
'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.107 Safari/535.1',
'Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/312.1 (KHTML, like Gecko) Safari/312',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Chrome/17.0.940.0 Safari/535.8' ]
allTimeouts = (3, 10, 15, 20)
class FlushFile(object):
"""Write-only flushing wrapper for file-type objects."""
def __init__(self, f):
self.f = f
def write(self, x):
self.f.write(x)
self.f.flush()
def start_thread(func, *args):
t = Thread(target=func, args=args)
t.daemon = True
t.start()
return t
def consume(infile):
global Finished
global speed
for line in iter(infile.readline, ''):
if 'Finished writing to temp file.' in line:
Finished = True
if 'Already in history' in line:
Finished = True
if 'INFO: Downloaded: ' in line:
print '*************************************************'
speed = line.split("@ ")[1].split("/s (")[0]
print '*************************************************'
infile.close()
def getProxy():
import re
import requests
import bs4 as BeautifulSoup
html = requests.get('http://www.gatherproxy.com/proxylist/country/?c=United%20Kingdom')
soup = BeautifulSoup.BeautifulSoup(html.text,"lxml")
mastr = soup.find_all('script')
lst = []
for x in mastr:
slst = []
if "gp.insertPrx" in x.text:
m = re.search('"PROXY_IP":"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',x.text)
if m:
slst.append(m.group(1))
mport = re.search('"PROXY_PORT":"(\w*[0-9]*)',x.text)
if mport:
slst.append(int(mport.group(1),16))
mportype = re.search('"PROXY_TYPE":"(\w*)',x.text)
if mportype:
slst.append(mportype.group(1))
lst.append(slst)
for href in lst:
yield href
def getValidProxy():
for timeout in allTimeouts:
print 'Timeout =', timeout
socket.setdefaulttimeout(timeout)
for host, port, typeproxy in getProxy():
try:
print 'Trying %s:%s' % (host, port)
print host, type(host), port, type(port)
params = (host, port)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(params)
s.close()
yield host, port, typeproxy
# except urllib2.URLError:
# pass
except socket.timeout:
pass
except socket.error:
pass
def main():
global Finished
# Replace stdout with an automatically flushing version
sys.stdout = FlushFile(sys.__stdout__)
sys.stderr = FlushFile(sys.__stderr__)
idvideo = sys.argv[1]
for host, port, typeproxy in getValidProxy():
print host, port, typeproxy
# if le,timergv) > 1 and sys.argv[2] == '1':
cmds = "get_iplayer --pid "+idvideo + " --nopurge --modes=tvgood --subtitles --force -p 'http://"+host+":"+str(port)+"'"
arguments = shlex.split(cmds)
date_time = str(datetime.now()).split()
date,time = date_time
global debut_t
debut_t = datetime.now()
print "début de transfert à ",date,time, "avec le proxy ",host,port
Finished = False
file_down = '/home/gg/bbc/*' + sys.argv[1] + '*mp4'
file_success = glob.glob(file_down)
global statinfo
if file_success :
fin_t = datetime.now()
dur = fin_t - debut_t
statinfo = os.stat(file_success[0])
size = statinfo.st_size
print "taille du fichier ",statinfo.st_size, "durée ",str(dur)
date_time = str(datetime.now()).split()
date,time = date_time
print "fin de transfert à ",date,time, " taille du fichier ",size
ln1 = "/tmp/" + speed[:-3]
ln2 = "PROXY_" + str(host) + "_" + str(port)
subprocess.call(["ln","-s",ln1,ln2])
subprocess.call(["readlink","-f",ln2])
break
process = subprocess.Popen(arguments, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pid = process.pid
thread1 = start_thread(consume, process.stdout)
thread2 = start_thread(consume, process.stderr)
thread1.join() # wait for IO completion
thread2.join() # wait for IO completion
retcode = process.wait()
print retcode
if Finished:
break
if __name__ == "__main__":
main()
Je crée des proxies qui pointent sur le débit obtenu lors du téléchargement
gg@gg-UX305UA:~/bbc$ ls -alrt PROXY*
lrwxrwxrwx 1 gg gg 9 janv. 31 18:42 PROXY_10.10.10.111_8080 -> /tmp/1.83
lrwxrwxrwx 1 gg gg 9 févr. 2 05:24 PROXY_46.101.19.100_3128 -> /tmp/0.02
lrwxrwxrwx 1 gg gg 9 févr. 2 10:11 PROXY_164.39.202.75_53281 -> /tmp/5.25
lrwxrwxrwx 1 gg gg 10 févr. 2 11:50 PROXY_88.150.135.14_8080 -> /tmp/34.87
lrwxrwxrwx 1 gg gg 9 févr. 8 00:43 PROXY_46.101.9.219_3128 -> /tmp/3.35
gg@gg-UX305UA:~/bbc$
il me reste à lire ces fichiers, prendre le proxy avec le meilleur débit et l'essayer
Dernière modification par k3c (Le 09/02/2019, à 22:57)
Debian 12 sur Thinkpad reconditionné
Hors ligne
#8 Le 10/02/2019, à 11:36
- kholo
Re : extraire une info de la ligne de commande d'un process et la diffuser
j'ai pas de retours de "ma" prof d'anglais...
je continue de suivre tes avancées
j'y jetterai un oeil quand j'aurai mieux avancé sur mes cours de python
ce qui ne tardera pas
Hors ligne
#9 Le 10/02/2019, à 12:23
- k3c
Re : extraire une info de la ligne de commande d'un process et la diffuser
Pour Python, le livre "a byte of Python" en français est en train de revenir, sur le site
https://rgilliotte.gitbook.io/byte-of-python/
pas forcément le meilleur livre, mais tu peux regarder
Debian 12 sur Thinkpad reconditionné
Hors ligne