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. 【斜率优化】【P5468】 [NOI2019]回家路线

    Description 给定 \(n\) 点,这 \(n\) 个点由 \(m\) 班列车穿插连结.对于第 \(i\) 班列车,会在 \(p_i\) 时刻从 \(x_i\) 站点出发开向 \(y_i\) ...

  2. js之juery

    目录 JQuery 属性选择器: 操作标签 文本操作 属性操作 文档处理 事件 JQuery 属性选择器: 属性选择器: [attribute] [attribute=value]// 属性等于 [a ...

  3. 几句话总结一个算法之Q-Learning与Sarsa

    与Policy Gradients的不同之处在于,这两个算法评估某个状态s执行某个动作a的期望奖励,即Q(s,a) Q(s,a) 有两种方法计算方法,第一种直接查表或者模型预估,Q(s, a) = c ...

  4. 2018-2019-2 网络对抗技术 20165230 Exp8 Web基础

    目录 实验目的 实验内容 实验步骤 (一)Web前端HTML Apache HTML编程 (二) Web前端javascipt 基础知识理解 JavaScript编程 (三)Web后端:MySQL基础 ...

  5. Gamma阶段第九次scrum meeting

    每日任务内容 队员 昨日完成任务 明日要完成的任务 张圆宁 #91 用户体验与优化https://github.com/rRetr0Git/rateMyCourse/issues/91(持续完成) # ...

  6. 【视频开发】IR-CUT作用

    自然界存在着各种波长的光线,通过折射人眼能看到不同颜色的光线,这就是光线的波长不同所导致的.其实还有许多光线是人眼看不到的,人眼识别光线的波长范围在320nm-760nm之间,超过760nm的光线人眼 ...

  7. IDEA中,使用maven-可视化-下载jar包的source和javadoc

    需求:想看jar包的源码和文档注释 操作:在Idea的右侧Maven窗口,选中一个Module,然后展开Dependencies|,选中一个依赖包,按住鼠标右键单击,选择Download Source ...

  8. SpringApplication常见用法说明

    启动方式 方式1:在main方法中执行SpringApplication.run()这种方式来启动我们的工程 // 方式一 @SpringBootApplication public class Ap ...

  9. Django 定义视图函数

    Django 定义视图函数 一.接收内容及文件处理 1.接收分类 # 获取数据 request.GET # 提交数据 request.POST # 获取文件 request.FILES 2.check ...

  10. CSP2019-S游记

    目录 CSP2019-S游记 Day -2(UPDATE:2019-11-14) Day -1(UPDATE:2019-11-15) Day 1(UPDATE:2019-11-16) Day 2(UP ...