from os.path import exists, split, splitext
from sys import argv
from urllib.parse import urlunparse
from requests import get, post
from lxml.etree import HTML
namespaces = dict(re="http://e...content-available-to-author-only...t.org/regular-expressions")
from pprint import pprint
extensions = {
".c": "C",
".cpp": "C++14",
".java": "Java7",
".pl": "Perl",
".php": "PHP",
".py": "Python 3",
".ruby": "Ruby",
".sql": "SQL",
".vb": "VB.NET",
".go": "GO",
".js": "JavaScript (rhino)",
".lua": "Lua",
}
def get_ideone(_lang):
url = "http://i...content-available-to-author-only...e.com/"
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" }
rs = get(url, headers=headers)
root = HTML(rs.content if rs.ok else "<error/>")
data = {}
for x in root.xpath('//*[re:test(@id,"p[1-3]")]', namespaces=namespaces):
data[x.get("id")] = x.get("value")
p2 = int(data["p2"])
p3 = int(data["p3"])
p4 = p2 * sum(range(p3))
data["p4"] = str(p4)
_langs = {}
for x in root.xpath('//li/*[re:test(@id,"menu-lang-[0-9]+")]', namespaces=namespaces):
_langs[x.text.upper()] = int(x.get("data-id"))
data["_lang"] = _langs[_lang]
return rs.cookies, data
def ideone(path, _lang=''):
d, f = split(path)
n, e = splitext(f)
if len(_lang) <= 0:
_lang = "Text"
if e.lower() in extensions.keys():
_lang = extensions[e.lower()]
cookies, data = get_ideone(_lang.upper())
data.update({
"input": '',
"syntax": 1,
"timelimit": 0,
"note": '',
"public": 1,
"run": 1,
"Submit": '',
})
with open(path, 'r') as ro:
data["file"] = ro.read()
url = "http://i...content-available-to-author-only...e.com/ideone/Index/submit/"
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36" }
rs = post(url, headers=headers, cookies=cookies, data=data, allow_redirects=False)
scheme = "http"
netloc = "ideone.com"
path = rs.headers["Location"]
params = ''
query = ''
favorite = ''
return _lang, urlunparse((scheme, netloc, path, params, query, favorite))
def usage(name):
print("Usage: ./{} <file1> <file2> ...".format(name))
def main(argc, args):
if argc == 1:
d, f = split(__file__)
usage(f)
else:
for i, x in enumerate(args[1:]):
d, f = split(x)
_lang, url = ideone(x)
print(" - #{} ({}): {} - {}".format(i + 1, f, _lang, url))
if __name__ == "__main__":
main(len(argv), argv)
CmZyb20gb3MucGF0aCBpbXBvcnQgZXhpc3RzLCBzcGxpdCwgc3BsaXRleHQKZnJvbSBzeXMgaW1wb3J0IGFyZ3YKCmZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmx1bnBhcnNlCmZyb20gcmVxdWVzdHMgaW1wb3J0IGdldCwgcG9zdApmcm9tIGx4bWwuZXRyZWUgaW1wb3J0IEhUTUwKbmFtZXNwYWNlcyA9IGRpY3QocmU9Imh0dHA6Ly9lLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi50Lm9yZy9yZWd1bGFyLWV4cHJlc3Npb25zIikKCmZyb20gcHByaW50IGltcG9ydCBwcHJpbnQKCgpleHRlbnNpb25zID0gewogICAgIi5jIjogIkMiLAogICAgIi5jcHAiOiAiQysrMTQiLAogICAgIi5qYXZhIjogIkphdmE3IiwKICAgICIucGwiOiAiUGVybCIsCiAgICAiLnBocCI6ICJQSFAiLAogICAgIi5weSI6ICJQeXRob24gMyIsCiAgICAiLnJ1YnkiOiAiUnVieSIsCiAgICAiLnNxbCI6ICJTUUwiLAogICAgIi52YiI6ICJWQi5ORVQiLAogICAgIi5nbyI6ICJHTyIsCiAgICAiLmpzIjogIkphdmFTY3JpcHQgKHJoaW5vKSIsCiAgICAiLmx1YSI6ICJMdWEiLAp9CgpkZWYgZ2V0X2lkZW9uZShfbGFuZyk6CiAgICB1cmwgPSAiaHR0cDovL2kuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tLyIKICAgIGhlYWRlcnMgPSB7ICJVc2VyLUFnZW50IjogIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdPVzY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvNTEuMC4yNzA0LjEwMyBTYWZhcmkvNTM3LjM2IiB9CiAgICBycyA9IGdldCh1cmwsIGhlYWRlcnM9aGVhZGVycykKICAgIHJvb3QgPSBIVE1MKHJzLmNvbnRlbnQgaWYgcnMub2sgZWxzZSAiPGVycm9yLz4iKQoKICAgIGRhdGEgPSB7fQogICAgZm9yIHggaW4gcm9vdC54cGF0aCgnLy8qW3JlOnRlc3QoQGlkLCJwWzEtM10iKV0nLCBuYW1lc3BhY2VzPW5hbWVzcGFjZXMpOgogICAgICAgIGRhdGFbeC5nZXQoImlkIildID0geC5nZXQoInZhbHVlIikKCiAgICBwMiA9IGludChkYXRhWyJwMiJdKQogICAgcDMgPSBpbnQoZGF0YVsicDMiXSkKICAgIHA0ID0gcDIgKiBzdW0ocmFuZ2UocDMpKQogICAgZGF0YVsicDQiXSA9IHN0cihwNCkKCiAgICBfbGFuZ3MgPSB7fQogICAgZm9yIHggaW4gcm9vdC54cGF0aCgnLy9saS8qW3JlOnRlc3QoQGlkLCJtZW51LWxhbmctWzAtOV0rIildJywgbmFtZXNwYWNlcz1uYW1lc3BhY2VzKToKICAgICAgICBfbGFuZ3NbeC50ZXh0LnVwcGVyKCldID0gaW50KHguZ2V0KCJkYXRhLWlkIikpCiAgICBkYXRhWyJfbGFuZyJdID0gX2xhbmdzW19sYW5nXQoKICAgIHJldHVybiBycy5jb29raWVzLCBkYXRhCgpkZWYgaWRlb25lKHBhdGgsIF9sYW5nPScnKToKICAgIGQsIGYgPSBzcGxpdChwYXRoKQogICAgbiwgZSA9IHNwbGl0ZXh0KGYpCgogICAgaWYgbGVuKF9sYW5nKSA8PSAwOgogICAgICAgIF9sYW5nID0gIlRleHQiCiAgICAgICAgaWYgZS5sb3dlcigpIGluIGV4dGVuc2lvbnMua2V5cygpOgogICAgICAgICAgICBfbGFuZyA9IGV4dGVuc2lvbnNbZS5sb3dlcigpXQoKICAgIGNvb2tpZXMsIGRhdGEgPSBnZXRfaWRlb25lKF9sYW5nLnVwcGVyKCkpCgogICAgZGF0YS51cGRhdGUoewogICAgICAgICJpbnB1dCI6ICcnLAogICAgICAgICJzeW50YXgiOiAxLAogICAgICAgICJ0aW1lbGltaXQiOiAwLAogICAgICAgICJub3RlIjogJycsCiAgICAgICAgInB1YmxpYyI6IDEsCiAgICAgICAgInJ1biI6IDEsCiAgICAgICAgIlN1Ym1pdCI6ICcnLAogICAgfSkKCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3InKSBhcyBybzoKICAgICAgICBkYXRhWyJmaWxlIl0gPSByby5yZWFkKCkKCiAgICB1cmwgPSAiaHR0cDovL2kuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLmUuY29tL2lkZW9uZS9JbmRleC9zdWJtaXQvIgogICAgaGVhZGVycyA9IHsgIlVzZXItQWdlbnQiOiAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV09XNjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS81MS4wLjI3MDQuMTAzIFNhZmFyaS81MzcuMzYiIH0KICAgIHJzID0gcG9zdCh1cmwsIGhlYWRlcnM9aGVhZGVycywgY29va2llcz1jb29raWVzLCBkYXRhPWRhdGEsIGFsbG93X3JlZGlyZWN0cz1GYWxzZSkKCiAgICBzY2hlbWUgPSAiaHR0cCIKICAgIG5ldGxvYyA9ICJpZGVvbmUuY29tIgogICAgcGF0aCA9IHJzLmhlYWRlcnNbIkxvY2F0aW9uIl0KICAgIHBhcmFtcyA9ICcnCiAgICBxdWVyeSA9ICcnCiAgICBmYXZvcml0ZSA9ICcnCiAgICByZXR1cm4gX2xhbmcsIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmYXZvcml0ZSkpCgpkZWYgdXNhZ2UobmFtZSk6CiAgICBwcmludCgiVXNhZ2U6IC4ve30gPGZpbGUxPiA8ZmlsZTI+IC4uLiIuZm9ybWF0KG5hbWUpKQoKZGVmIG1haW4oYXJnYywgYXJncyk6CiAgICBpZiBhcmdjID09IDE6CiAgICAgICAgZCwgZiA9IHNwbGl0KF9fZmlsZV9fKQogICAgICAgIHVzYWdlKGYpCiAgICBlbHNlOgogICAgICAgIGZvciBpLCB4IGluIGVudW1lcmF0ZShhcmdzWzE6XSk6CiAgICAgICAgICAgIGQsIGYgPSBzcGxpdCh4KQogICAgICAgICAgICBfbGFuZywgdXJsID0gaWRlb25lKHgpCiAgICAgICAgICAgIHByaW50KCIgLSAje30gKHt9KToge30gLSB7fSIuZm9ybWF0KGkgKyAxLCBmLCBfbGFuZywgdXJsKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBtYWluKGxlbihhcmd2KSwgYXJndikKCg==