-- You need a Google API key and a Google Custom Search Engine set up to use this, in config.google_api_key and config.google_cse_key, respectively. -- You must also sign up for the CSE in the Google Developer Console, and enable image results. local gImages_nsfw = {} function gImages_nsfw:init(config) if not cred_data.google_apikey then print('Fehlender Key: google_apikey.') print('gImages_nsfw.lua wird nicht aktiviert.') return elseif not cred_data.google_cse_id then print('Fehlender Key: google_cse_id.') print('gImages_nsfw.lua wird nicht aktiviert.') return end gImages_nsfw.triggers = { "^/[Ii][Mm][Gg]2 (.*)$", "^/[Ii]2 (.*)$" } gImages_nsfw.doc = [[* ]]..config.cmd_pat..[[img2* __ Sucht Bild mit Google und versendet es Alias: *]]..config.cmd_pat..[[i2*]] end gImages_nsfw.command = 'img2 ' -- Yes, the callback is copied from below, but I can't think of another method :\ function gImages_nsfw:callback(callback, msg, self, config, input) if not msg then return end utilities.answer_callback_query(self, callback, 'Suche nochmal nach "'..URL.unescape(input)..'"') utilities.send_typing(self, msg.chat.id, 'upload_photo') local hash = 'telegram:cache:gImages_nsfw' local results = redis:smembers(hash..':'..string.lower(URL.unescape(input))) if not results[1] then print('doing web request') results = gImages_nsfw:get_image(input) if results == 403 then utilities.send_reply(self, msg, config.errors.quotaexceeded, true) return elseif not results then utilities.send_reply(self, msg, config.errors.results, true) return end gImages_nsfw:cache_result(results, input) end -- Random image from table local i = math.random(#results) -- Thanks to Amedeo for this! local failed = true local nofTries = 0 while failed and nofTries < #results do if results[i].image then img_url = results[i].link mimetype = results[i].mime context = results[i].image.contextLink else -- from cache img_url = results[i] mimetype = redis:hget(hash..':'..img_url, 'mime') context = redis:hget(hash..':'..img_url, 'contextLink') end -- It's important to save the image with the right ending! if mimetype == 'image/gif' then file = download_to_file(img_url) elseif mimetype == 'image/png' then file = download_to_file(img_url) elseif mimetype == 'image/jpeg' then file = download_to_file(img_url) else file = nil end if not file then nofTries = nofTries + 1 i = i+1 if i > #results then i = 1 end else failed = false end end if failed then utilities.send_reply(self, msg, 'Fehler beim Herunterladen eines Bildes.', true) return end if mimetype == 'image/gif' then result = utilities.send_document(self, msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Seite aufrufen","url":"'..context..'"},{"text":"Bild aufrufen","url":"'..img_url..'"},{"text":"Nochmal suchen","callback_data":"@'..self.info.username..' gImages_nsfw:'..input..'"}]]}') else result = utilities.send_photo(self, msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Seite aufrufen","url":"'..context..'"},{"text":"Bild aufrufen","url":"'..img_url..'"},{"text":"Nochmal suchen","callback_data":"@'..self.info.username..' gImages_nsfw:'..input..'"}]]}') end if not result then utilities.send_reply(self, msg, config.errors.connection, true, '{"inline_keyboard":[[{"text":"Nochmal versuchen","callback_data":"@'..self.info.username..' gImages_nsfw:'..input..'"}]]}') return end end function gImages_nsfw:get_image(input) local apikey = cred_data.google_apikey local cseid = cred_data.google_cse_id local BASE_URL = 'https://www.googleapis.com/customsearch/v1' local url = BASE_URL..'/?searchType=image&alt=json&num=10&key='..apikey..'&cx='..cseid..'&q=' .. input .. '&fields=items(link,mime,image(contextLink))' local jstr, res = https.request(url) local jdat = json.decode(jstr).items if not jdat then return 'NORESULTS' end if jdat.error then if jdat.error.code == 403 then return 403 else return false end end return jdat end function gImages_nsfw:cache_result(results, text) local cache = {} for v in pairs(results) do cache[v] = results[v].link end for n, link in pairs(cache) do redis:hset('telegram:cache:gImages_nsfw:'..link, 'mime', results[n].mime) redis:hset('telegram:cache:gImages_nsfw:'..link, 'contextLink', results[n].image.contextLink) redis:expire('telegram:cache:gImages_nsfw:'..link, 1209600) end cache_data('gImages_nsfw', string.lower(text), cache, 1209600, 'set') end function gImages_nsfw:action(msg, config, matches) local input = utilities.input(msg.text) if not input then if msg.reply_to_message and msg.reply_to_message.text then input = msg.reply_to_message.text else utilities.send_message(self, msg.chat.id, gImages_nsfw.doc, true, msg.message_id, true) return end end print ('Überprüfe, ob das Wort auf der Blackliste steht: '..input) if is_blacklisted(input) then utilities.send_reply(self, msg, 'Vergiss es!') return end utilities.send_typing(self, msg.chat.id, 'upload_photo') local hash = 'telegram:cache:gImages_nsfw' local results = redis:smembers(hash..':'..string.lower(input)) if not results[1] then print('doing web request') results = gImages_nsfw:get_image(URL.escape(input)) if results == 403 then utilities.send_reply(self, msg, config.errors.quotaexceeded, true) return elseif not results or results == 'NORESULTS' then utilities.send_reply(self, msg, config.errors.results, true) return end gImages_nsfw:cache_result(results, input) end -- Random image from table local i = math.random(#results) -- Thanks to Amedeo for this! local failed = true local nofTries = 0 while failed and nofTries < #results do if results[i].image then img_url = results[i].link mimetype = results[i].mime context = results[i].image.contextLink else -- from cache img_url = results[i] mimetype = redis:hget(hash..':'..img_url, 'mime') context = redis:hget(hash..':'..img_url, 'contextLink') end -- It's important to save the image with the right ending! if mimetype == 'image/gif' then file = download_to_file(img_url) elseif mimetype == 'image/png' then file = download_to_file(img_url) elseif mimetype == 'image/jpeg' then file = download_to_file(img_url) else file = nil end if not file then nofTries = nofTries + 1 i = i+1 if i > #results then i = 1 end else failed = false end end if failed then utilities.send_reply(self, msg, 'Fehler beim Herunterladen eines Bildes.', true) return end if mimetype == 'image/gif' then result = utilities.send_document(self, msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Seite aufrufen","url":"'..context..'"},{"text":"Bild aufrufen","url":"'..img_url..'"},{"text":"Nochmal suchen","callback_data":"@'..self.info.username..' gImages_nsfw:'..URL.escape(input)..'"}]]}') else result = utilities.send_photo(self, msg.chat.id, file, nil, msg.message_id, '{"inline_keyboard":[[{"text":"Seite aufrufen","url":"'..context..'"},{"text":"Bild aufrufen","url":"'..img_url..'"},{"text":"Nochmal suchen","callback_data":"@'..self.info.username..' gImages_nsfw:'..URL.escape(input)..'"}]]}') end if not result then utilities.send_reply(self, msg, config.errors.connection, true, '{"inline_keyboard":[[{"text":"Nochmal versuchen","callback_data":"@'..self.info.username..' gImages_nsfw:'..URL.escape(input)..'"}]]}') return end end return gImages_nsfw