import json from datetime import datetime import MySQLdb import requests from flask import Flask, redirect, request app = Flask(__name__) class ApiError(Exception): def __init__(self, code, msg): super(ApiError, self).__init__() self.code = code self.msg = msg def __str__(self): return '{0}:{1}'.format(self.code, self.msg) class ServerError(Exception): pass class WeiboClient(object): API_URL = 'https://api.weibo.com/' def __init__(self, client_id, client_secret): self.client_id = client_id self.client_secret = client_secret self.token = {} @property def access_token(self): if self.token: return self.token['access_token'] return None def fetch(self, method, url, params={}): ''' 接口请求的统一封装 :param method: :param url: :param params: :return: ''' try: if method == 'POST': resp = requests.post(url, params) else: resp = requests.get(url, params) if resp.status_code >= 200 and resp.status_code < 300: # 接口正常 rest = resp.json() if 'error_code' in rest: raise ApiError(rest['error_code'], rest['error']) return rest elif resp.status_code >= 400: raise ServerError() except ApiError as e: print('ApiError') pass except ServerError as e: print('ServerError') except Exception: print('Exception') def get_ticket_url(self, redirect_uri=None): ''' 获取从浏览器跳转的 url :param redirect_uri: :return: ''' if redirect_uri is None: redirect_uri = 'http://test.baidu.com' url = self.API_URL + 'oauth2/authorize?client_id={0}&response_type=code&redirect_uri={1}'.format( self.client_id, redirect_uri ) # get请求 return url def get_token(self, code): ''' 获取token :param code: :return: ''' # 如果已经有了,则直接返回 if self.token: return self.token url = self.API_URL + 'oauth2/access_token?client_id={0}&client_secret={1}&grant_type=authorization_code&redirect_uri=http://test.baidu.com&code={2}'.format( self.client_id, self.client_secret, code ) resp = self.fetch('POST', url) self.token = resp.json() return self.token def get_user_info(self, access_token, uid): ''' 获取用户信息 :param code: :param uid: :return: ''' url = self.API_URL + '2/users/show.json' # access_token = self.get_token(code)['access_token'] resp = self.fetch('GET', url, { 'access_token': access_token, 'uid': uid }) return resp.json() def get_conn(self): """ 获取mysql 的连接 """ try: conn = MySQLdb.connect( db='db_user', host='localhost', user='root', password='', charset='utf8' ) except: pass return conn def weibo_share(self): ''' 分享数据到微博 :param access_token: :return: ''' url = self.API_URL + '2/statuses/share.json' resp = self.fetch('POST', url, { # 'access_token': self.access_token, 'status': '现在是北京时间: {0} http://test.baidu.com'.format(datetime.now()) }) return resp client_id = '3xxxx3' client_secret = '0b4axxxx' client = WeiboClient(client_id, client_secret) @app.route('/') def index(): code = request.args.get('code', None) # 根据code来获取token token = client.get_token(code) # 获取用户信息 user_info = client.get_user_info(token['access_token'], token['uid']) third_id = user_info['id'] nickname = user_info['screen_name'] headimg = user_info['profile_image_url'] # 获取数据库的链接 conn = client.get_conn() cursor = conn.cursor() sql = "INSERT INTO `user`(`third_id`, `nickname`, `headimg`) VALUES('{third_id}', '{nickname}', '{headimg}')".format( third_id=third_id, nickname=nickname, headimg=headimg) print(sql) cursor.execute(sql) conn.autocommit(True) return json.dumps(user_info) @app.route('/weibo') def weibo(): ticket = client.get_ticket_url() return redirect(ticket) @app.route('/share') def share(): rest = client.weibo_share() return json.dumps(rest) if __name__ == '__main__': app.run(debug=True, port=80)