01-Twitter Streaming API的调用 | 02.数据获取

简介:

01-Twitter Streaming API的调用

郑昀 201006 隶属于《实时分析搜索引擎/02.数据获取》小节

修改历史:

1 2010年10月修正,因为Twitter要求必须走OAuth接口。

 

Twitter 提供了两种 Streaming 接口,让第三方可以省却轮询,由 Twitter 主动把合适的数据推送过来,近乎实时。

1、chirpstream api

接口地址是:http://chirpstream.twitter.com/2b/user.json [需FQ]

这个接口只是把你和你的好友以及各种与你有关的消息都推送过来。

参考此文《Tutorial: consuming Twitter's real-time stream API in Python 》,也可以从http://pastebin.com/U4m1Zsvs 这里复制此文源代码。

你需要维持一个 Socket 长连接。

你还需要通过 Twitter 的 OAuth 验证。

你将会得到一个 Twitter 用户登录后所应该看到的各种消息流。

我们检测单次数据包的最后是否以 \r\n 结尾:

if data.endswith("\r\n") and self.buffer.strip():

以此来判断检测一个完整的 JSON object 。

程序需要处理的几种常用消息:

  • friends : 登陆用户都有哪些好友,即 my followings;这是一个id数组,每一个 id 代表一个用户,此 id 并非用户的 screenname ,而是 Twitter 用户的唯一数字标识。你可以通过持续积累 tweets 消息中的 user id ,从而获知自己的 friends id 数组中每一个 id 对应是谁。
  • event 之 retweet : 其他用户使用官方格式的 retweet 转发的消息;
  • event 之 favorite : 其他用户使用官方格式的 favorite 按钮收藏的消息;
  • event 之 follow : 其他用户关注了本登陆用户;
  • tweet : 普通的消息。从 in_reply_to_user_id 字段可获知是回复给谁的消息。

friends 消息数据示范如下:

{u'friends': [80831118, 750713, 1580781,]}


event 共有以下类型:

  • follow
  • direct_message
  • retweet
  • favorite
  • unfavorite
  • delete

event 之 消息数据示范如下:

{u'source': {u'id': 1490631, u'location': u'30.209214,120.198216',u'screen_name': u'Fenng'}, u'created_at': u'Sun Jun 20 08:46:09 +0000 2010', u'target': {u'id': 31347758, u'screen_name': u'minzhou',u'name': u'Min Zhou'u'following': True}, u'event': u'follow' }(已略去大量无关字段)即 Json 中用 u'event': u'follow' 来指明本消息是什么类型的 event 消息。

tweet 消息数据示范如下:

{u'text': u'@cnkang \u5176\u5b9e\u6211\u5bf9\u627e\u5927\u8d28\u6570\u66f4\u6709\u5174\u8da3\u2
026\u2026', u'created_at': u'Sun Jun 20 08:43:36 +0000 2010', u'coordinates': None, u'source': u'<a href="http://echofon.com/" rel="nofollow">Echofon</a>', u'in_reply_to_status_id': None, u'in_reply_to_screen_name': u'cnkang', u'in_reply_to
_user_id': 35457544, u'place': None, u'geo': None, u'id': 16604579153L, u'user': {u'id': 6132042, u'screen_name': u'delphij', u'following': None}}(已略去大量无关字段)这是一个 Reply 消息。一般 Twitter 客户端软件都是根据此消息体内的“in_reply_to_user_id ”字段判断被回复者的id 是不是自己的id,或者在不在自己的 friends id 数组里,如果都不是,就可以忽略此 Reply 消息。

2、streaming api

Twitter 的这个接口能够让第三方近乎实时地获取公开数据的各种子集:

『The Twitter Streaming API allows near-realtime access to various subsets of Twitter public statuses.』

接口地址:http://dev.twitter.com/pages/streaming_api ,需FQ。

2.1.权限问题

以 Streaming 方式连接 stream.twitter.com ,需要先通过 Twitter OAuth验证。

目前默认访问者只能使用 filter 这一个方法。

其他的 firehose 、retweet 、links 等方法则必须拥有访问权限,否则会得到如下提示:

Error 403 User not in required role

如果想申请特别权限,可以写信给 api@twitter.com ,说明原因。

2.2.判断 Json Object 结尾

由于是长连接,所以判断一个完整的 Json Object ,需要某个特殊标志。这还需要请求参数的配合。

Streaming API 的 filter 方法有一个输入参数:delimited。

它的含义『Indicates that statuses should be delimited in the stream. Statuses are represented by a length, in bytes, a newline, and the status text that is exactly length bytes. Note that "keep-alive" newlines may be inserted before each length.』

所以我们指定它的值是 newline ,这样 Json Object 之间就以 \r\n 作为分隔符。

文档上称 『 every object is returned on its own line, and ends with a carriage return. 
Newline characters (\n) may occur in object elements (the text element of a status object, for example), 
but carriage returns (\r) should not.』也就是说,\n 会出现在 Json Object 包体内,但 \r 则不会。
所以,我们检测单次数据包的最后是否以 \r\n 结尾:

if data.endswith("\r\n") and self.buffer.strip():

以此来判断检测 JSON object 的结尾。

2.3.Streaming API无法处理『Non-space delimited languages』

Twitter 的 John Kalucki 曾经这样回答:

We break the status text into tokens by whitespace and punctuation, then
apply the tokens to a hashmap of tracked terms. If the language doesn't have
whitespace, the only thing that will match is the entire Tweet.

即 Streaming API 目前还不能支持阿拉伯语、汉语、日语等『Non-space delimited languages』,原因是他们只能根据空格和标点把tweet打散成一个一个token。

http://apiwiki.twitter.com/User-Stream-Implementation-Suggestions 也有一句话提示:
『Non-space delimited languages are currently unsupported by track. For example: Arabic, Chinese, and Japanese language queries will not return results.』

2.4.track 参数的输入

先不理会他们能不能处理亚洲文字的追踪。

我们用

track = ["的","我","了","#duanzi","@rtmeme","@zhengyun"]

这么一个数组定义所要追踪的 keywords ,词与词是 Or(或) 的关系。注意,参考我的“玩聚网技术Wiki\01.数据抓取”之《06-HTTP请求中的编码问题》,必须对track里的中文字符的 UTF-8 编码字符串做转义:

trackKeywords = map(lambda s: unicode(s, 'gbk', 'ignore').encode('UTF-8', 'ignore'),track)

一旦一条新 tweet 发布,正文提及了 track 数组中的某一个词,这条消息就会被主动推送过来。它的 Json 格式与 chirpstream api 之 tweet 格式一样。

2.5.locations 参数的输入

filter 方法支持用发布者的地理位置过滤,比如 locations 参数为

[-74,40,-73,41]

就可以把从 New York 发布的 tweets 都推送过来。这也要求用户的 tweet 用 Geotagging API 发布,否则无法确定发布者的地理信息。默认用户设置中“Add a location to your tweets”这个选项是选中的。

-74,40的含义是,经度-74,维度40.

第一对经纬度应该是目标区域的SW(西南角)的位置信息。

-74,40和-73,41选中的区域叫做 bounding box  ,这个区域很小,经度维度之间不能相差一度。如果区域过大,会得到如下提示:

Location track must be less than 1 degrees on a side 。

你选中的目标区域,它的经纬度信息可从:http://www.getlatlon.com/ 得到。

注:中国大陆用户很多都是从代理上的 Twitter ,所以它的 geo 信息可能是代理的。

 

 

2.6.Twitter Annotations的追踪

Twitter Streaming API将支持Twitter Annotations:你可以track一个注释类型,比如你可以近乎实时地得到所有标注了“movie”注释类型的 tweets ;你还可以track一个注释类型和值。

背景知识:什么是Twitter Annotations. 背景PPT:[slideshare]Twitter API Annotations .

目录
相关文章
|
12天前
|
API 网络安全
发送UDP数据免费API接口教程
此API用于向指定主机发送UDP数据,支持POST或GET请求。需提供用户ID、密钥、接收IP及端口、数据内容等参数。返回状态码和信息提示。示例中含公共ID与KEY,建议使用个人凭证以提高调用频率。
37 13
|
12天前
|
网络协议 API 网络安全
发送TCP数据免费API接口教程
此API用于向指定主机发送TCP数据,支持POST/GET请求,需提供用户ID、KEY、接收IP、端口及数据内容。返回状态码和信息提示,示例如下:{&quot;code&quot;:200,&quot;msg&quot;:&quot;发送成功!&quot;}。详情见:https://www.apihz.cn/api/datacstcp.html
31 11
|
1月前
|
人工智能 关系型数据库 MySQL
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
本文通过一个利用百炼大模型平台和Dataphin数据服务API构建一个客户360智能应用的案例,介绍如何使用Dataphin数据服务API在百炼平台创建一个自定义插件,用于智能应用的开发,提升企业智能化应用水平。
120 3
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
|
13天前
|
API 数据安全/隐私保护 开发者
实时获取小红书详情 API 数据
小红书详情API数据获取指南:注册开发者账号,创建应用并申请接口权限,构建请求获取笔记详情,使用Python等语言处理响应数据。需遵守使用规则,注意调用频率和数据安全。
|
27天前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
1月前
|
SQL 缓存 API
在API接口数据获取过程中,如何确保数据的安全性和隐私性?
在API接口数据获取过程中,确保数据的安全性和隐私性至关重要。本文介绍了身份认证与授权、防止SQL注入和XSS攻击、加密传输、API版本控制、限流与熔断、压力测试与性能优化、备份与恢复以及法律和伦理考量等关键措施,帮助开发者和管理者有效保护API接口的数据安全和隐私性。
|
1月前
|
前端开发 JavaScript API
探索GraphQL:如何构建高效的数据API
【10月更文挑战第25天】在现代Web开发中,API的效率和灵活性至关重要。本文探讨了如何利用GraphQL构建高效的数据API。GraphQL通过声明式查询方式,允许客户端精确指定所需数据,减少数据传输量,提高API效率。文章介绍了设置GraphQL服务器、设计API Schema、实现解析函数及调整前后端交互的具体步骤,展示了GraphQL的优势和应用场景。
40 2
|
28天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
1月前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
1月前
|
存储 监控 安全
API接口数据获取全流程用户指南
本文介绍了从明确需求到数据存储与管理的API接口数据获取全流程。首先,明确业务需求和选择合适的数据源;接着,准备API接口,包括审查文档、申请密钥和安全存储;然后,构建与发送请求,处理响应与数据;最后,进行数据存储与管理,并持续监控与优化,确保数据的安全与合规。通过这些步骤,用户可以高效地获取和管理数据,为数据分析和业务优化提供支持。