Skip to content

Instantly share code, notes, and snippets.

@013
Created April 13, 2013 19:46
Show Gist options
  • Save 013/5379769 to your computer and use it in GitHub Desktop.
Save 013/5379769 to your computer and use it in GitHub Desktop.

Revisions

  1. 013 created this gist Apr 13, 2013.
    81 changes: 81 additions & 0 deletions scrape.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,81 @@
    #!/usr/bin/python
    import re, sys, bencode, binascii, urllib, hashlib

    tracker = "http://swiftler.com:6969/scrape?info_hash="

    def usage():
    print """
    Usage: ./scrape [OPTION] [FILE/HASH]
    -h Use a hash to get seeders, leechers and completed downloads
    -t Use a torrent file to get seeders, leechers and completed downloads
    -g Generate a magnet link from a torrent file
    """
    exit()

    def get_url(tracker, info_hash):
    info_hash = binascii.a2b_hex(info_hash)
    info_hash = urllib.quote(info_hash)

    return tracker + info_hash

    def get_info(url):
    response = urllib.urlopen(url)
    op = response.read()

    match = re.match( r'd5.*completei(.*)e10:downloadedi(.*)e10:incompletei(.*)eeee', op, re.M|re.I)
    if match:
    return match.group(1), match.group(2), match.group(3)
    #print "match.group() : ", match.group()
    #print "Seeders: \t\t", match.group(1)
    #print "Leechers:\t\t", match.group(2)
    #print "Complete Downloads: \t", match.group(3)
    else:
    return "No match!"

    def get_hash(mag):
    match = re.match( r'magnet:\?xt=urn:btih:(.{40}).*', mag, re.M|re.I)
    if match:
    return match.group(1)
    else:
    return 1

    if __name__ == "__main__":
    try:
    opt = sys.argv[1]
    except IndexError:
    usage()

    if opt == '-h':
    try:
    info_hash = sys.argv[2]
    except IndexError:
    exit("Missing info_hash")
    elif opt == '-t':
    try:
    tr_file = open(sys.argv[2], "rb")
    meta = bencode.bdecode(tr_file.read())
    info = meta['info']
    info_hash = hashlib.sha1(bencode.bencode(info)).hexdigest()
    except IndexError:
    exit("Missing torrent file")
    elif opt == '-g':

    try:
    tr_file = open(sys.argv[2], "rb")
    meta = bencode.bdecode(tr_file.read())
    info = meta['info']
    info_hash = hashlib.sha1(bencode.bencode(info)).hexdigest()
    # Only generate a magnet link, then exit
    print "magnet:?xt=urn:btih:" + info_hash + "&tr=udp%3A%2F%2Fswiftler.com%3A6969"

    exit()
    except IndexError:
    exit("Missing torrent file")
    else:
    usage()

    url = get_url(tracker, info_hash)
    print get_info(url);

    56 changes: 56 additions & 0 deletions update_info.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,56 @@
    #!/usr/bin/python
    #sudo apt-get install python-mysqldb

    import MySQLdb as mdb
    import sys, time
    import scrape

    con = None
    tracker = "http://swiftler.com:6969/scrape?info_hash="

    try:
    con = mdb.connect('localhost', 'username',
    'password', 'db')
    cur = con.cursor()
    cur.execute("SELECT * FROM magnets")
    rows = cur.fetchall()
    desc = cur.description

    for row in rows:
    try:
    id_f = int(row[0])
    magnet_uri = row[3]
    last_check = int(row[6])
    seeders = int(row[7])
    leechers = int(row[8])
    except TypeError:
    print "Empty field, check database..."

    #print "Magnet Link: %s" % magnet_uri
    #print "Lastcheck: \t%d\nSeeders: \t%d\nLeechers: \t%d\n" % (last_check, seeders, leechers)

    # If the torrent has never been checked, or it was check more than 1 hour ago
    if last_check == 0 or last_check <= (int(time.time()) - 3600):
    #print "Updating... "

    info_hash = scrape.get_hash(magnet_uri)
    scrape_url = scrape.get_url(tracker, info_hash)
    #print scrape_url
    seeds, complete, leech = scrape.get_info(scrape_url)

    cur.execute("UPDATE magnets SET seeders = %d WHERE id = %d" % (int(seeds), id_f))
    cur.execute("UPDATE magnets SET leechers = %d WHERE id = %d" % (int(leech), id_f))
    cur.execute("UPDATE magnets SET last_check = %d WHERE id = %d" % (int(time.time()), id_f))

    #print "Number of rows updated: %d" % cur.rowcount



    except mdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)
    finally:
    if con:
    con.close()