#!/usr/bin/env python

#############################################################################
#    Pastebin.py - Python 3.2 Pastebin API.
#    Copyright (C) 2012  Ian Havelock
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

#############################################################################

# This software is a derivative work of:
# http://winappdbg.sourceforge.net/blog/pastebin.py

#############################################################################


__ALL__ = ['delete_paste', 'user_details', 'trending', 'pastes_by_user', 'generate_user_key',
  'legacy_paste', 'paste', 'Pastebin', 'PastebinError']

import sys
import urllib

class PastebinError(RuntimeError):
    """Pastebin API error.

    The error message returned by the web application is stored as the Python exception message."""

class PastebinAPI(object):
    """Pastebin API interaction object.
  
    Public functions:
    
    paste -- Pastes a user-specified file or string using the new API-key POST method.

    legacy_paste -- Pastes a user-specified file or string using the old anonymous POST method.
    
    generate_user_key -- Generates a session-key that is required for other functions.
    
    pastes_by_user -- Returns all public pastes submitted by the specified login credentials.
    
    trending -- Returns the top trending paste.
    
    user_details -- Returns details about the user for the specified API user key.
    
    delete_paste -- Adds two numbers together and returns the result."""

    # String to determine bad API requests
    _bad_request = 'Bad API request'

    # Base domain name
    _base_domain = 'pastebin.com'

    # Valid Pastebin URLs begin with this string (kinda bvious)
    _prefix_url = 'http://%s/' % _base_domain

    # Valid Pastebin URLs with a custom subdomain begin with this string
    _subdomain_url = 'http://%%s.%s/' % _base_domain

    # URL to the LEGACY POST API
    _legacy_api_url= 'http://%s/api_public.php' % _base_domain

    # URL to the POST API
    _api_url= 'http://%s/api/api_post.php' % _base_domain

    # URL to the login POST API
    _api_login_url= 'http://%s/api/api_login.php' % _base_domain

    # Valid paste_expire_date values (Never, 10 minutes, 1 Hour, 1 Day, 1 Month)
    paste_expire_date = ('N', '10M', '1H', '1D', '1M')

    # Valid paste_expire_date values (0 = public, 1 = unlisted, 2 = private)
    paste_private = ('public', 'unlisted', 'private')

    # Valid parse_format values
    paste_format = (
        '4cs',              # 4CS
        '6502acme',         # 6502 ACME Cross Assembler
        '6502kickass',      # 6502 Kick Assembler
        '6502tasm',         # 6502 TASM/64TASS
        'abap',             # ABAP
        'actionscript',     # ActionScript
        'actionscript3',    # ActionScript 3
        'ada',              # Ada
        'algol68',          # ALGOL 68
        'apache',           # Apache Log
        'applescript',      # AppleScript
        'apt_sources',      # APT Sources
        'asm',              # ASM (NASM)
        'asp',              # ASP
        'autoconf',         # autoconf
        'autohotkey',       # Autohotkey
        'autoit',           # AutoIt
        'avisynth',         # Avisynth
        'awk',              # Awk
        'bascomavr',        # BASCOM AVR
        'bash',             # Bash
        'basic4gl',         # Basic4GL
        'bibtex',           # BibTeX
        'blitzbasic',       # Blitz Basic
        'bnf',              # BNF
        'boo',              # BOO
        'bf',               # BrainFuck
        'c',                # C
        'c_mac',            # C for Macs
        'cil',              # C Intermediate Language
        'csharp',           # C#
        'cpp',              # C++
        'cpp-qt',           # C++ (with QT extensions)
        'c_loadrunner',     # C: Loadrunner
        'caddcl',           # CAD DCL
        'cadlisp',          # CAD Lisp
        'cfdg',             # CFDG
        'chaiscript',       # ChaiScript
        'clojure',          # Clojure
        'klonec',           # Clone C
        'klonecpp',         # Clone C++
        'cmake',            # CMake
        'cobol',            # COBOL
        'coffeescript',     # CoffeeScript
        'cfm',              # ColdFusion
        'css',              # CSS
        'cuesheet',         # Cuesheet
        'd',                # D
        'dcs',              # DCS
        'delphi',           # Delphi
        'oxygene',          # Delphi Prism (Oxygene)
        'diff',             # Diff
        'div',              # DIV
        'dos',              # DOS
        'dot',              # DOT
        'e',                # E
        'ecmascript',       # ECMAScript
        'eiffel',           # Eiffel
        'email',            # Email
        'epc',              # EPC
        'erlang',           # Erlang
        'fsharp',           # F#
        'falcon',           # Falcon
        'fo',               # FO Language
        'f1',               # Formula One
        'fortran',          # Fortran
        'freebasic',        # FreeBasic
        'freeswitch',       # FreeSWITCH
        'gambas',           # GAMBAS
        'gml',              # Game Maker
        'gdb',              # GDB
        'genero',           # Genero
        'genie',            # Genie
        'gettext',          # GetText
        'go',               # Go
        'groovy',           # Groovy
        'gwbasic',          # GwBasic
        'haskell',          # Haskell
        'hicest',           # HicEst
        'hq9plus',          # HQ9 Plus
        'html4strict',      # HTML
        'html5',            # HTML 5
        'icon',             # Icon
        'idl',              # IDL
        'ini',              # INI file
        'inno',             # Inno Script
        'intercal',         # INTERCAL
        'io',               # IO
        'j',                # J
        'java',             # Java
        'java5',            # Java 5
        'javascript',       # JavaScript
        'jquery',           # jQuery
        'kixtart',          # KiXtart
        'latex',            # Latex
        'lb',               # Liberty BASIC
        'lsl2',             # Linden Scripting
        'lisp',             # Lisp
        'llvm',             # LLVM
        'locobasic',        # Loco Basic
        'logtalk',          # Logtalk
        'lolcode',          # LOL Code
        'lotusformulas',    # Lotus Formulas
        'lotusscript',      # Lotus Script
        'lscript',          # LScript
        'lua',              # Lua
        'm68k',             # M68000 Assembler
        'magiksf',          # MagikSF
        'make',             # Make
        'mapbasic',         # MapBasic
        'matlab',           # MatLab
        'mirc',             # mIRC
        'mmix',             # MIX Assembler
        'modula2',          # Modula 2
        'modula3',          # Modula 3
        '68000devpac',      # Motorola 68000 HiSoft Dev
        'mpasm',            # MPASM
        'mxml',             # MXML
        'mysql',            # MySQL
        'newlisp',          # newLISP
        'text',             # None
        'nsis',             # NullSoft Installer
        'oberon2',          # Oberon 2
        'objeck',           # Objeck Programming Langua
        'objc',             # Objective C
        'ocaml-brief',      # OCalm Brief
        'ocaml',            # OCaml
        'pf',               # OpenBSD PACKET FILTER
        'glsl',             # OpenGL Shading
        'oobas',            # Openoffice BASIC
        'oracle11',         # Oracle 11
        'oracle8',          # Oracle 8
        'oz',               # Oz
        'pascal',           # Pascal
        'pawn',             # PAWN
        'pcre',             # PCRE
        'per',              # Per
        'perl',             # Perl
        'perl6',            # Perl 6
        'php',              # PHP
        'php-brief',        # PHP Brief
        'pic16',            # Pic 16
        'pike',             # Pike
        'pixelbender',      # Pixel Bender
        'plsql',            # PL/SQL
        'postgresql',       # PostgreSQL
        'povray',           # POV-Ray
        'powershell',       # Power Shell
        'powerbuilder',     # PowerBuilder
        'proftpd',          # ProFTPd
        'progress',         # Progress
        'prolog',           # Prolog
        'properties',       # Properties
        'providex',         # ProvideX
        'purebasic',        # PureBasic
        'pycon',            # PyCon
        'python',           # Python
        'q',                # q/kdb+
        'qbasic',           # QBasic
        'rsplus',           # R
        'rails',            # Rails
        'rebol',            # REBOL
        'reg',              # REG
        'robots',           # Robots
        'rpmspec',          # RPM Spec
        'ruby',             # Ruby
        'gnuplot',          # Ruby Gnuplot
        'sas',              # SAS
        'scala',            # Scala
        'scheme',           # Scheme
        'scilab',           # Scilab
        'sdlbasic',         # SdlBasic
        'smalltalk',        # Smalltalk
        'smarty',           # Smarty
        'sql',              # SQL
        'systemverilog',    # SystemVerilog
        'tsql',             # T-SQL
        'tcl',              # TCL
        'teraterm',         # Tera Term
        'thinbasic',        # thinBasic
        'typoscript',       # TypoScript
        'unicon',           # Unicon
        'uscript',          # UnrealScript
        'vala',             # Vala
        'vbnet',            # VB.NET
        'verilog',          # VeriLog
        'vhdl',             # VHDL
        'vim',              # VIM
        'visualprolog',     # Visual Pro Log
        'vb',               # VisualBasic
        'visualfoxpro',     # VisualFoxPro
        'whitespace',       # WhiteSpace
        'whois',            # WHOIS
        'winbatch',         # Winbatch
        'xbasic',           # XBasic
        'xml',              # XML
        'xorg_conf',        # Xorg Config
        'xpp',              # XPP
        'yaml',             # YAML
        'z80',              # Z80 Assembler
        'zxbasic',          # ZXBasic
    )

    def __init__(self):
        pass


    def delete_paste(self, api_dev_key, api_user_key, api_paste_key):
        """Delete the paste specified by the api_paste_key.          
          
          
        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> paste_to_delete = x.delete_paste('453a994e0e2f1efae07f8759e59e075b',
            ...                                 'c57a18e6c0ae228cd4bd16fe36da381a',
            ...                                 'WkgcTFtv')
            >>> print paste_to_delete
            Paste Removed     
            

        @type   api_dev_key: string
        @param  api_dev_key: The API Developer Key of a registered U{http://pastebin.com} account.
        
        @type   api_user_key: string
        @param  api_user_key: The API User Key of a U{http://pastebin.com} registered user.
        
        @type   api_paste_key: string
        @param  api_paste_key: The Paste Key of the paste to be deleted (string after final / in U{http://pastebin.com} URL).

        @rtype: string
        @returns: A successful deletion returns 'Paste Removed'.
        """

        # Valid api developer key
        argv = {'api_dev_key' : str(api_dev_key) }

        # Requires pre-registered account
        if api_user_key is not None:
            argv['api_user_key'] = str(api_user_key)

        # Key of the paste to be deleted.
        if api_paste_key is not None:
            argv['api_paste_key'] = str(api_paste_key)
          
        # Valid API option - 'user_details' in this instance
        argv['api_option'] = str('delete')


        # lets try to read the URL that we've just built.
        request = urllib.urlopen(self._api_url, urllib.urlencode(argv))
        response = self._submit_paste(request)

        return response


    def user_details(self, api_dev_key, api_user_key):
        """Return user details of the user specified by the api_user_key.
        
        
        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> details = x.user_details('453a994e0e2f1efae07f8759e59e075b',
            ...                         'c57a18e6c0ae228cd4bd16fe36da381a')
            >>> print details
            <user>
            <user_name>MonkeyPuzzle</user_name>
            <user_format_short>python</user_format_short>
            <user_expiration>N</user_expiration>
            <user_avatar_url>http://pastebin.com/i/guest.gif</user_avatar_url>
            <user_private>0</user_private>
            <user_website></user_website>
            <user_email>user@email.com</user_email>
            <user_location></user_location>
            <user_account_type>0</user_account_type>
            </user>
        
        
        @type   api_dev_key: string
        @param  api_dev_key: The API Developer Key of a registered U{http://pastebin.com} account.
        
        @type   api_user_key: string
        @param  api_user_key: The API User Key of a U{http://pastebin.com} registered user.

        @rtype: string
        @returns: Returns an XML string containing user information.
        """
        
        # Valid api developer key
        argv = {'api_dev_key' : str(api_dev_key) }

        # Requires pre-registered account to generate an api_user_key (see generate_user_key)
        if api_user_key is not None:
            argv['api_user_key'] = str(api_user_key)

        # Valid API option - 'user_details' in this instance
        argv['api_option'] = str('userdetails')

        # lets try to read the URL that we've just built.
        request_string = urllib.urlopen(self._api_url, urllib.urlencode(argv))
        response = request_string.read()

        # do some basic error checking here so we can gracefully handle any errors we are likely to encounter
        if response.startswith(self._bad_request):
            raise PastebinError(response)
          
        elif not response.startswith('<user>'):
            raise PastebinError(response)

        return response


    def trending(self, api_dev_key):
        """Returns the top trending paste details.
        

        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> details = x.trending('453a994e0e2f1efae07f8759e59e075b')
            >>> print details
            <paste>
            <paste_key>jjMRFDH6</paste_key>
            <paste_date>1333230838</paste_date>
            <paste_title></paste_title>
            <paste_size>6416</paste_size>
            <paste_expire_date>0</paste_expire_date>
            <paste_private>0</paste_private>
            <paste_format_long>None</paste_format_long>
            <paste_format_short>text</paste_format_short>
            <paste_url>http://pastebin.com/jjMRFDH6</paste_url>
            <paste_hits>6384</paste_hits>
            </paste>
            
        Note: Returns multiple trending pastes, not just 1.
        
        
        @type   api_dev_key: string
        @param  api_dev_key: The API Developer Key of a registered U{http://pastebin.com} account.
        
        
        @rtype:  string
        @return: Returns the string (XML formatted) containing the top trending pastes.
        """
        
        # Valid api developer key
        argv = {'api_dev_key' : str(api_dev_key) }

        # Valid API option - 'trends' is returns trending pastes
        argv['api_option'] = str('trends')

        # lets try to read the URL that we've just built.
        request_string = urllib.urlopen(self._api_url, urllib.urlencode(argv))
        response = request_string.read()

        # do some basic error checking here so we can gracefully handle any errors we are likely to encounter
        if response.startswith(self._bad_request):
            raise PastebinError(response)
        
        elif not response.startswith('<paste>'):
            raise PastebinError(response)

        return response


    def pastes_by_user(self, api_dev_key, api_user_key, results_limit = None):
        """Returns all pastes for the provided api_user_key.
       
        
        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> details = x.user_details('453a994e0e2f1efae07f8759e59e075b',
            ...                         'c57a18e6c0ae228cd4bd16fe36da381a',
            ...                         100)
            >>> print details
            <paste>
            <paste_key>DLiSspYT</paste_key>
            <paste_date>1332714730</paste_date>
            <paste_title>Pastebin.py - Python 3.2 Pastebin.com API</paste_title>
            <paste_size>25300</paste_size>
            <paste_expire_date>0</paste_expire_date>
            <paste_private>0</paste_private>
            <paste_format_long>Python</paste_format_long>
            <paste_format_short>python</paste_format_short>
            <paste_url>http://pastebin.com/DLiSspYT</paste_url>
            <paste_hits>70</paste_hits>
            </paste>
            
        Note: Returns multiple pastes, not just 1.
        
        
        @type   api_dev_key: string
        @param  api_dev_key: The API Developer Key of a registered U{http://pastebin.com} account.
        
        @type   api_user_key: string
        @param  api_user_key: The API User Key of a U{http://pastebin.com} registered user.
        
        @type   results_limit: number
        @param  results_limit: The number of pastes to return between 1 - 1000.

        @rtype: string
        @returns: Returns an XML string containing number of specified pastes by user.
        """

        # Valid api developer key
        argv = {'api_dev_key' : str(api_dev_key) }

        # Requires pre-registered account
        if api_user_key is not None:
            argv['api_user_key'] = str(api_user_key)

        # Number of results to return - between 1 & 1000, default = 50
        if results_limit is None:
            argv['api_results_limit'] = 50
      
        if results_limit is not None:
            if results_limit < 1:
                argv['api_results_limit'] = 50
            elif results_limit > 1000:
                argv['api_results_limit'] = 1000
            else:
                argv['api_results_limit'] = int(results_limit)

        # Valid API option - 'paste' is default for new paste
        argv['api_option'] = str('list')

        # lets try to read the URL that we've just built.
        request_string = urllib.urlopen(self._api_url, urllib.urlencode(argv))
        response = request_string.read()

        # do some basic error checking here so we can gracefully handle any errors we are likely to encounter
        if response.startswith(self._bad_request):
            raise PastebinError(response)
        
        elif not response.startswith('<paste>'):
            raise PastebinError(response)

        return response


    def generate_user_key(self, api_dev_key, username, password):
        """Generate a user session key - needed for other functions.
          
          
        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> my_key = x.generate_user_key('453a994e0e2f1efae07f8759e59e075b',
            ...                             'MonkeyPuzzle',
            ...                             '12345678')
            >>> print my_key
            c57a18e6c0ae228cd4bd16fe36da381a
            
            
        @type   api_dev_key: string
        @param  api_dev_key: The API Developer Key of a registered U{http://pastebin.com} account.
        
        @type   username: string
        @param  username: The username of a registered U{http://pastebin.com} account.
        
        @type   password: string
        @param  password: The password of a registered U{http://pastebin.com} account.

        @rtype: string
        @returns: Session key (api_user_key) to allow authenticated interaction to the API.
            
        """
        # Valid api developer key
        argv = {'api_dev_key' : str(api_dev_key) }

        # Requires pre-registered pastebin account
        if username is not None:
            argv['api_user_name'] = str(username)

        # Requires pre-registered pastebin account
        if password is not None:
            argv['api_user_password'] = str(password)

        # lets try to read the URL that we've just built.
        request_string = urllib.urlopen(self._api_login_url, urllib.urlencode(argv))
        response = request_string.read()

        # do some basic error checking here so we can gracefully handle any errors we are likely to encounter
        if response.startswith(self._bad_request):
            raise PastebinError(response)

        return response


    def paste(self, api_dev_key, api_paste_code,
            api_user_key = None, paste_name = None, paste_format = None,
            paste_private = None, paste_expire_date = None):

        """Submit a code snippet to Pastebin using the new API.
      
      
        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> url = x.paste('453a994e0e2f1efae07f8759e59e075b' ,
            ...               'Snippet of code to paste goes here',
            ...               paste_name = 'title of paste',
            ...               api_user_key = 'c57a18e6c0ae228cd4bd16fe36da381a', 
            ...               paste_format = 'python',
            ...               paste_private = 'unlisted',
            ...               paste_expire_date = '10M')
            >>> print url
            http://pastebin.com/tawPUgqY
            

        @type   api_dev_key: string
        @param  api_dev_key: The API Developer Key of a registered U{http://pastebin.com} account.
        
        @type   api_paste_code: string
        @param  api_paste_code: The file or string to paste to body of the U{http://pastebin.com} paste.
        
        @type   api_user_key: string
        @param  api_user_key: The API User Key of a U{http://pastebin.com} registered user.
            If none specified, paste is made as a guest.

        @type   paste_name: string
        @param  paste_name: (Optional) Title of the paste.
            Default is to paste anonymously.

        @type  paste_format: string
        @param paste_format: (Optional) Programming language of the code being
            pasted. This enables syntax highlighting when reading the code in
            U{http://pastebin.com}. Default is no syntax highlighting (text is
            just text and not source code).

        @type  paste_private: string
        @param paste_private: (Optional) C{'public'} if the paste is public (visible
            by everyone), C{'unlisted'} if it's public but not searchable.
            C{'private'} if the paste is private and not searchable or indexed.
            The Pastebin FAQ (U{http://pastebin.com/faq}) claims
            private pastes are not indexed by search engines (aka Google).

        @type  paste_expire_date: str
        @param paste_expire_date: (Optional) Expiration date for the paste.
            Once past this date the paste is deleted automatically. Valid
            values are found in the L{PastebinAPI.paste_expire_date} class member.
            If not provided, the paste never expires.

        @rtype:  string
        @return: Returns the URL to the newly created paste.
        """


        # Valid api developer key
        argv = {'api_dev_key' : str(api_dev_key) }

        # Code snippet to submit
        if api_paste_code is not None:
            argv['api_paste_code'] = str(api_paste_code)

        # Valid API option - 'paste' is default for new paste
        argv['api_option'] = str('paste')

        # API User Key
        if api_user_key is not None:
            argv['api_user_key'] = str(api_user_key)
        elif api_user_key is None:
            argv['api_user_key'] = str('')

        # Name of the poster
        if paste_name is not None:
            argv['api_paste_name'] = str(paste_name)

        # Syntax highlighting
        if paste_format is not None:
            paste_format = str(paste_format).strip().lower()
            argv['api_paste_format'] = paste_format

        # Is the snippet private?
        if paste_private is not None:
            if paste_private == 'public':
                argv['api_paste_private'] = int(0)
            elif paste_private == 'unlisted':
                argv['api_paste_private'] = int(1)
            elif paste_private == 'private':
                argv['api_paste_private'] = int(2)

        # Expiration for the snippet
        if paste_expire_date is not None:
            paste_expire_date = str(paste_expire_date).strip().upper()
            argv['api_paste_expire_date'] = paste_expire_date

        # lets try to read the URL that we've just built.
        request_string = urllib.urlopen(self._api_url, urllib.urlencode(argv))
        response = request_string.read()

        # do some basic error checking here so we can gracefully handle any errors we are likely to encounter
        if response.startswith(self._bad_request):
            raise PastebinError(response)
        elif not response.startswith(self._prefix_url):
            raise PastebinError(response)  

        return response


    def legacy_paste(self, paste_code,
            paste_name = None, paste_private = None,
            paste_expire_date = None, paste_format = None):
        """Unofficial python interface to the Pastebin legacy API.

        Unlike the official API, this one doesn't require an API key, so it's
        virtually anonymous.
        
        
        Usage Example::
            >>> from pastebin import PastebinAPI
            >>> x = PastebinAPI()
            >>> url = x.legacy_paste('Snippet of code to paste goes here',
            ...                     paste_name = 'title of paste',
            ...                     paste_private = 'unlisted',
            ...                     paste_expire_date = '10M',
            ...                     paste_format = 'python')
            >>> print url
            http://pastebin.com/tawPUgqY

       
        @type   paste_code: string
        @param  paste_code: The file or string to paste to body of the U{http://pastebin.com} paste.
        
        @type   paste_name: string
        @param  paste_name: (Optional) Title of the paste.
            Default is to paste with no title.
            
        @type   paste_private: string
        @param  paste_private: (Optional) C{'public'} if the paste is public (visible
            by everyone), C{'unlisted'} if it's public but not searchable.
            C{'private'} if the paste is private and not searchable or indexed.
            The Pastebin FAQ (U{http://pastebin.com/faq}) claims
            private pastes are not indexed by search engines (aka Google).

        @type   paste_expire_date: string
        @param  paste_expire_date: (Optional) Expiration date for the paste.
            Once past this date the paste is deleted automatically. Valid
            values are found in the L{PastebinAPI.paste_expire_date} class member.
            If not provided, the paste never expires.

        @type   paste_format: string
        @param  paste_format: (Optional) Programming language of the code being
            pasted. This enables syntax highlighting when reading the code in
            U{http://pastebin.com}. Default is no syntax highlighting (text is
            just text and not source code).

        @rtype:  string
        @return: Returns the URL to the newly created paste.
        """

        # Code snippet to submit
        argv = { 'paste_code' : str(paste_code) }

        # Name of the poster
        if paste_name is not None:
            argv['paste_name'] = str(paste_name)

        # Is the snippet private?
        if paste_private is not None:
            argv['paste_private'] = int(bool(int(paste_private)))

        # Expiration for the snippet
        if paste_expire_date is not None:
            paste_expire_date = str(paste_expire_date).strip().upper()
            argv['paste_expire_date'] = paste_expire_date

        # Syntax highlighting
        if paste_format is not None:
            paste_format = str(paste_format).strip().lower()
            argv['paste_format'] = paste_format

        # lets try to read the URL that we've just built.
        request_string = urllib.urlopen(self._legacy_api_url, urllib.urlencode(argv))
        response = request_string.read()

        # do some basic error checking here so we can gracefully handle any errors we are likely to encounter
        if response.startswith(self._bad_request):
            raise PastebinError(response)
        elif not response.startswith(self._prefix_url):
            raise PastebinError(response)  

        return response






######################################################

delete_paste = PastebinAPI.delete_paste
user_details = PastebinAPI.user_details
trending = PastebinAPI.trending
pastes_by_user = PastebinAPI.pastes_by_user
generate_user_key = PastebinAPI.generate_user_key
legacy_paste = PastebinAPI.legacy_paste
paste = PastebinAPI.paste

######################################################

if __name__ == "__main__":
    main()

[(338, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n'), (388, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n'), (441, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n'), (517, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n'), (569, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n'), (678, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n'), (763, 'urllib.urlencode', 'urllib.urlencode', False, 'import urllib\n')]