birdy是一个超级棒的python twitter api客户端。

bird的Python项目详细描述


birdy
==

``birdy``是一个超级棒的twitter api客户端,适合python,只需
不到400个loc。

----


features
~~~~~~~

-`具有完整rest和流式api的经得起未来考验的动态api
coverage<;#ok-im-salled-but-how-do-i-use-it-how-does-this-dynamic-api-construction-work>;` `
-`oauth1(用户)和oauth2(应用程序)身份验证
工作流<;`很好的-关于授权的-how-do-i-get-my-access-tokens>;`
-`automatic json decoding<;`automatic json decoding>;`
`jsonobject<;jsonobject>;``uu
-`apireponse<;`apireponse>;``streamresponse<;`streamresponse>;``u
对象
-`information exceptions<;`information exceptions>;``u
-`通过
子类化易于自定义<;#通过子类化>;``uuu
-`建立在优秀的请求和请求之上,ouathlib
库<;`credits>;``uuuu

安装
~~~~~~~~~~~~~~

安装"birdy"的最简单和推荐的方法是从
`pypi<;https://pypi.python.org/pypi/birdy>;`

::




用法
~~



导入客户端并初始化它:

。代码::python

from birdy.twitter import userclient
client=userclient(使用者密钥,
使用者密钥,
访问令牌,
访问令牌密钥)


get example(**get users/show**):

……代码::python

response=client.api.users.show.get(screen_name='twitter')
response.data

post example(**post status/update**):

代码::pyhton

response=client.api.statuses.update.post(status='hello@pybirdy!')

动态url示例(**post status/destroy/:id**):

…代码::python

response=client.api.statuses.destroy['240854986559455234'].post()

streaming api示例(**public stream post statuses/filter**):

…代码::python

response=client.stream.statuses.filter.post(track="twitter")


response.stream()中的数据:


print data

``(3.4+)。


为什么要使用另一个python twitter api客户端?还不够吗?
-----------------------------------

这只需要不到400行代码就可以覆盖整个twitter rest api。

但更重要的是,它依赖于python的动态特性来自动构造api调用(不需要针对
api资源的单独包装函数)。这允许"birdy"覆盖所有现有的twitter api资源和任何未来的添加,而无需更新"birdy"。


包括对**oauth1**(用户)和**oauth2**
(应用程序)身份验证工作流的完全支持。

而且设计明确,除了错误
处理和json解码之外,它不会以任何
方式处理返回的数据,这是留给您处理的(谁会更清楚如何处理
它)。

这个动态api构造是如何工作的?
——假设您想查询
twitter以获取@twitter用户信息。这个
的twitter api资源是**get users/show**(`twitter
docs<;https://dev.twitter.com/docs/api/1.1/get/users/show>;``uuu.


首先需要导入一个客户机,这里我们导入userclient
(oauth1)并初始化它。

代码::python

from birdy.twitter import userclient
client=userclient(使用者密钥,
使用者密钥,
访问令牌,
access_token_secret)

代码::python

resource=client.api.users.show
response=resource.get(screen\name='twitter')

然后,当对
资源调用get()时,``birdy``将构造一个完整的资源url,将传递给get()的任何
参数附加到它,并向该url发出get请求,然后
返回结果。

代码::python

response=client.api.users.show.get(screen_name='twitter')


发出post请求是类似的,例如,如果您想发布状态更新,这是如何做到的。api资源是**post
statuses/update**(`twitter
docs<;https://dev.twitter.com/docs/api/1.1/post/statuses/update>;``uuu)。

代码::python

response=client.api.statuses.update.post(status='hello@pybirdy!')

与"client.api"转换为正确路径之后的部分之前一样,只调用了这次post(),而不是get(),因此"birdy"作为
请求正文的一部分发出post请求并传递参数(和文件)。


api资源url,比如在**post statuses/destroy/:id**(`twitter
docs<;https://dev.twitter.com/docs/api/1.1/post/statuses/destroy/:id>;``uu)删除tweet时,
``birdy``支持另一种类似字典查找的语法。对于
示例,删除ID为"240854986559455234"的tweet如下。

代码::python

response=client.api.statuses.destroy['240854986559455234'].post()

唯一的区别是api路径的
部分像字典键查找一样提供。

实际上,任何调用都可以用这种替代语法编写,可以使用
任何您喜欢的语法。两种语法形式都可以自由组合,如上面的
示例所示。还有一些例子:

…代码::python

response=client.api['users/show'].get(screen_name='twitter')

response=client.api['users']['show'].get(screen_name='twitter')

response=client.api['statuses/destroy']['240854986559455234'].post()

是否也支持流式api?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

当然,自0.2版以来,``birdy``完全支持流式API。对流式处理API的访问是由一个特殊的
``streamclient``提供的。

``streamclient``不能用于获取访问令牌,但是您可以
使用`userclient``来获取它们。


要使用流式处理API,首先导入客户端并初始化它。

代码::python

from birdy.twitter import streamclient
client=streamclient(使用者密钥,
使用者密钥,
访问令牌,
access_token_secret)

访问**公共**流上的资源,例如**post
状态/筛选器**(`twitter
docs<;https://dev.twitter.com/docs/api/1.1/post/statuses/filter>;`\br/>
。代码::python

resource=client.stream.statuses.filter.post(track='twitter')

对于**用户**流资源**获取用户**(`twitter
docs<;https://dev.twitter.com/docs/api/1.1/get/user>;`\uu)

……代码::python

resource=client.user stream.user.get()

代码::python



访问您在"resource.stream()`
上迭代的流中的数据,就像这样

代码::python

resource.stream()中的数据:
print data

如何获取访问令牌?
-----------------------------

``birdy``通过分别提供两个不同的客户端,即"userclient"和"appclient",同时支持**oauth1**和**oauth2**身份验证
虽然对API资源的请求(如上述示例中的请求)在两个客户端中都是相同的,但获取
访问令牌的工作流略有不同。

在开始之前,您需要使用
注册您的应用程序Twitter,获取应用程序的"使用者密钥"和
``使用者秘密`。

实例
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

代码::python

from birdy.twitter import userclient

consumer\u secret='你的应用程序用户密钥'
callback\u url='https://127.0.0.1:8000/callback'

client=userclient(用户密钥,消费者秘密)

第2步:获取请求令牌和授权url
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^桌面和移动应用程序**不需要它。

如果您正在构建一个用twitter*类型的应用程序登录,就这样完成了。代码::python

token=client.get_signin_token(回调URL)


代码::python

token=client.get_authorize_token(callback_url)

save``token.oauth_token``和``token.oauth_token_secret``供以后的
用户使用,因为这不是最终的令牌和机密。

代码::python

access_token=token.oauth_token
access_token_secret=token.oauth_token_secret


将用户定向到从
``token.auth_url``获得的twitter授权url。

第3步:oauth verify
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

桌面或移动应用程序"oauth验证器"是pin
代码,您可以跳过有关提取的部分。

需要从url中提取"oauth验证器"。大多数web
框架都提供了一种简单的方法,或者您可以使用"url parse"模块(如果是您自己的话)解析url
django和flask示例:

。代码::python

django
oauth_verifier=request.get['oauth_verifier']

flash
oauth_verifier=request.args.get('oauth_verifier')

为此,您需要创建一个新的"userclient"实例,这次还要传入"access"token和"access"token secretn*第2步*然后获取
标记。

…代码::python

client=userclient(consumer_key,consumer_secret,
访问令牌,access_token_secret)

token=client.get_access_token(oauth_verifier)

现在您有了最终的访问令牌和机密,可以将
``token.oauth_token``和``token.oauth_token_secret``保存到数据库中以备以后使用,也可以使用客户机立即开始发出api请求。例如,您可以检索用户的主时间线,如
this.

…代码::python

response=client.api.statuses.home_timeline.get()
response.data

已检索到
令牌,现在可以代表它们进行API调用。

步骤1-创建-a-客户端-实例-1:

步骤1:创建客户端实例
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
因此,首先需要
导入它并使用应用程序的"消费者密钥"和"消费者秘密"创建一个实例。代码::python

消费者秘密)

第2步:获取访问令牌
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

oauth2工作流比oauth1简单得多,要获得访问令牌,只需这样做。

。代码::python

access_token=client.get_access_token()


就是这样,您可以立即开始使用客户端代表应用程序发出api
请求。建议您保存
``访问令牌``以备以后使用。你用这样一个保存的
令牌初始化客户端。代码::python

client=appclient(使用者密钥、使用者秘密、已保存的访问令牌)


请记住,OAuth2身份验证请求是**只读的**,并且
并非所有的API资源都可用。查看"twitter
docs<;https://dev.twitter.com/docs/api/1.1>;``了解更多信息。


——让我们来看看一些
好东西。

立即开始使用数据。


jsonobject
~~~~~~~~~~~~~~

>解码json数据时,``objects``被转换为``jsonobject`,而不是普通的python
字典,它是dictionary子类
,除了常规字典查找
样式之外,还具有属性样式访问,以方便使用。以下代码产生相同的结果

…代码::python

followers\u count=response.data['followers\u count']



~~~~~~~~~~~

rest api资源的调用返回一个"apireponse"`,此外,
返回的数据,还允许您访问响应头(对于
检查速率限制很有用)和资源URL。

…代码::调用时返回python

response.resource\url\resource url
response.headers\dictionary,其中包含响应http headers

~~~~~~~~~~~~

``streamresponse``streaming api resources and
提供**stream()**方法,该方法返回用于接收json解码流数据的迭代器。像`` APIResponse``它还允许
访问响应头和资源URL。

…代码::python

response.stream();用于对响应中的数据在流上进行迭代的生成器方法。stream():
print data


>信息异常
~~~~~~~~~~~~~~~~~~~~~~~

基的
``birdyexception``(从未直接引发)。

-``twitterclienterror``为连接和访问令牌引发
检索错误
-``twitterapierror``在twitter返回错误时引发
-``twitterautherror``在身份验证失败时引发,
``twitterapierror``子类
-``twitterratelimiterror``在达到资源的速率限制
时升高,`` twitterapierror``子类

`` twitterapierror``和`` twitterclienterror``实例(exepct用于
访问令牌检索错误)提供了信息性错误描述
,其中包括所用的资源url和请求方法(当
跟踪日志中的错误时非常方便)。还提供以下服务:

…代码::python

exception.request嫒method嫒http方法,用于发出请求(get或post)
exception.resource嫒url嫒调用的api资源的url
exception.status嫒code嫒twitter返回的http状态代码
exception.error嫒code嫒errortwitter返回的代码
exception.headers包含响应http headers的字典

如果您想改变
的工作方式,你所要做的就是对其中一个客户机进行子类划分,然后覆盖一些方法,你就可以去了。

`` json object``您必须
重写**get_json_object_hook()**方法。

…代码::python

from birdy.twitter import userclient


class myclient(userclient):
@staticmethod
def get_json_object_hook(data):
return data

response=client.api.users.show.get(screen廑name='twitter')


,或者,如果您希望对常见错误进行全局错误处理,可以使用
覆盖**handle廑response()**方法。

代码::python

class myclient(userclient):
def handle_response(self,method,response):
尝试:
response=super(myclient,self)。handle_response(method,response)
除了twitterapierror,e:

#您的错误处理代码

返回响应

要配置它,可以重写
**configure_auth_session()**方法。

…代码::python

myclient类(userclient):
def configure_oauth_会话(self,session):
session=super(myclient,self).configure_auth_session(session)
session.proxies={'http':'foo.bar:3128'}
return session


-----------------------------

**是的**,欢迎贡献(包括反馈)和功能请求
,在这两种情况下,正确的方法是首先在
`github<;https://github.com/inueni/birdy/issues>;上打开一个问题,如果
在那里。

好吧。

credits
----

``birdy``如果不是因为优秀的
`requests<;http://www.python-requests.org>;``和
`requests oauthlib<;https://requests oauthlib.readthedocs.org/en/latest/>;``库和出色的'python<;就不存在了;http://www.python.org>;`
编程语言。


问题、评论,…
----


如果您需要联系我,可以在twitter上找到我
([@sect2k](https://twitter.com/sect2k/)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
图像处理Java 8 ImageIO在Linux中无法正确读取JPEG   spring如何用Java 1.4兼容版本替换@Resource注释   java Http请求参数类型传播   在web浏览器中看不到Java Maven Tomcatplugin web应用程序   jvm在Java中使用直接内存的目的是什么?   如何从列表转换为字符串java   java setAdapter gridview发送上下文   SwingJava。方法上的lang.NullPointerException   java什么是shell脚本、makefile和ant文件   当使用getGraphics()方法时,java JPanel图形会闪烁   java如何将迭代转换为递归?   java为什么我的抽屉菜单在同一个XML上有ConstraintLayout时没有响应?   java如何在图像上画一个圆?   Android studio:Rabbitmq:Error:java。lang.ClassNotFoundException:类io。千分尺。果心仪器找不到仪表注册表