Advertisement
Snusmumriken

pastebin scraping api

Dec 2nd, 2018
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.32 KB | None | 0 0
  1. local http = require'socket.http'
  2.  
  3. local char_to_hex = function(c)
  4.     return string.format("%%%02X", string.byte(c))
  5. end
  6.  
  7. local function urlencode(url)
  8.     if url == nil then
  9.         return
  10.   end
  11.     url = url:gsub("\n", "\r\n")
  12.     url = url:gsub("([^%w ])", char_to_hex)
  13.     url = url:gsub(" ", "+")
  14.     return url
  15. end
  16.  
  17. local hex_to_char = function(x)
  18.   return string.char(tonumber(x, 16))
  19. end
  20.  
  21. local urldecode = function(url)
  22.     if url == nil then
  23.         return false
  24.     end
  25.     url = url:gsub("+", " ")
  26.     url = url:gsub("%%(%x%x)", hex_to_char)
  27.     return url
  28. end
  29.  
  30. local function topost(t)
  31.     local res = {}
  32.     for k, v in pairs(t) do
  33.         res[#res + 1] = k .. '=' .. v
  34.     end
  35.     return table.concat(res, '&')
  36. end
  37.  
  38.  
  39. local paste = {}
  40. paste.url = 'http://pastebin.com/api/'
  41.  
  42.  
  43. function paste:init(user, pass, dev)
  44.     self.pastekeys  = {}
  45.     self.pastenames = {}
  46.     self.pastelist  = {}
  47.  
  48.     self.user    = user
  49.     self.pass    = pass
  50.     self.dev     = dev
  51.     self.tupdate = 0
  52.  
  53.     local session, err = self:login(user, pass, dev)
  54.     if not session then return nil, err end
  55.     self.session = session
  56.  
  57.     return self
  58. end
  59.  
  60. setmetatable(paste, {__call = paste.init})
  61.  
  62. function paste:login(user, pass, dev)
  63.     local data, err, code = http.request(
  64.         self.url .. 'api_login.php',
  65.         topost{
  66.             api_dev_key       = self.dev,
  67.             api_user_name     = self.user,
  68.             api_user_password = self.pass
  69.         }
  70.     )
  71.  
  72.     if not data then return nil, err end
  73.     if data:lower():find('^bad') then
  74.     return nil, data
  75.     end
  76.     return data
  77. end
  78.  
  79. function paste:list(limit)
  80.     self.pastekeys  = {}
  81.     self.pastenames = {}
  82.     self.pastelist  = {}
  83.     limit = limit or 1000
  84.  
  85.     local data, err, code = http.request(
  86.         self.url .. 'api_post.php',
  87.         topost{
  88.             api_dev_key       = self.dev,
  89.             api_user_key      = self.session,
  90.             api_results_limit = limit,
  91.             api_option        = 'list'
  92.         }
  93.     )
  94.    
  95.    
  96.     if not data then return nil, err end
  97.     if data:lower():find('^bad') then
  98.         return nil, data
  99.     end
  100.  
  101.     if data:lower():find('^no pastes found') then
  102.         return nil, data
  103.     end
  104.  
  105.     local list = {}
  106.     for info in data:gmatch('<paste>(.-)</paste>') do
  107.         local o = {}
  108.         for k, v in info:gmatch('<(.-)>(.-)</.->') do
  109.         if k == 'paste_url' then v = v:gsub('^https', 'http') end
  110.             o[k] = v
  111.         end
  112.         self.pastekeys[o.paste_key]         = o
  113.         self.pastenames[o.paste_title]      = o
  114.         self.pastelist[#self.pastelist + 1] = o
  115.         list[#list + 1] = o
  116.     end
  117.  
  118.     return list
  119. end
  120.  
  121. function paste:remove(obj)
  122.     if type(obj) ~= 'table' then
  123.         return nil, 'table paste expected, got ' .. type(obj)
  124.     end
  125.    
  126.     for i, v in pairs(self.pastelist) do
  127.         if v == obj then
  128.             table.remove(self.pastelist, i)
  129.             break
  130.         end
  131.     end
  132.    
  133.     self.pastekeys[obj.paste_key]    = nil
  134.     self.pastenames[obj.paste_title] = nil
  135. end
  136.  
  137. function paste:get(p)
  138.     self:update()
  139.  
  140.     local paste, err = self:__get(p)
  141.     if not paste then return nil, err end
  142.  
  143.     local data, err, code = http.request(
  144.         self.url .. 'api_raw.php',
  145.         topost{
  146.             api_dev_key       = self.dev,
  147.             api_user_key      = self.session,
  148.             api_paste_key     = paste.paste_key,
  149.             api_option        = 'show_paste',
  150.         }
  151.     )
  152.  
  153.     if not data then return nil, err end
  154.  
  155.     if data:sub(1, 5):lower():find('^bad') then
  156.         return nil, data
  157.     end
  158.  
  159.     return data
  160. end
  161.  
  162. function paste:__get(p)
  163.     p = self.pastekeys[p] or self.pastenames[p] or self.pastelist[p]
  164.     if not p then
  165.         return nil, 'no paste ' .. tostring(p) .. ' found'
  166.     end
  167.     return p
  168. end
  169.  
  170. function paste:update()
  171.     if os.time() - self.tupdate > 60 then
  172.         local list, err = self:list()
  173.         if not list then return nil, err end
  174.         self.tupdate = os.time()
  175.     end
  176.     return true
  177. end
  178.  
  179. function paste:delete(pastekey)
  180.     if not self.paste then
  181.         local list, err = self:list()
  182.         if not list then return nil, err end
  183.         self.paste = list
  184.     end
  185.  
  186.     local paste, err = self:__get(pastekey)
  187.    
  188.     if not paste then return nil, err end
  189.  
  190.     print(self.url .. 'api_post.php', self.dev, paste.paste_key)
  191.     local data, err, code = http.request(
  192.         self.url .. 'api_post.php',
  193.         topost{
  194.             api_dev_key       = self.dev,
  195.             api_user_key      = self.session,
  196.             api_paste_key     = paste.paste_key,
  197.             api_option        = 'delete',
  198.         }
  199.     )
  200.  
  201.     if not data then return nil, err end
  202.     if data:lower():find('^bad') then
  203.         return nil, data
  204.     end
  205.  
  206.     return data
  207. end
  208.  
  209. function paste:deleteByName(name)
  210.     if not self.paste then
  211.     local list, err = self:list()
  212.     if not list then return nil, err end
  213.     self.paste = list
  214.     end
  215.  
  216.     local paste = self.paste[name]
  217.     if not paste then return nil, 'Paste ' .. tostring(name) .. ' not exists' end
  218.  
  219.     print(self.url .. 'api_post.php', self.dev, paste.paste_key)
  220.     local data, err, code = http.request(
  221.         self.url .. 'api_post.php',
  222.         topost{
  223.             api_dev_key       = self.dev,
  224.             api_user_key      = self.session,
  225.             api_paste_key     = paste.paste_key,
  226.             api_option        = 'delete',
  227.         }
  228.     )
  229.  
  230.     if not data then return nil, err end
  231.     if data:lower():find('^bad') then
  232.         return nil, data
  233.     end
  234.  
  235.     return data
  236. end
  237.  
  238. function paste:create(name, text, priv, lang, expire)
  239.     if not name then return nil, 'name expected' end
  240.     if not text then return nil, 'text expected' end
  241.     local private;
  242.     private = (priv == 'private'  or priv == 2) and 2
  243.     private = (priv == 'unlisted' or priv == 1) and 1
  244.     private = private or 0
  245.  
  246.     lang   = lang   or ''
  247.     expire = expire or 'N'
  248.  
  249.     local data, err, code = http.request(
  250.         self.url .. 'api_post.php',
  251.         topost{
  252.             api_dev_key           = self.dev,
  253.             api_user_key          = self.session,
  254.             api_paste_private     = private,
  255.             api_paste_name        = urlencode(name),
  256.             api_paste_expire_date = expire,
  257.             api_paste_code        = urlencode(text),
  258.             api_paste_format      = lang:lower():gsub('[^%w]', ''),
  259.             api_option            = 'paste'
  260.         }
  261.     )
  262.  
  263.     self:list()
  264.     if not data then return nil, err end
  265.     if data:lower():find('^bad') then
  266.         return nil, data
  267.     end
  268.  
  269.     return data
  270. end
  271.  
  272. if not ... then
  273.     -- this is pastebin account for testing
  274.     local login     = 'tpastebin'
  275.     local password  = 'Qwerty!@#'
  276.     local userkey   = '6de6c9893865973c05158d7436c2e62c'
  277.     local pastename = 'test api paste'
  278.     local pastecode = '{yoyo = \'123\'}'
  279.    
  280.     print('KEY:',    paste:init(login, password, userkey))
  281.     print('CREATE:', paste:create(pastename, pastecode, 1, 'lua'))
  282.     print('GET:',    paste:get(pastename))
  283.     print('DELETE:', paste:delete(pastename))
  284.     print('LIST:',   paste:list())
  285. end
  286.  
  287. return paste
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement