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)

微博api接口登陆,获取信息,分享微博的更多相关文章

  1. 简单几行代码使用百度地图API接口分页获取信息

    首发于: 万能助手扩展开发:使用百度地图API接口分页获取信息_电脑计算机编程入门教程自学 http://jianma123.com/viewthread.aardio?threadid=426 使用 ...

  2. 后端API接口的错误信息返回规范

    前言 最近我司要制定开发规范.在讨论接口返回的时候,后端的同事询问我们前端,错误信息的返回,前端有什么意见? 所以做了一些调研给到后端的同事做参考. 错误信息返回 在使用API时无可避免地会因为各种情 ...

  3. 2)实现github自动登陆获取信息

    # -*- coding:utf-8 -*- # __author__ = 'lixiang' # 实现github自动登陆和获取数据 import requests from bs4 import ...

  4. 如何利用百度音乐播放器的API接口来获取高音质歌曲

    第一步:在网页中打开以下网址: http://box.zhangmen.baidu.com/x?op=12&count=1&title=时间都去哪儿了$$王铮亮$$$$ 其中红色地方可 ...

  5. Winform混合式开发框架访问Web API接口的处理

    在我的混合式开发框架里面,集成了WebAPI的访问,这种访问方式不仅可以实现简便的数据交换,而且可以在多种平台上进行接入,如Winform程序.Web网站.移动端APP等多种接入方式,Web API的 ...

  6. php 登录注册api接口代码

    /** *一览(www.yl1001.com) * PHP开发API接口 服务端 */ require 'conn.php'; //连接数据库的文件 header('Content-Type:text ...

  7. 简单天气应用开发——API接口

    寒假回家无事,想到自学iOS开发已有一段时间,还没做过真正自己的应用,就起了做一个天气预报App的念头. 想到就做.天气预报第一步自然是找到好用的API接口来获取天气信息.在百度上搜索了一圈,找到的都 ...

  8. 微信小程序+OLAMI(欧拉蜜)自然语言API接口制作智能查询工具--快递、聊天、日历等

    微信小程序最近比较热门,再加上自然语义理解也越来越被人关注,于是我想赶赶潮流,做一个小程序试试.想来想去快递查询应该是一种比较普遍的需求. 如果你也在通过自然语言接口做点什么,希望我的这篇博客能帮到你 ...

  9. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

随机推荐

  1. PATA1035Password

    需要注意的就是把判定函数提取出来,这样可以简化代码,同时参数引用了&,可以对于传入参数进行修改. 参考代码: #define _CRT_SECURE_NO_WARNINGS #include& ...

  2. 用luks方式对磁盘进行加密以及加密磁盘的自动挂载

    1.关于luks加密 LUKS(Linux Unified Key Setup)为Linux硬盘分区加密提供了一种标准,它不仅能通用于不同的 Linux发行版本,还支持多用户/口令.因为它的加密密钥独 ...

  3. 第01组 Alpha事后诸葛亮

    目录 一.总结思考 1.设想和目标 ①我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? ②我们达到目标了么(原计划的功能做到了几个? 按照原计划交付时间交付了么? 原 ...

  4. sublime插件开发: 文件说明

    sublime插件开发 文件 .sublime-settings 设置文件 Main.sublime-menu 主菜单按钮配置文件 Side Bar.sublime-menu 侧边栏菜单文件列表,选中 ...

  5. EmotiW 历年竞赛冠军数据及论文信息

    date Baseline paper Champion paper Model & Feature Test_acc 2013 [1] [2] EmoNets 41.03 2014 [3] ...

  6. JMeter分布式执行环境的搭建 ( 使用基于SSL的RMI的有效密钥库 )

    JMeter分布式执行环境的搭建 ( 使用基于SSL的RMI的有效密钥库 ) 在上一篇的基础之上,提供一个简单的例子: Master和Slave不是同一台,采用默认端口 Master:10.86.16 ...

  7. 补习系列(17)-springboot mongodb 内嵌数据库【华为云技术分享】

    目录 简介 一.使用 flapdoodle.embed.mongo A. 引入依赖 B. 准备测试类 C. 完善配置 D. 启动测试 细节 二.使用Fongo A. 引入框架 B. 准备测试类 C.业 ...

  8. SQL系列(十一)—— 函数(function)

    SQL中的函数也非常多,而且不同的DBMS提供了相应的特殊函数.但是常用的共性函数大致可以分为以下几种: 函数类型 函数 数值函数 1.算术计算:+.-.*./ 2.数值处理:ABS()绝对值处理.P ...

  9. RabbitMQ学习之RPC(6)

    在第二个教程中,我们了解到如何在多个worker中使用Work Queues分发费时的任务. 但是,如果我们需要在远程运行一个函数并且等待结果该怎么办呢?这个时候,我们需要另外一个模式了.这种模式通常 ...

  10. 基于Jquery的下拉列表控件(个人觉得实用)

    Selectize.js Selectize 是一个基于 jQuery 的 <select> UI 控件,对于标签选择和下拉列表功能非常有用. Selectize 的目标是通过简单而强大的 ...