Advertisement
nux95

pastebin.py

Nov 27th, 2011
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.01 KB | None | 0 0
  1.  
  2. import mechanize
  3. import BeautifulSoup    as Bsoup
  4.  
  5. LANGUAGE = {
  6.    'None':                              1,
  7.    '4CS':                               142,
  8.    '6502 ACME Cross Assembler':         143,
  9.    '6502 Kick Assembler':               144,
  10.    '6502 TASM/64TASS':                  145,
  11.    'ABAP':                              73,
  12.    'ActionScript':                      2,
  13.    'ActionScript 3':                    74,
  14.    'Ada':                               3,
  15.    'ALGOL 68':                          147,
  16.    'Apache Log':                        4,
  17.    'AppleScript':                       5,
  18.    'APT Sources':                       75,
  19.    'ASM (NASM)':                        6,
  20.    'ASP':                               7,
  21.    'autoconf':                          148,
  22.    'Autohotkey':                        149,
  23.    'AutoIt':                            54,
  24.    'Avisynth':                          76,
  25.    'Awk':                               150,
  26.    'BASCOM AVR':                        198,
  27.    'Bash':                              8,
  28.    'Basic4GL':                          77,
  29.    'BibTeX':                            78,
  30.    'Blitz Basic':                       55,
  31.    'BNF':                               56,
  32.    'BOO':                               80,
  33.    'BrainFuck':                         79,
  34.    'C':                                 9,
  35.    'C for Macs':                        10,
  36.    'C Intermediate Language':           82,
  37.    'C#':                                14,
  38.    'C++':                               13,
  39.    'C++ (with QT extensions)':          154,
  40.    'C: Loadrunner':                     199,
  41.    'CAD DCL':                           11,
  42.    'CAD Lisp':                          12,
  43.    'CFDG':                              81,
  44.    'ChaiScript':                        152,
  45.    'Clojure':                           153,
  46.    'Clone C':                           99,
  47.    'Clone C++':                         100,
  48.    'CMake':                             83,
  49.    'COBOL':                             84,
  50.    'CoffeeScript':                      200,
  51.    'ColdFusion':                        15,
  52.    'CSS':                               16,
  53.    'Cuesheet':                          151,
  54.    'D':                                 17,
  55.    'DCS':                               85,
  56.    'Delphi':                            18,
  57.    'Delphi Prism (Oxygene)':            177,
  58.    'Diff':                              19,
  59.    'DIV':                               86,
  60.    'DOS':                               20,
  61.    'DOT':                               87,
  62.    'E':                                 155,
  63.    'ECMAScript':                        156,
  64.    'Eiffel':                            21,
  65.    'Email':                             88,
  66.    'EPC':                               201,
  67.    'Erlang':                            57,
  68.    'F#':                                158,
  69.    'Falcon':                            202,
  70.    'FO Language':                       89,
  71.    'Formula One':                       157,
  72.    'Fortran':                           22,
  73.    'FreeBasic':                         23,
  74.    'FreeSWITCH':                        206,
  75.    'GAMBAS':                            159,
  76.    'Game Maker':                        24,
  77.    'GDB':                               160,
  78.    'Genero':                            58,
  79.    'Genie':                             161,
  80.    'GetText':                           90,
  81.    'Go':                                162,
  82.    'Groovy':                            59,
  83.    'GwBasic':                           163,
  84.    'Haskell':                           60,
  85.    'HicEst':                            164,
  86.    'HQ9 Plus':                          93,
  87.    'HTML':                              25,
  88.    'HTML 5':                            196,
  89.    'Icon':                              165,
  90.    'IDL':                               94,
  91.    'INI file':                          26,
  92.    'Inno Script':                       61,
  93.    'INTERCAL':                          95,
  94.    'IO':                                96,
  95.    'J':                                 166,
  96.    'Java':                              27,
  97.    'Java 5':                            97,
  98.    'JavaScript':                        28,
  99.    'jQuery':                            167,
  100.    'KiXtart':                           98,
  101.    'Latex':                             62,
  102.    'Liberty BASIC':                     168,
  103.    'Linden Scripting':                  63,
  104.    'Lisp':                              29,
  105.    'LLVM':                              203,
  106.    'Loco Basic':                        101,
  107.    'Logtalk':                           169,
  108.    'LOL Code':                          102,
  109.    'Lotus Formulas':                    103,
  110.    'Lotus Script':                      104,
  111.    'LScript':                           105,
  112.    'Lua':                               30,
  113.    'M68000 Assembler':                  65,
  114.    'MagikSF':                           170,
  115.    'Make':                              106,
  116.    'MapBasic':                          171,
  117.    'MatLab':                            64,
  118.    'mIRC':                              66,
  119.    'MIX Assembler':                     172,
  120.    'Modula 2':                          173,
  121.    'Modula 3':                          107,
  122.    'Motorola 68000 HiSoft Dev':         146,
  123.    'MPASM':                             32,
  124.    'MXML':                              108,
  125.    'MySQL':                             33,
  126.    'newLISP':                           174,
  127.    'None':                              1,
  128.    'NullSoft Installer':                34,
  129.    'Oberon 2':                          109,
  130.    'Objeck Programming Langua':         175,
  131.    'Objective C':                       35,
  132.    'OCalm Brief':                       110,
  133.    'OCaml':                             36,
  134.    'OpenBSD PACKET FILTER':             181,
  135.    'OpenGL Shading':                    91,
  136.    'Openoffice BASIC':                  37,
  137.    'Oracle 11':                         111,
  138.    'Oracle 8':                          38,
  139.    'Oz':                                178,
  140.    'Pascal':                            39,
  141.    'PAWN':                              141,
  142.    'PCRE':                              179,
  143.    'Per':                               112,
  144.    'Perl':                              40,
  145.    'Perl 6':                            180,
  146.    'PHP':                               41,
  147.    'PHP Brief':                         113,
  148.    'Pic 16':                            114,
  149.    'Pike':                              182,
  150.    'Pixel Bender':                      115,
  151.    'PL/SQL':                            68,
  152.    'PostgreSQL':                        183,
  153.    'POV-Ray':                           116,
  154.    'Power Shell':                       117,
  155.    'PowerBuilder':                      184,
  156.    'ProFTPd':                           197,
  157.    'Progress':                          118,
  158.    'Prolog':                            119,
  159.    'Properties':                        120,
  160.    'ProvideX':                          121,
  161.    'PureBasic':                         185,
  162.    'PyCon':                             204,
  163.    'Python':                            42,
  164.    'q/kdb+':                            186,
  165.    'QBasic':                            43,
  166.    'R':                                 188,
  167.    'Rails':                             67,
  168.    'REBOL':                             122,
  169.    'REG':                               123,
  170.    'Robots':                            44,
  171.    'RPM Spec':                          187,
  172.    'Ruby':                              45,
  173.    'Ruby Gnuplot':                      92,
  174.    'SAS':                               124,
  175.    'Scala':                             125,
  176.    'Scheme':                            46,
  177.    'Scilab':                            126,
  178.    'SdlBasic':                          127,
  179.    'Smalltalk':                         69,
  180.    'Smarty':                            47,
  181.    'SQL':                               48,
  182.    'SystemVerilog':                     189,
  183.    'T-SQL':                             130,
  184.    'TCL':                               70,
  185.    'Tera Term':                         128,
  186.    'thinBasic':                         129,
  187.    'TypoScript':                        131,
  188.    'Unicon':                            191,
  189.    'UnrealScript':                      195,
  190.    'Vala':                              192,
  191.    'VB.NET':                            51,
  192.    'VeriLog':                           132,
  193.    'VHDL':                              133,
  194.    'VIM':                               134,
  195.    'Visual Pro Log':                    135,
  196.    'VisualBasic':                       50,
  197.    'VisualFoxPro':                      52,
  198.    'WhiteSpace':                        136,
  199.    'WHOIS':                             137,
  200.    'Winbatch':                          138,
  201.    'XBasic':                            193,
  202.    'XML':                               53,
  203.    'Xorg Config':                       139,
  204.    'XPP':                               140,
  205.    'YAML':                              205,
  206.    'Z80 Assembler':                     72,
  207.    'ZXBasic':                           194,
  208. }
  209.  
  210. EXPIRATION = {
  211.     'never':        'N',
  212.     '10minutes':    '10M',
  213.     '1hour':        '1H',
  214.     '1day':         '1D',
  215.     '1month':       '1M',
  216. }
  217.  
  218.  
  219. def getLanguage(name, matchCase = False):
  220.     if not matchCase:
  221.         name = name.lower()
  222.         for k, v in LANGUAGE.iteritems():
  223.             if k.lower() == name:
  224.                 return v
  225.     else:
  226.         return LANGUAGE[name]
  227.  
  228. def getExpiration(type):
  229.     return EXPIRATION[type]
  230.  
  231.  
  232. class LoginError(Exception):
  233.  
  234.     pass
  235.  
  236. class PublicyError(Exception):
  237.  
  238.     pass
  239.  
  240. class PasteError(Exception):
  241.  
  242.     def __init__(self, msg, link):
  243.         super(PasteError, self).__init__(msg)
  244.         self.link = link
  245.  
  246. class PastebinCom(object):
  247.  
  248.     URL_LOGIN   = 'http://pastebin.com/login.php'
  249.     URL_PASTE   = 'http://pastebin.com/'
  250.  
  251.     FORM_USERNAME = 'user_name'
  252.     FORM_PASSWORD = 'user_password'
  253.  
  254.     FORM_PASTETXT = 'paste_code'
  255.     FORM_PASTELNG = 'paste_format'
  256.     FORM_PASTEEXP = 'paste_expire_date'
  257.     FORM_PASTEPRV = 'paste_private'
  258.     FORM_PASTENME = 'paste_name'
  259.  
  260.     def __init__(self):
  261.         self.browser = mechanize.Browser()
  262.         self.browser.set_cookiejar(mechanize.CookieJar())
  263.         self.loggedIn   = False
  264.         self.formPaste  = None
  265.  
  266.     def login(self, username, password):
  267.         if self.loggedIn:
  268.             return True
  269.  
  270.         pageLogin = self.browser.open(self.URL_LOGIN)
  271.         formLogin = mechanize.ParseResponse(pageLogin)
  272.         pageLogin.close()
  273.  
  274.         if len(formLogin) != 2:
  275.             raise mechanize.URLError('Invalid forms recieved.')
  276.         else:
  277.             formLogin = formLogin[1]
  278.  
  279.         formLogin[self.FORM_USERNAME] = username
  280.         formLogin[self.FORM_PASSWORD] = password
  281.         pageLogin = formLogin.click()
  282.         pageLogin = self.browser.open(pageLogin)
  283.  
  284.         import webbrowser as wb
  285.         wb.open(pageLogin.geturl())
  286.  
  287.         # check for login validity
  288.         soup = Bsoup.BeautifulSoup(pageLogin)
  289.         errr = soup('div', {'id': 'error'})
  290.  
  291.         if errr:
  292.             msg = errr[0].renderContents().strip()
  293.             msg = msg.replace('<u>', '')
  294.             msg = msg.replace('</u>', '')
  295.             msg = msg.replace('\n', ' ')
  296.             msg = msg.replace('Error:', '')
  297.             raise LoginError(msg)
  298.  
  299.         self.loggedIn = True
  300.         return True
  301.  
  302.     def paste(self, code, title = '', language = LANGUAGE['None'],
  303.               expiration = EXPIRATION['never'], public = True):
  304.         if isinstance(language, basestring):
  305.             language = getLanguage(language)
  306.         if EXPIRATION.has_key(expiration):
  307.             expiration = EXPIRATION[expiration]
  308.  
  309.         """
  310.        if not self.loggedIn:
  311.            if not public:
  312.                raise PublicyError('Cannot paste private without being logged in' \
  313.                                   ' (requires captcha)')
  314.        """
  315.  
  316.         formPaste = self.formPaste
  317.         if not self.formPaste:
  318.             pagePaste = self.browser.open(self.URL_PASTE)
  319.             formPaste = mechanize.ParseResponse(pagePaste)
  320.             pagePaste.close()
  321.  
  322.             if len(formPaste) != 2:
  323.                 raise mechanize.URLError('Invalid forms recieved.')
  324.             else:
  325.                 formPaste      = formPaste[1]
  326.                 self.formPaste = formPaste
  327.  
  328.         formPaste[self.FORM_PASTETXT] = code
  329.         formPaste[self.FORM_PASTELNG] = [str(language)]
  330.         formPaste[self.FORM_PASTEEXP] = [expiration]
  331.         formPaste[self.FORM_PASTEPRV] = ['0' if public else '1']
  332.         formPaste[self.FORM_PASTENME] = title
  333.         pagePasted = formPaste.click()
  334.         pagePasted = self.browser.open(pagePasted)
  335.  
  336.         # check if the paste was successful
  337.         soup = Bsoup.BeautifulSoup(pagePasted)
  338.         errr = soup('content_text')
  339.  
  340.         if errr:
  341.             msg = errr[0].renderContents().strip()
  342.             raise PasteError(msg, pagePasted.geturl())
  343.  
  344.         return pagePasted.geturl()
  345.  
  346.  
  347. def main():
  348.     paste = PastebinCom()
  349.     print "Logging into pastebin.com ...",
  350.     try:
  351.         paste.login('nux95', '04029595')
  352.         print "Success !"
  353.     except LoginError as (e):
  354.         print "Failed:", "".join('\n    ' + m for m in str(e).split('.'))
  355.  
  356.     with open(__file__) as fl:
  357.         print paste.paste(fl.read(), 'pastebin.py', 'python', 'never', True)
  358.  
  359. main()
  360.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement