Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python -O
- # MTLBot - Magnet Torrent List Bot
- # An IRC bot to search magnet bittorrent links.
- #
- # Instructions:
- # If you run the program without any parameters it will connect to IRC and
- # start working as a bot. You first need to build a database of magnet links.
- # You can do this by passing a text file containing hash|name pairs.
- # The format of the files is important, it must be hash|name where hash is
- # the magnet hash and name is the name of the torrent. It must use '|' as a
- # separator character. Each entry needs to be on a new line.
- #
- # ex: `python mtlbot.py complete_fixed.txt`
- # This will add the magnet links from complete_fixed.txt to the database.
- #
- # Magnet link resources:
- # 18m torrents: magnet:?xt=urn:btih:F5615DFB80AC995787C1B2219A75DF7805278DEA
- # Comes in the correct format, can import with the text files easily.
- # TPB Mirror: magnet:?xt=urn:btih:938802790a385c49307f34cca4c30f80b03df59c
- # A complete mirror of The Pirate Bay. You need to run awk on the file to
- # get it into the correct format. The command below will format it for
- # you.
- #
- # `awk -F\| '{print $6 "|" $2}' complete > complete_fixed.txt`
- #
- # To change the bot name/irc server it joins, just change the __NICK__ and
- # __IRC_SERVER__ variables. You can change the number of results returned near
- # the end of the file. There is a comment that says 'Change limit here'. Default
- # is 5. You can load multiple text files with the following command:
- #
- # `for f in folder_that_has_text_files/*.txt; do python mtlbot.py "$f"; done`
- #
- # Written by: Jubbs sha1(8af93afca276eb89e7ebc03cd87b0c9ca15fa1c6)
- import sys
- import socket
- import string
- import time
- from sqlite3 import dbapi2 as sqlite
- __IRC_SERVER__ = "irc.freenode.net"
- __NICK__ = __IDENT__ = __REALNAME__ = "MTLBot"
- conn = sqlite.connect("torrentlist.db")
- cur = conn.cursor()
- if len(sys.argv) > 1:
- print 'Loading torrent magnet data from: ', sys.argv[1]
- print 'Note: Must be in form HASH|NAME\n'
- try:
- cur.execute('create table magnet_list (name varchar, hash varchar);')
- cur.execute('create index search_index on magnet_list (name);')
- print 'Database has not been created, creating database.'
- conn.commit()
- print 'Database created, adding new data.'
- except:
- print 'Database has already been created, adding new data.'
- num_lines = sum(1 for line in open(sys.argv[1]))
- f = open(sys.argv[1],'r')
- count = 0
- for l in f.readlines():
- name = buffer(l[l.find('|') + 1:].rstrip())
- hash = buffer(l[:l.find('|')])
- cur.execute('insert into magnet_list values (?,?)',[name, hash])
- count += 1
- if count % 10000 == 0:
- percent = float(count)/num_lines*100
- print '%.2f%% Added %d records so far.' % (percent, count)
- conn.commit()
- cur.close()
- exit()
- print 'Counting number of torrents in database.'
- cur.execute("select count(1) from magnet_list;")
- torrent_count = cur.fetchone()
- print '%d torrents in the database.' % (torrent_count)
- s = socket.socket( )
- s.connect((__IRC_SERVER__, 6667))
- s.send("NICK %s\r\n" % __NICK__)
- s.send("USER %s %s bla :%s\r\n" % (__IDENT__, __IRC_SERVER__, __REALNAME__))
- readbuffer = ''
- while 1:
- readbuffer = readbuffer+s.recv(1024)
- temp = string.split(readbuffer, "\n")
- readbuffer = temp.pop( )
- for line in temp:
- line=string.rstrip(line)
- line=string.split(line)
- if(line[1]=="PRIVMSG"):
- sender = line[0][1:line[0].find('!')]
- query = []
- query.append(line[3][1:])
- for i in range(1,len(line)-3):
- query.append(line[3+i])
- if query[0] != '.find' or len(query) == 1:
- s.send("PRIVMSG %s :MTLBot - Magnet Torrent List Bot\r\n"
- % (sender))
- s.send("PRIVMSG %s :An IRC bot to search magnet torrent links.\
- \r\n" % (sender))
- s.send("PRIVMSG %s : Number of torrents in database: %d\
- \r\n" % (sender, torrent_count[0]))
- s.send("PRIVMSG %s : Usage: .find KEY WORDS\r\n" % (sender))
- s.send("PRIVMSG %s : ex: .find Ubuntu 11.04\r\n" % (sender))
- else:
- bindings = '%'.join(query[1:]) + '%'
- print 'Received request from %s for %s' % (sender, bindings)
- t0 = time.time()
- # Change limit below
- cur.execute("select name, hash from magnet_list\
- where name like (?) limit 5;",
- [bindings])
- print '\t %.2f seconds' % (time.time() - t0)
- print '\tFinished execution.'
- results = cur.fetchall()
- if len(results) == 0:
- s.send("PRIVMSG %s :No results found, sorry.\r\n"
- % (sender))
- else:
- s.send("PRIVMSG %s :Result(s) found: %d\r\n"
- % (sender, len(results)))
- for row in results:
- s.send("PRIVMSG %s :%s = magnet:?xt=urn:btih:%s\r\n"
- % (sender, row[0], row[1]))
- if(line[0]=="PING"):
- s.send("PONG %s\r\n" % line[1])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement