zoukankan      html  css  js  c++  java
  • 微博api接口登陆,获取信息,分享微博

    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)
  • 相关阅读:
    索引
    mysql事务
    centos 7 gitlab安装服务器
    内网穿透工具 frp使用
    eslint配置
    nodejs连接mongodb(密码)
    插入排序
    直接插入排序
    koa中 log4js使用
    JS中的prototype、__proto__与constructor(图解)
  • 原文地址:https://www.cnblogs.com/Erick-L/p/11180855.html
Copyright © 2011-2022 走看看