因为最近接触到调用新浪微博开放接口的项目,所以就想试试用python调用微博API。

SDK下载地址:http://open.weibo.com/wiki/SDK 代码不多十几K,完全可以看懂。

有微博账号可以新建一个APP,然后就可以得到app key和app secret,这个是APP获得OAuth2.0授权所必须的。

了解OAuth2可以查看链接新浪微博的说明。 OAuth2授权参数除了需要app key和app secret还需要网站回调地址redirect_uri,并且这个回调地址不允许是局域网的(神马localhost,127.0.0.1好像都不行),这个着实让我着急了半天。我使用API也不是网站调用,于是查了很多。看到有人写可以用这个地址替代,https://api.weibo.com/oauth2/default.html,我试了一下果然可以,对于屌丝来说是个好消息。

下面先来个简单的程序,感受一下:

设置好以下参数

import sys

import weibo

import webbrowser

APP_KEY = ''

MY_APP_SECRET = ''

REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html'

获得微博授权URL,如第2行,用默认浏览器打开后会要求登陆微博,用需要授权的账号登陆,如下图

api = weibo.APIClient(app_key=APP_KEY,app_secret=MY_APP_SECRET,redirect_uri=REDIRECT_URL)

authorize_url = api.get_authorize_url()

print(authorize_url)

webbrowser.open_new(authorize_url)

登陆后会调转到一个连接https://api.weibo.com/oauth2/default.html?code=92cc6accecfb5b2176adf58f4c

关键就是code值,这个是认证的关键。手动输入code值模拟认证

request = api.request_access_token(code, REDIRECT_URL)

access_token = request.access_token

expires_in = request.expires_in

api.set_access_token(access_token, expires_in)

api.statuses.update.post(status=u'Test OAuth 2.0 Send a Weibo!')

access_token就是获得的token,expires_in是授权的过期时间 (UNIX时间)

用set_access_token保存授权。往下就可以调用微博接口了。测试发了一条微博

但是这样的手动输入code方式,不适合程序的调用,是否可以不用打开链接的方式来请求登陆获取授权,经多方查找和参考,将程序改进如下,可以实现自动获取code并保存,方便程序服务调用。

accessWeibo

# -*- coding: utf-8 -*-

#/usr/bin/env python

#access to SinaWeibo By sinaweibopy

#实现微博自动登录,token自动生成,保存及更新

#适合于后端服务调用

from weibo import APIClient

import pymongo

import sys, os, urllib, urllib2

from http_helper import *

from retry import *

try:

import json

except ImportError:

import simplejson as json

# setting sys encoding to utf-8

default_encoding = 'utf-8'

if sys.getdefaultencoding() != default_encoding:

reload(sys)

sys.setdefaultencoding(default_encoding)

# weibo api访问配置

APP_KEY = '' # app key

APP_SECRET = '' # app secret

REDIRECT_URL = 'https://api.weibo.com/oauth2/default.html' # callback url 授权回调页,与OAuth2.0 授权设置的一致

USERID = '' # 登陆的微博用户名,必须是OAuth2.0 设置的测试账号

USERPASSWD = '' # 用户密码

client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=REDIRECT_URL)

def make_access_token():

#请求access token

params = urllib.urlencode({

'action':'submit',

'withOfficalFlag':'0',

'ticket':'',

'isLoginSina':'',

'response_type':'code',

'regCallback':'',

'redirect_uri':REDIRECT_URL,

'client_id':APP_KEY,

'state':'',

'from':'',

'userId':USERID,

'passwd':USERPASSWD,

})

login_url = 'https://api.weibo.com/oauth2/authorize'

url = client.get_authorize_url()

content = urllib2.urlopen(url)

if content:

headers = { 'Referer' : url }

request = urllib2.Request(login_url, params, headers)

opener = get_opener(False)

urllib2.install_opener(opener)

try:

f = opener.open(request)

return_redirect_uri = f.url

except urllib2.HTTPError, e:

return_redirect_uri = e.geturl()

# 取到返回的code

code = return_redirect_uri.split('=')[1]

#得到token

token = client.request_access_token(code,REDIRECT_URL)

save_access_token(token)

def save_access_token(token):

#将access token保存到MongoDB数据库

mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)

db= mongoCon.weibo

t={

"access_token":token['access_token'],

"expires_in":str(token['expires_in']),

"date":time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))

}

db.token.insert(t,safe=True)

#Decorator 目的是当调用make_access_token()后再执行一次apply_access_token()

@retry(1)

def apply_access_token():

#从MongoDB读取及设置access token

try:

mongoCon=pymongo.Connection(host="127.0.0.1",port=27017)

db= mongoCon.weibo

if db.token.count()>0:

tokenInfos=db.token.find().sort([("_id",pymongo.DESCENDING)]).limit(1)

else:

make_access_token()

return False

for tokenInfo in tokenInfos:

access_token=tokenInfo["access_token"]

expires_in=tokenInfo["expires_in"]

try:

client.set_access_token(access_token, expires_in)

except StandardError, e:

if hasattr(e, 'error'):

if e.error == 'expired_token':

# token过期重新生成

make_access_token()

return False

else:

pass

except:

make_access_token()

return False

return True

if __name__ == "__main__":

apply_access_token()

# 以下为访问微博api的应用逻辑

# 以发布文字微博接口为例

client.statuses.update.post(status='Test OAuth 2.0 Send a Weibo!')

retry.py

import math

import time

# Retry decorator with exponential backoff

def retry(tries, delay=1, backoff=2):

"""Retries a function or method until it returns True.

delay sets the initial delay, and backoff sets how much the delay should

lengthen after each failure. backoff must be greater than 1, or else it

isn't really a backoff. tries must be at least 0, and delay greater than

0."""

if backoff <= 1:

raise ValueError("backoff must be greater than 1")

tries = math.floor(tries)

if tries < 0:

raise ValueError("tries must be 0 or greater")

if delay <= 0:

raise ValueError("delay must be greater than 0")

def deco_retry(f):

def f_retry(*args, **kwargs):

mtries, mdelay = tries, delay # make mutable

rv = f(*args, **kwargs) # first attempt

while mtries > 0:

if rv == True or type(rv) == str: # Done on success ..

return rv

mtries -= 1 # consume an attempt

time.sleep(mdelay) # wait...

mdelay *= backoff # make future wait longer

rv = f(*args, **kwargs) # Try again

return False # Ran out of tries :-(

return f_retry # true decorator -> decorated function

return deco_retry # @retry(arg[, ...]) -> true decorator

http_helper.py

# -*- coding: utf-8 -*-

#/usr/bin/env python

import urllib2,cookielib

class SmartRedirectHandler(urllib2.HTTPRedirectHandler):

def http_error_301(cls, req, fp, code, msg, headers):

result = urllib2.HTTPRedirectHandler.http_error_301(cls, req, fp, code, msg, headers)

result.status = code

print headers

return result

def http_error_302(cls, req, fp, code, msg, headers):

result = urllib2.HTTPRedirectHandler.http_error_302(cls, req, fp, code, msg, headers)

result.status = code

print headers

return result

def get_cookie():

cookies = cookielib.CookieJar()

return urllib2.HTTPCookieProcessor(cookies)

def get_opener(proxy=False):

rv=urllib2.build_opener(get_cookie(), SmartRedirectHandler())

rv.addheaders = [('User-agent', 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)')]

return rv

本文标题: python调用新浪微博API项目实践

本文地址: http://www.cppcns.com/jiaoben/python/111245.html

python新浪api_python调用新浪微博API项目实践相关推荐

  1. python新浪api_python调用新浪微博API | 学步园

    前提:在新浪微博应用开发平台成功创建一个应用,并获得可用APP_KEY.APP_SECRET.CALLBACK_URL. 1.下载OAuth2的python版SDK,https://github.co ...

  2. python调取高德api_Python调用高德API实现批量地址转经纬度并写入表格的功能

    本段代码是先将需要转换经纬度的地址爬取在 '地址.csv' 文件里,文件截图示例: 代码展示 # coding=utf-8 # SPL # 时间:2020/12/20 21:15 import csv ...

  3. Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解

    参考自:http://www.myexception.cn/program/1930025.html https://blog.csdn.net/qq_36580777/article/details ...

  4. C#调用新浪微博API发送消息成功

    成功一小步,用C#调用新浪微博API发送消息成功,庆祝一下.其实没什么难的,主要是看新浪的开发文档受到了误导. 在新浪的文档里面的参数从说明到例子都是组合参数,并且遗漏了一个参数说明,调试的时候查看错 ...

  5. 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

    新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...

  6. Java调用 新浪微博API 接口发微博,逐条讲解,绝对清晰

    最近要做个课程设计,使用微博控制树莓派,树莓派再控制发光二极管的亮和灭,主要设计分两层,上层是用Java调用新浪微博API来实现对微博旳监听,当我的微博被回复时能够自动读取评论内容,并根据评论的指令内 ...

  7. Java调用 新浪微博API 接口发微博,逐项讲解,绝对清晰

    转载自:http://www.myexception.cn/program/1930025.html Java调用 新浪微博API 接口发微博,逐条讲解,绝对清晰 最近要做个课程设计,使用微博控制树莓 ...

  8. python查询实时天气预报_微信公众号+python+新浪SAE实现实时天气预报功能

    本文主要谈谈如何做一个具有天气预报功能的公众号. 话不多说先上图,实现的功能如下图所示: 点击微信右下角的"+"号,分享任意一个位置信息,公众号后台自动回复当地的天气情况.这里的天 ...

  9. python3调用新浪微博API 报HTTP Error 403: Forbid、400 Bad Request错误

    python3 调用新浪微博API时,出现两种错误 1. Error 403: Forbid 一个原因是在新浪微博开放平台注册的应用平台没有审核,会限制访问次数.可以重新申请一个应用平台,即可访问正常 ...

  10. Python 新浪实时新闻词云

    ''' Python 新浪实时新闻词云 by 郑瑞国 ''' from wordcloud import WordCloud import re import urllib.request impor ...

最新文章

  1. javassist 初步学习
  2. 毕业去哪儿?清华大学2018年毕业生就业质量报告发布
  3. 微型计算机的发展通常以为技术指标,计算机组成原理期末复习题.doc
  4. 对 VR 项目开发流程的调研
  5. oracle安装报错emca,求助:oracle 安装问题
  6. 不愿意和别人打交道_最不愿与陌生人打交道的星座
  7. java easyreport 导入excel、 txt 数据复合属性(二)
  8. Vue源码分析 - observer.js
  9. Git基础入门(一)Git基础概念
  10. Android 极光推送集成
  11. java截取标签内容_Java 正则 , 截取两个标签之间字符串
  12. Adapter模式 适配器模式
  13. 安卓24:Android关于日期和时间的几个相关控件DatePicker、TimePicker等
  14. word转pdf组合的图片出现灰线,如何处理
  15. ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
  16. 一文了解超级账本DLT、库、开发工具有哪些, Hyperledger家族成员你认识几个?
  17. 从又苦又累的销售工作到python程序员,我哭了
  18. html滚轮下拉动画,html5+css3齿轮滚动动画代码
  19. k8s集群搭建-1mater2node
  20. 关于intellij idea的

热门文章

  1. vue实现调用摄像头扫描二维码功能
  2. 5个超实用抠图方法,哪个适用用哪个
  3. 常见文件扩展名和它们的说明
  4. 编译原理(第3版)陈火旺——课后习题答案——第四章
  5. c#实现简单学生信息管理系统
  6. unityar自动识别人脸_Unity2019.2 Beta版:支持AR面部追踪和3D物体识别
  7. 遗传算法原理及应用一(编码、适应度函数与选择算子)
  8. 最新cs1.6服务器ip地址,CS1.6服务器IP地址
  9. 信息与网络安全基础知识汇总
  10. 介绍几个能下载中英文双语字幕电影的网站