Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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)


Archlinux sur Xiaomi Air 13

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 cool

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

Archlinux sur Xiaomi Air 13

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)


Archlinux sur Xiaomi Air 13

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 wink
j'y jetterai un oeil quand j'aurai mieux avancé sur mes cours de python
ce qui ne tardera pas lol

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


Archlinux sur Xiaomi Air 13

Hors ligne