View difference between Paste ID: SfE1rnqc and
SHOW: | | - or go back to the newest paste.
1-
1+
#!/usr/bin/python -O
2
3
# MTLBot - Magnet Torrent List Bot
4
# An IRC bot to search magnet bittorrent links.
5
#
6
# Instructions:
7
#   If you run the program without any parameters it will connect to IRC and 
8
#   start working as a bot. You first need to build a database of magnet links.
9
#   You can do this by passing a text file containing hash|name pairs. 
10
#   The format of the files is important, it must be hash|name where hash is 
11
#   the magnet hash and name is the name of the torrent. It must use '|' as a 
12
#   separator character. Each entry needs to be on a new line.
13
#
14
#   ex: `python mtlbot.py complete_fixed.txt`
15
#   This will add the magnet links from complete_fixed.txt to the database.
16
#
17
# Magnet link resources:
18
#   18m torrents: magnet:?xt=urn:btih:F5615DFB80AC995787C1B2219A75DF7805278DEA
19
#       Comes in the correct format, can import with the text files easily.
20
#   TPB Mirror: magnet:?xt=urn:btih:938802790a385c49307f34cca4c30f80b03df59c
21
#       A complete mirror of The Pirate Bay. You need to run awk on the file to
22
#       get it into the correct format. The command below will format it for 
23
#       you.
24
#
25
#       `awk -F\| '{print $6 "|" $2}' complete > complete_fixed.txt`
26
#
27
# To change the bot name/irc server it joins, just change the __NICK__ and 
28
# __IRC_SERVER__ variables. You can change the number of results returned near 
29
# the end of the file. There is a comment that says 'Change limit here'. Default
30
# is 5. You can load multiple text files with the following command:
31
#
32
#   `for f in folder_that_has_text_files/*.txt; do python mtlbot.py "$f"; done`
33
#
34
# Written by: Jubbs sha1(8af93afca276eb89e7ebc03cd87b0c9ca15fa1c6)
35
36
import sys
37
import socket
38
import string
39
import time
40
from sqlite3 import dbapi2 as sqlite
41
42
__IRC_SERVER__ = "irc.freenode.net"
43
__NICK__ = __IDENT__ = __REALNAME__ = "MTLBot"
44
conn = sqlite.connect("torrentlist.db")
45
cur = conn.cursor()
46
47
if len(sys.argv) > 1:
48
   print 'Loading torrent magnet data from: ', sys.argv[1]
49
   print 'Note: Must be in form HASH|NAME\n'
50
   try:
51
      cur.execute('create table magnet_list (name varchar, hash varchar);')
52
      cur.execute('create index search_index on magnet_list (name);')
53
      print 'Database has not been created, creating database.'
54
      conn.commit()
55
      print 'Database created, adding new data.'
56
   except:
57
      print 'Database has already been created, adding new data.'
58
   num_lines = sum(1 for line in open(sys.argv[1]))
59
   f = open(sys.argv[1],'r')
60
   count = 0
61
   for l in f.readlines():
62
      name = buffer(l[l.find('|') + 1:].rstrip())
63
      hash = buffer(l[:l.find('|')])
64
      cur.execute('insert into magnet_list values (?,?)',[name, hash])
65
      count += 1
66
      if count % 10000 == 0:
67
         percent = float(count)/num_lines*100
68
         print '%.2f%% Added %d records so far.' % (percent, count)
69
   conn.commit()
70
   cur.close()
71
   exit()
72
73
print 'Counting number of torrents in database.'
74
cur.execute("select count(1) from magnet_list;")
75
torrent_count = cur.fetchone()
76
print '%d torrents in the database.' % (torrent_count)
77
78
s = socket.socket( )
79
s.connect((__IRC_SERVER__, 6667))
80
s.send("NICK %s\r\n" % __NICK__)
81
s.send("USER %s %s bla :%s\r\n" % (__IDENT__, __IRC_SERVER__, __REALNAME__))
82
readbuffer = ''
83
84
while 1:
85
   readbuffer = readbuffer+s.recv(1024)
86
   temp = string.split(readbuffer, "\n")
87
   readbuffer = temp.pop( )
88
89
   for line in temp:
90
      line=string.rstrip(line)
91
      line=string.split(line)
92
93
      if(line[1]=="PRIVMSG"):
94
         sender = line[0][1:line[0].find('!')]
95
         query = []
96
         query.append(line[3][1:])
97
98
         for i in range(1,len(line)-3):
99
            query.append(line[3+i])
100
101
         if query[0] != '.find' or len(query) == 1:
102
            s.send("PRIVMSG %s :MTLBot - Magnet Torrent List Bot\r\n"
103
                  % (sender))
104
            s.send("PRIVMSG %s :An IRC bot to search magnet torrent links.\
105
                  \r\n" % (sender))
106
            s.send("PRIVMSG %s : Number of torrents in database: %d\
107
                  \r\n" % (sender, torrent_count[0]))
108
            s.send("PRIVMSG %s : Usage: .find KEY WORDS\r\n" % (sender))
109
            s.send("PRIVMSG %s : ex: .find Ubuntu 11.04\r\n" % (sender))
110
         else:
111
            bindings = '%'.join(query[1:]) + '%'
112
            print 'Received request from %s for %s' % (sender, bindings)
113
            t0 = time.time() 
114
            # Change limit below
115
            cur.execute("select name, hash from magnet_list\
116
                     where name like (?) limit 5;", 
117
                     [bindings])
118
            print '\t %.2f seconds' % (time.time() - t0)
119
            print '\tFinished execution.'
120
            results = cur.fetchall()
121
122
            if len(results) == 0:
123
               s.send("PRIVMSG %s :No results found, sorry.\r\n" 
124
                     % (sender))
125
            else:
126
               s.send("PRIVMSG %s :Result(s) found: %d\r\n" 
127
                     % (sender, len(results)))
128
               for row in results:
129
                  s.send("PRIVMSG %s :%s = magnet:?xt=urn:btih:%s\r\n"
130
                        % (sender, row[0], row[1]))
131
132
      if(line[0]=="PING"):
133
         s.send("PONG %s\r\n" % line[1])