Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local http = require'socket.http'
- local char_to_hex = function(c)
- return string.format("%%%02X", string.byte(c))
- end
- local function urlencode(url)
- if url == nil then
- return
- end
- url = url:gsub("\n", "\r\n")
- url = url:gsub("([^%w ])", char_to_hex)
- url = url:gsub(" ", "+")
- return url
- end
- local hex_to_char = function(x)
- return string.char(tonumber(x, 16))
- end
- local urldecode = function(url)
- if url == nil then
- return false
- end
- url = url:gsub("+", " ")
- url = url:gsub("%%(%x%x)", hex_to_char)
- return url
- end
- local function topost(t)
- local res = {}
- for k, v in pairs(t) do
- res[#res + 1] = k .. '=' .. v
- end
- return table.concat(res, '&')
- end
- local paste = {}
- paste.url = 'http://pastebin.com/api/'
- function paste:init(user, pass, dev)
- self.pastekeys = {}
- self.pastenames = {}
- self.pastelist = {}
- self.user = user
- self.pass = pass
- self.dev = dev
- self.tupdate = 0
- local session, err = self:login(user, pass, dev)
- if not session then return nil, err end
- self.session = session
- return self
- end
- setmetatable(paste, {__call = paste.init})
- function paste:login(user, pass, dev)
- local data, err, code = http.request(
- self.url .. 'api_login.php',
- topost{
- api_dev_key = self.dev,
- api_user_name = self.user,
- api_user_password = self.pass
- }
- )
- if not data then return nil, err end
- if data:lower():find('^bad') then
- return nil, data
- end
- return data
- end
- function paste:list(limit)
- self.pastekeys = {}
- self.pastenames = {}
- self.pastelist = {}
- limit = limit or 1000
- local data, err, code = http.request(
- self.url .. 'api_post.php',
- topost{
- api_dev_key = self.dev,
- api_user_key = self.session,
- api_results_limit = limit,
- api_option = 'list'
- }
- )
- if not data then return nil, err end
- if data:lower():find('^bad') then
- return nil, data
- end
- if data:lower():find('^no pastes found') then
- return nil, data
- end
- local list = {}
- for info in data:gmatch('<paste>(.-)</paste>') do
- local o = {}
- for k, v in info:gmatch('<(.-)>(.-)</.->') do
- if k == 'paste_url' then v = v:gsub('^https', 'http') end
- o[k] = v
- end
- self.pastekeys[o.paste_key] = o
- self.pastenames[o.paste_title] = o
- self.pastelist[#self.pastelist + 1] = o
- list[#list + 1] = o
- end
- return list
- end
- function paste:remove(obj)
- if type(obj) ~= 'table' then
- return nil, 'table paste expected, got ' .. type(obj)
- end
- for i, v in pairs(self.pastelist) do
- if v == obj then
- table.remove(self.pastelist, i)
- break
- end
- end
- self.pastekeys[obj.paste_key] = nil
- self.pastenames[obj.paste_title] = nil
- end
- function paste:get(p)
- self:update()
- local paste, err = self:__get(p)
- if not paste then return nil, err end
- local data, err, code = http.request(
- self.url .. 'api_raw.php',
- topost{
- api_dev_key = self.dev,
- api_user_key = self.session,
- api_paste_key = paste.paste_key,
- api_option = 'show_paste',
- }
- )
- if not data then return nil, err end
- if data:sub(1, 5):lower():find('^bad') then
- return nil, data
- end
- return data
- end
- function paste:__get(p)
- p = self.pastekeys[p] or self.pastenames[p] or self.pastelist[p]
- if not p then
- return nil, 'no paste ' .. tostring(p) .. ' found'
- end
- return p
- end
- function paste:update()
- if os.time() - self.tupdate > 60 then
- local list, err = self:list()
- if not list then return nil, err end
- self.tupdate = os.time()
- end
- return true
- end
- function paste:delete(pastekey)
- if not self.paste then
- local list, err = self:list()
- if not list then return nil, err end
- self.paste = list
- end
- local paste, err = self:__get(pastekey)
- if not paste then return nil, err end
- print(self.url .. 'api_post.php', self.dev, paste.paste_key)
- local data, err, code = http.request(
- self.url .. 'api_post.php',
- topost{
- api_dev_key = self.dev,
- api_user_key = self.session,
- api_paste_key = paste.paste_key,
- api_option = 'delete',
- }
- )
- if not data then return nil, err end
- if data:lower():find('^bad') then
- return nil, data
- end
- return data
- end
- function paste:deleteByName(name)
- if not self.paste then
- local list, err = self:list()
- if not list then return nil, err end
- self.paste = list
- end
- local paste = self.paste[name]
- if not paste then return nil, 'Paste ' .. tostring(name) .. ' not exists' end
- print(self.url .. 'api_post.php', self.dev, paste.paste_key)
- local data, err, code = http.request(
- self.url .. 'api_post.php',
- topost{
- api_dev_key = self.dev,
- api_user_key = self.session,
- api_paste_key = paste.paste_key,
- api_option = 'delete',
- }
- )
- if not data then return nil, err end
- if data:lower():find('^bad') then
- return nil, data
- end
- return data
- end
- function paste:create(name, text, priv, lang, expire)
- if not name then return nil, 'name expected' end
- if not text then return nil, 'text expected' end
- local private;
- private = (priv == 'private' or priv == 2) and 2
- private = (priv == 'unlisted' or priv == 1) and 1
- private = private or 0
- lang = lang or ''
- expire = expire or 'N'
- local data, err, code = http.request(
- self.url .. 'api_post.php',
- topost{
- api_dev_key = self.dev,
- api_user_key = self.session,
- api_paste_private = private,
- api_paste_name = urlencode(name),
- api_paste_expire_date = expire,
- api_paste_code = urlencode(text),
- api_paste_format = lang:lower():gsub('[^%w]', ''),
- api_option = 'paste'
- }
- )
- self:list()
- if not data then return nil, err end
- if data:lower():find('^bad') then
- return nil, data
- end
- return data
- end
- if not ... then
- -- this is pastebin account for testing
- local login = 'tpastebin'
- local password = 'Qwerty!@#'
- local userkey = '6de6c9893865973c05158d7436c2e62c'
- local pastename = 'test api paste'
- local pastecode = '{yoyo = \'123\'}'
- print('KEY:', paste:init(login, password, userkey))
- print('CREATE:', paste:create(pastename, pastecode, 1, 'lua'))
- print('GET:', paste:get(pastename))
- print('DELETE:', paste:delete(pastename))
- print('LIST:', paste:list())
- end
- return paste
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement