· 2 years ago · Feb 09, 2023, 08:20 AM
1import argparse
2import enum
3import os
4from typing import Optional, TextIO
5
6from requests import Response, post
7
8from pb import recover_key
9
10_API_URI = 'https://pastebin.com/api/api_post.php'
11
12
13def paste_file(
14 file: TextIO, /,
15 name: Optional[str] = None,
16 description: Optional[str] = None,
17 format: Optional[str] = None,
18 *args, **kwargs
19):
20 """Pastes a file to pastebin.com"""
21 name = name or os.path.basename(file.name)
22 format = format or _format_from_extension(
23 os.path.splitext(file.name)[1][1:])
24
25 return paste(file.read(), name, description, format, *args, **kwargs)
26
27
28def handle_response(response: Response):
29 print(response.text)
30
31
32class Visibility(enum.IntEnum):
33 PUBLIC = 0
34 UNLISTED = 1
35 PRIVATE = 2
36
37
38def drop_none(d: dict) -> dict:
39 return {k: v for k, v in d.items() if v is not None}
40
41
42_extension_formats = {
43 'ada': 'ada',
44 'arm': 'arm',
45 'asm': 'asm',
46 'asp': 'asp',
47 'bash': 'bash',
48 'bat': 'dos',
49 'bibtex': 'bibtex',
50 'c': 'c',
51 'cs': 'csharp',
52 'cc': 'cpp',
53 'cpp': 'cpp',
54 'c++': 'cpp',
55 'clj': 'clojure',
56 'cmake': 'cmake',
57 'css': 'css',
58 'd': 'd',
59 'dart': 'dart',
60 'html': 'html5',
61 'java': 'java',
62 'js': 'javascript',
63 'json': 'json',
64 'latex': 'latex',
65 'lua': 'lua',
66 'm': 'matlab',
67 'md': 'markdown',
68 'py': 'python',
69}
70
71
72def _format_from_extension(ext: str) -> Optional[str]:
73 return _extension_formats.get(ext, None)
74
75
76def paste(
77 data: str, /,
78 name: Optional[str] = None,
79 description: Optional[str] = None,
80 format: Optional[str] = None,
81 dev_key: Optional[str] = None,
82 user_key: Optional[str] = None,
83 visibility: Visibility = Visibility.PRIVATE,
84 expire_date: Optional[str] = None,
85):
86 """Pastes data to pastebin.com"""
87 dev_key = dev_key or recover_key()
88 if not dev_key:
89 raise ValueError(
90 'Could not recover API key. Provide one or set the environment variable PASTEBIN_API_KEY.')
91
92 data = data.encode('utf-8')
93 form = {
94 'api_dev_key': dev_key,
95 'api_user_key': user_key,
96 'api_paste_code': data,
97 'api_option': 'paste',
98 'api_paste_name': name,
99 'api_paste_description': description,
100 'api_paste_format': format,
101 'api_paste_private': visibility.value,
102 'api_paste_expire_date': expire_date,
103
104 }
105 form = {k: v for k, v in form.items() if v is not None}
106
107 response = post(_API_URI, data=form)
108 handle_response(response)
109
110
111_expire_date = ['N', '10M', '1H', '1D', '1W', '2W', '1M', '6M', '1Y']
112
113
114def argparser():
115 parser = argparse.ArgumentParser()
116 parser.add_argument('file', type=argparse.FileType('r'))
117 parser.add_argument('--name', '-n')
118 parser.add_argument('--description', '-d')
119 parser.add_argument('--format', '-f')
120 parser.add_argument('--dev-key', '-k')
121 parser.add_argument('--visibility', '-v',
122 choices=['public', 'unlisted', 'private'],
123 default='public'
124 )
125 parser.add_argument('--expire-date', '-e', choices=_expire_date)
126
127 user_grp = parser.add_argument_group('user')
128 user_grp.add_argument('--user-key', '-u')
129 user_grp.add_argument('--user-key-file', '-U', type=argparse.FileType('r'))
130
131 return parser
132
133
134def main():
135 args = argparser().parse_args()
136 visibility = args.visibility and Visibility[args.visibility.upper()]
137 user_key = args.user_key or args.user_key_file and args.user_key_file.read()
138 user_key and print(f'Using user key: "{user_key}"')
139 paste_file(
140 args.file,
141 name=args.name,
142 description=args.description,
143 format=args.format,
144 dev_key=args.dev_key,
145 user_key=user_key,
146 visibility=visibility,
147 expire_date=args.expire_date,
148 )
149
150
151if __name__ == '__main__':
152 main()
153