Advertisement
Guest User

Chaos

a guest
Apr 21st, 2009
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.73 KB | None | 0 0
  1. #4olderDumper v1.00
  2. #By ~ dark.chaos.0@gmail.com
  3.  
  4. import os
  5. import sys
  6. import getopt
  7. import pycurl
  8. from StringIO import StringIO
  9. from mimetypes import guess_type
  10. from time import sleep
  11.  
  12. def post(server, board, thread, post="", image=None, name="", email="", subject="", password="pyegase", proxy=None):
  13.    
  14.     FF_XP2 = {
  15.         'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.5) Gecko/20060719 Firefox/1.5.0.5)',
  16.         'Accept': 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
  17.         'Accept-Language': 'en-us,en;q=0.5',
  18.         'Accept-Encoding': 'gzip,deflate',
  19.         'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
  20.         'Referer' : "http://%s.4chan.org/%s/res/%s.html" % (server, board, thread),
  21.     }
  22.    
  23.     curl_headers = [v is not None and '%s: %s' % (k, v) or '%s:' % k
  24.      for k, v in FF_XP2.items()]
  25.    
  26.     post = [('MAX_FILE_SIZE', '3145728'),
  27.             ('resto', thread),
  28.             ('name', name),
  29.             ('email', email),
  30.             ('sub', subject),
  31.             ('com', post),
  32.             ('pwd', password),
  33.             ('mode', 'regist'),
  34.            ]
  35.  
  36.     processor = {"orz":"tmp", "zip":"bin", "img":"dat", "cgi":"nov"}
  37.  
  38.     curl = pycurl.Curl()
  39.     curl.setopt(pycurl.SSL_VERIFYPEER, 0)
  40.     if proxy:
  41.         curl.setopt(pycurl.PROXY, proxy)
  42.     curl.setopt(pycurl.URL, "http://%s.4chan.org/%s/imgboard.php" % (processor[server], board))
  43.  
  44.     curl.setopt(pycurl.POST, 1)
  45.     curl.setopt(pycurl.HTTPHEADER, curl_headers)
  46.     #curl.setopt(pycurl.POSTFIELDS, urlencode(post))
  47.  
  48.     if image:
  49.         post.append(('upfile', (pycurl.FORM_CONTENTTYPE, guess_type(image)[0], pycurl.FORM_FILENAME, os.path.basename(image), pycurl.FORM_FILE, image)))
  50.        
  51.     curl.setopt(pycurl.HTTPPOST, post)
  52.  
  53.     body = StringIO(); header = StringIO()
  54.     curl.setopt(pycurl.WRITEFUNCTION, body.write)
  55.     curl.setopt(pycurl.HEADERFUNCTION, header.write)
  56.  
  57.     for i in range(5):
  58.         try:
  59.             curl.perform()
  60.             res = body.getvalue()
  61.         except KeyboardInterrupt:
  62.             return False
  63.         except:
  64.             print sys.exc_info()[1]
  65.             continue
  66.         if not res.find("SQLFAILS_") > 0:
  67.             break
  68.    
  69.     curl.close()
  70.     if (res.find("file entry detected") > 0):
  71.         print "Duplicate File Entry"
  72.         return False
  73.     elif res.find("Flood detected") > 0:
  74.         print "Flood Detected"
  75.         return False
  76.     elif res.find("404") > 0 or res.find("Thread specified does not exist") > 0:
  77.         print "404'd"
  78.         return True
  79.     elif res.find("Updating") > 0:
  80.         print "Uploaded", os.path.basename(image)
  81.         return True
  82.     else:
  83.         print "Unknown Error"
  84.         z = open("error.html", "w")
  85.         z.write(res)
  86.         z.close()
  87.         return False
  88.  
  89. def usage():
  90.     print """4olderDump - 4chan Folder Dumper
  91. usage : %s [options]
  92. Options and arguments:
  93. -s,--server   : Server of the board. (Ex. zip, orz, img) [Required]
  94. -b,--board    : Board. (Ex. g, b, v no slashes) [Required]
  95. -t,--thread   : Thread id. (Ex. http://zip.4chan.org/board/res/1337.html, 1337 is the Thread id. [Required]
  96.                (That means you must make the thread first).
  97. -f,--folder   : Path/to/folder. [Required]
  98. -c,           :      Displays Current Image / Total Images as the comment.
  99. --comment-enabled
  100. -n,--name     : Name/Tripcode faggotry. (Ex. Iam##afaggot)
  101. -e,--email    : Email. (Noko, Sage)
  102. -S,--subject  : Subject.
  103. -p,--password : Password. (For Post deletion)
  104. -h,--help     : Display this help.
  105. -w,--wait     : Delay between posts. Default : 30 seconds.
  106. -r,           : Maxium retries before giving up on uploading an image. Default : 3.
  107. --max-retries
  108.  
  109. Example:
  110. %s -s img -b b -t 1337331 -f home/shit/CP -c -S "Am I Kewl Yet Guize?"
  111. """ % (os.path.basename(sys.argv[0]), os.path.basename(sys.argv[0]))
  112.  
  113. def main():
  114.     try:
  115.         opts, args = getopt.getopt(sys.argv[1:], "s:b:t:f:cn:e:S:p:w:r:h", ["-server", "-board", "-thread", "-folder", "-comment-enabled", "-name", "-email", "-subject", "-password", "-wait", "-max-retries", "-help"])
  116.     except getopt.GetoptError, err:
  117.         print "Error:", str(err)
  118.         print ""
  119.         usage()
  120.         sys.exit(2)
  121.  
  122.     usettings = {}
  123.     settings = {"server":"","board":"","thread":"","folder":"","comment":False,"name":"","email":"","subject":"","password":"pyegase","retry":3,"wait":30}
  124.    
  125.     dhelp = False
  126.     for o, a in opts:
  127.         if o in ("-h", "--help"):
  128.             dhelp = True
  129.         elif o in ("-s", "--server"):
  130.             usettings['server'] = a
  131.         elif o in ("-b", "--board"):
  132.             usettings['board'] = a
  133.         elif o in ("-t", "--thread"):
  134.             usettings['thread'] = a
  135.         elif o in ("-f", "--folder"):
  136.             usettings['folder'] = a
  137.         elif o in ("-c", "--comment-enabled"):
  138.             usettings['comment'] = True
  139.         elif o in ("-n", "--name"):
  140.             usettings['name'] = a
  141.         elif o in ("-e", "--email"):
  142.             usettings['email'] = a
  143.         elif o in ("-S", "--subject"):
  144.             usettings['subject'] = a
  145.         elif o in ("-p", "--password"):
  146.             usettings['password'] = a
  147.         elif o in ("-r", "--max-retries"):
  148.             usettings['retry'] = int(a)
  149.         elif o in ("-w", "--wait"):
  150.             usettings['wait'] = int(a)
  151.  
  152.     req = ["server", "board", "thread", "folder"]
  153.     for k in req:
  154.         if k not in settings:
  155.             print "Error: Missing required option", k
  156.             print ""
  157.             usage()
  158.             sys.exit(2)
  159.             break
  160.  
  161.     settings.update(usettings)
  162.  
  163.     if not os.path.isdir(settings['folder']):
  164.         print "Error: Folder",settings['folder'],"does not exist."
  165.         print ""
  166.         usage()
  167.         sys.exit(2)
  168.        
  169.     print "Starting..."
  170.     files = os.listdir(settings['folder'])
  171.     images = []
  172.     for f in files:
  173.         if os.path.splitext(os.path.join(settings['folder'],f))[1].lower() in (".gif", ".jpg", ".png", ".jpeg"):
  174.             images.append(os.path.join(settings['folder'],f))
  175.     print "Dumping", len(images), "images."
  176.     i=1
  177.     for image in images:
  178.         print "Dumping image %d of %d." % (i,len(images))
  179.         comment = ("Image %d of %d." % (i,len(images))) if settings['comment'] else ""
  180.         for r in range(settings['retry']):
  181.             z = post(settings['server'], settings['board'], settings['thread'], comment, image, settings['name'], settings['email'], settings['subject'], settings['password'])
  182.             if (z): break
  183.         print "Waiting..."
  184.         sleep(settings['wait'])
  185.         i += 1
  186.  
  187.     print "Done!"    
  188.  
  189.  
  190. if __name__ == "__main__":
  191.     main()
  192.     raw_input()
  193.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement