Skip to content

Instantly share code, notes, and snippets.

@Winand
Created April 8, 2016 12:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Winand/9a3c73a2426786a29e7df84a750e869b to your computer and use it in GitHub Desktop.
Save Winand/9a3c73a2426786a29e7df84a750e869b to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import http.server, webbrowser, threading
from urllib.parse import urlencode, urlparse, parse_qs
class VK():
SERVER_ADDRESS = "localhost", 0
auth_root = "https://oauth.vk.com/authorize"
auth_params = {"client_id": None, "scope": None, "redirect_uri": None,
"display": "page", "response_type": "token"}
class Handler(http.server.BaseHTTPRequestHandler):
js = """<script>
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if(request.readyState==4 && request.status==200)
window.close();
};
request.open('head', "http://%s:%s/response?"+
window.location.hash.substring(1), true);
request.send(null);
</script>"""
def respond(self, status, body=None):
self.send_response(status)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
if body:
self.wfile.write(body.encode())
def do_HEAD(self):
path = urlparse(self.path)
if path.path=="/response":
self.respond(200)
token = parse_qs(path.query)['access_token'][0]
self.server.token = token
threading.Thread(target=self.server.shutdown,
daemon=True).start()
else: self.respond(404)
def do_GET(self):
if urlparse(self.path).path=="/request":
self.respond(200, self.js%self.server.server_address)
else: self.respond(404)
def __init__(self, appid, permissions):
self.app_id, self.perm = appid, permissions
self.auth_params.update({"client_id": self.app_id, "scope": self.perm})
def get_token(self):
"Open auth url and wait for authorization to complete"
server = http.server.HTTPServer(self.SERVER_ADDRESS, self.Handler)
self.auth_params["redirect_uri"] = \
"http://%s:%s/request"%(self.SERVER_ADDRESS[0], server.server_port)
url = "?".join((self.auth_root, urlencode(self.auth_params)))
webbrowser.open(url)
# print(url)
server.serve_forever()
return server.token
app_id = xxx
perm = "offline"
vk = VK(app_id, perm)
token = vk.get_token()
print(token)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment