2015-09-22 17:15:46 +00:00
|
|
|
"""URL reducer module"""
|
|
|
|
|
|
|
|
# PYTHON STUFFS #######################################################
|
|
|
|
|
|
|
|
import re
|
2015-10-09 00:47:42 +00:00
|
|
|
import json
|
2015-09-22 17:15:46 +00:00
|
|
|
from urllib.parse import urlparse
|
|
|
|
from urllib.parse import quote
|
|
|
|
|
2015-10-30 20:57:45 +00:00
|
|
|
from nemubot.exception import IMException
|
2015-09-22 17:15:46 +00:00
|
|
|
from nemubot.hooks import hook
|
|
|
|
from nemubot.message import Text
|
|
|
|
from nemubot.tools import web
|
|
|
|
|
|
|
|
|
2015-10-27 21:19:12 +00:00
|
|
|
# MODULE FUNCTIONS ####################################################
|
2015-10-09 00:47:42 +00:00
|
|
|
|
|
|
|
def default_reducer(url, data):
|
|
|
|
snd_url = url + quote(data, "/:%@&=?")
|
|
|
|
return web.getURLContent(snd_url)
|
|
|
|
|
2015-10-25 11:23:46 +00:00
|
|
|
|
|
|
|
def ycc_reducer(url, data):
|
2015-10-26 22:01:44 +00:00
|
|
|
return "http://ycc.fr/%s" % default_reducer(url, data)
|
2015-10-25 11:23:46 +00:00
|
|
|
|
2015-11-21 15:26:12 +00:00
|
|
|
def lstu_reducer(url, data):
|
2015-10-25 11:23:46 +00:00
|
|
|
json_data = json.loads(web.getURLContent(url, "lsturl=" + quote(data),
|
2015-10-09 00:47:42 +00:00
|
|
|
header={"Content-Type": "application/x-www-form-urlencoded"}))
|
2015-10-09 23:18:42 +00:00
|
|
|
if 'short' in json_data:
|
|
|
|
return json_data['short']
|
|
|
|
elif 'msg' in json_data:
|
2015-10-30 20:57:45 +00:00
|
|
|
raise IMException("Error: %s" % json_data['msg'])
|
2015-10-09 23:18:42 +00:00
|
|
|
else:
|
2015-10-30 20:57:45 +00:00
|
|
|
IMException("An error occured while shortening %s." % data)
|
2015-10-09 00:47:42 +00:00
|
|
|
|
2015-09-22 17:15:46 +00:00
|
|
|
# MODULE VARIABLES ####################################################
|
|
|
|
|
|
|
|
PROVIDERS = {
|
2015-10-09 00:47:42 +00:00
|
|
|
"tinyurl": (default_reducer, "http://tinyurl.com/api-create.php?url="),
|
2015-10-25 11:23:46 +00:00
|
|
|
"ycc": (ycc_reducer, "http://ycc.fr/redirection/create/"),
|
2015-11-21 15:26:12 +00:00
|
|
|
"framalink": (lstu_reducer, "https://frama.link/a?format=json"),
|
|
|
|
"huitre": (lstu_reducer, "https://huit.re/a?format=json"),
|
|
|
|
"lstu": (lstu_reducer, "https://lstu.fr/a?format=json"),
|
2015-09-22 17:15:46 +00:00
|
|
|
}
|
2015-10-09 00:47:42 +00:00
|
|
|
DEFAULT_PROVIDER = "framalink"
|
2015-09-22 17:15:46 +00:00
|
|
|
|
2015-10-13 22:17:02 +00:00
|
|
|
PROVIDERS_NETLOC = [urlparse(web.getNormalizedURL(url), "http").netloc for f, url in PROVIDERS.values()]
|
2015-09-22 17:15:46 +00:00
|
|
|
|
|
|
|
# LOADING #############################################################
|
|
|
|
|
2015-10-25 11:23:46 +00:00
|
|
|
|
2015-09-22 17:15:46 +00:00
|
|
|
def load(context):
|
|
|
|
global DEFAULT_PROVIDER
|
|
|
|
|
|
|
|
if "provider" in context.config:
|
|
|
|
if context.config["provider"] == "custom":
|
|
|
|
PROVIDERS["custom"] = context.config["provider_url"]
|
|
|
|
DEFAULT_PROVIDER = context.config["provider"]
|
|
|
|
|
|
|
|
|
|
|
|
# MODULE CORE #########################################################
|
|
|
|
|
2015-10-10 23:18:42 +00:00
|
|
|
def reduce(url, provider=DEFAULT_PROVIDER):
|
2015-10-09 00:47:42 +00:00
|
|
|
"""Ask the url shortner website to reduce given URL
|
2015-09-22 17:15:46 +00:00
|
|
|
|
|
|
|
Argument:
|
|
|
|
url -- the URL to reduce
|
|
|
|
"""
|
2015-10-10 23:18:42 +00:00
|
|
|
return PROVIDERS[provider][0](PROVIDERS[provider][1], url)
|
2015-09-22 17:15:46 +00:00
|
|
|
|
2015-10-25 11:23:46 +00:00
|
|
|
|
2015-09-22 17:15:46 +00:00
|
|
|
def gen_response(res, msg, srv):
|
|
|
|
if res is None:
|
2015-10-30 20:57:45 +00:00
|
|
|
raise IMException("bad URL : %s" % srv)
|
2015-09-22 17:15:46 +00:00
|
|
|
else:
|
|
|
|
return Text("URL for %s: %s" % (srv, res), server=None,
|
|
|
|
to=msg.to_response)
|
|
|
|
|
|
|
|
|
|
|
|
## URL stack
|
|
|
|
|
|
|
|
LAST_URLS = dict()
|
|
|
|
|
|
|
|
|
2015-11-01 12:54:59 +00:00
|
|
|
@hook.message()
|
2015-09-22 17:15:46 +00:00
|
|
|
def parselisten(msg):
|
|
|
|
parseresponse(msg)
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
2015-11-01 12:54:59 +00:00
|
|
|
@hook.post()
|
2015-09-22 17:15:46 +00:00
|
|
|
def parseresponse(msg):
|
|
|
|
global LAST_URLS
|
2015-11-26 19:51:07 +00:00
|
|
|
if hasattr(msg, "text") and isinstance(msg.text, str):
|
2015-10-26 22:01:44 +00:00
|
|
|
urls = re.findall("([a-zA-Z0-9+.-]+:(?://)?(?:[^ :/]+:[0-9]+)?[^ :]+)", msg.text)
|
2015-09-22 17:15:46 +00:00
|
|
|
for url in urls:
|
2015-10-13 22:17:02 +00:00
|
|
|
o = urlparse(web._getNormalizedURL(url), "http")
|
2015-10-12 04:52:44 +00:00
|
|
|
|
|
|
|
# Skip short URLs
|
2015-10-25 11:23:46 +00:00
|
|
|
if (o.netloc == "" or o.netloc in PROVIDERS or
|
|
|
|
len(o.netloc) + len(o.path) < 17):
|
2015-10-12 04:52:44 +00:00
|
|
|
continue
|
|
|
|
|
2015-11-01 12:54:59 +00:00
|
|
|
for recv in msg.to:
|
2015-10-12 04:52:44 +00:00
|
|
|
if recv not in LAST_URLS:
|
|
|
|
LAST_URLS[recv] = list()
|
|
|
|
LAST_URLS[recv].append(url)
|
2015-09-22 17:15:46 +00:00
|
|
|
return msg
|
|
|
|
|
|
|
|
|
|
|
|
# MODULE INTERFACE ####################################################
|
|
|
|
|
2015-11-01 12:54:59 +00:00
|
|
|
@hook.command("framalink",
|
2015-10-31 16:40:23 +00:00
|
|
|
help="Reduce any long URL",
|
|
|
|
help_usage={
|
|
|
|
None: "Reduce the last URL said on the channel",
|
|
|
|
"URL [URL ...]": "Reduce the given URL(s)"
|
|
|
|
},
|
|
|
|
keywords={
|
|
|
|
"provider=SMTH": "Change the service provider used (by default: %s) among %s" % (DEFAULT_PROVIDER, ", ".join(PROVIDERS.keys()))
|
|
|
|
})
|
2015-09-22 17:15:46 +00:00
|
|
|
def cmd_reduceurl(msg):
|
|
|
|
minify = list()
|
|
|
|
|
|
|
|
if not len(msg.args):
|
|
|
|
global LAST_URLS
|
|
|
|
if msg.channel in LAST_URLS and len(LAST_URLS[msg.channel]) > 0:
|
|
|
|
minify.append(LAST_URLS[msg.channel].pop())
|
|
|
|
else:
|
2015-10-30 20:57:45 +00:00
|
|
|
raise IMException("I have no more URL to reduce.")
|
2015-09-22 17:15:46 +00:00
|
|
|
|
|
|
|
if len(msg.args) > 4:
|
2015-10-30 20:57:45 +00:00
|
|
|
raise IMException("I cannot reduce that maby URLs at once.")
|
2015-09-22 17:15:46 +00:00
|
|
|
else:
|
|
|
|
minify += msg.args
|
|
|
|
|
2015-10-10 23:18:42 +00:00
|
|
|
if 'provider' in msg.kwargs and msg.kwargs['provider'] in PROVIDERS:
|
|
|
|
provider = msg.kwargs['provider']
|
|
|
|
else:
|
|
|
|
provider = DEFAULT_PROVIDER
|
|
|
|
|
2015-09-22 17:15:46 +00:00
|
|
|
res = list()
|
|
|
|
for url in minify:
|
2015-10-13 22:17:02 +00:00
|
|
|
o = urlparse(web.getNormalizedURL(url), "http")
|
2015-10-10 23:18:42 +00:00
|
|
|
minief_url = reduce(url, provider)
|
2015-10-12 04:52:44 +00:00
|
|
|
if o.netloc == "":
|
|
|
|
res.append(gen_response(minief_url, msg, o.scheme))
|
2015-09-22 17:15:46 +00:00
|
|
|
else:
|
2015-10-12 04:52:44 +00:00
|
|
|
res.append(gen_response(minief_url, msg, o.netloc))
|
2015-09-22 17:15:46 +00:00
|
|
|
return res
|