scala使用log4j_在Scala中使用twitter4j访问流推文

scala使用log4j

介绍

我的上一篇文章提供了从命令行使用Twitter流API的演练但是使用API​​可以更灵活地获取和处理推文,并使用您选择的编程语言访问Twitter的API。 在本教程中,我将逐步介绍基本的设置以及Scala的twitter4j库的一些简单用法。 我在这里展示的很多内容对于使用其他JVM语言(例如Clojure和Java)的用户应该是有用的。 如果您没有看过上一教程,请继续阅读,因为本教程涵盖了许多相同的材料,但是使用的是twitter4j而不是HTTP请求。

我将逐步介绍一些代码,用于以不同的方式访问Twitter数据。 如果您不知道应该去哪里,可以在此github gist中找到运行命令所需的所有代码,因此可以在学习本教程时与之进行比较。

设定

在这样的教程上下文中使用twitter4j库的一种简单方法是让读者建立一个新的SBT项目,将其声明为依赖项,然后在SBT中编译并运行代码。 (有关另一个示例,请参阅我的有关使用Jerkson使用Scala处理JSON的教程 。)这将整理获取外部库并设置类路径以使其可用的过程。 请按照本节中的说明进行操作。

$ mkdir ~/twitter4j-tutorial
$ cd ~/twitter4j-tutorial/
$ wget http://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.12.2/sbt-launch.jar

现在,将以下内容另存为文件〜/ twitter4j-tutorial / build.sbt。 请注意,在每个声明之间保持空行很重要。

name := 'twitter4j-tutorial'

version := '0.1.0 '

scalaVersion := '2.10.0'

libraryDependencies += 'org.twitter4j' % 'twitter4j-stream' % '3.0.3'

然后将以下内容另存为文件〜/ twitter4j-tutorial / build

java -Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=384M -jar `dirname $0`/sbt-launch.jar '$@'

使该文件可执行并运行,它将显示SBT进行了大量工作,然后让您看到SBT提示。 在SBT提示符下,调用update命令。

$ cd ~/twitter4j-tutorial
$ chmod a+x build
$ ./build
[info] Set current project to twitter4j-tutorial (in build file:/Users/jbaldrid/twitter4j-tutorial/)
> update
[info] Updating {file:/Users/jbaldrid/twitter4j-tutorial/}default-570731...
[info] Resolving org.twitter4j#twitter4j-core;3.0.3 ...
[info] Done updating.
[success] Total time: 1 s, completed Feb 8, 2013 12:55:41 PM

要测试您现在是否可以访问twitter4j,请转至SBT控制台,并从主twitter4j包中导入类。

> console
[info] Starting scala interpreter...
[info]
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_37).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import twitter4j._
import twitter4j._

如果没有其他输出,则一切就绪(使用CTRL-D退出控制台)。 如果事情不对劲(或者如果您在默认的Scala REPL中运行),则会看到类似以下内容。

scala> import twitter4j._
<console>:7: error: not found: value twitter4j
import twitter4j._
^

如果是这样,请尝试再次按照上述说明进行操作,以确保您的设置与上面的设置完全相同(检查版本等)。 如果您只想看一些使用twitter4j作为API的示例,并且乐于将其jars手动添加到类路径中,或者使用像Eclipse这样的IDE,那么就不必进行SBT设置-继续阅读并修改示例有必要的。

编写,编译和运行简单的main方法

为了为在本教程中运行程序奠定基础,让我们创建一个简单的main方法并确保它可以在SBT中运行。 请执行下列操作:

$ mkdir -p ~/twitter4j-tutorial/src/main/scala/

接下来,将以下代码另存为〜/ twitter4j-tutorial / src / main / scala / TwitterStream.scala

package bcomposes.twitter

object StatusStreamer {
  def main(args: Array[String]) {
    println('hi')
  }
}

接下来,在twitter4j-tutorial项目的SBT提示符下,使用run-main命令,如下所示。

> run-main bcomposes.twitter.StatusStreamer
[info] Compiling 1 Scala source to /Users/jbaldrid/twitter4j-tutorial/target/scala-2.10/classes...
[info] Running bcomposes.twitter.StatusStreamer
hi
[success] Total time: 2 s, completed Feb 8, 2013 1:36:32 PM

SBT编译代码,然后运行它。 这是一种使用所有可用依赖项运行代码的简便方法,而不必担心显式处理类路径。 在下面的内容中,我们将充实该主要方法,以便执行更多有趣的工作。

设置授权

使用Twitter流API通过HTTP请求访问推文时,必须提供Twitter用户名和密码。 要使用twitter4j,还必须提供身份验证详细信息。 但是,为此,您需要设置OAuth身份验证。 这很简单:

  1. 转到https://dev.twitter.com/apps并单击显示“创建新应用程序”的按钮(当然,您需要使用Twitter用户名和密码登录)
  2. 填写名称,说明和网站字段。 不必对此太担心:在名称和描述中输入您喜欢的任何内容(例如“我的示例应用程序”和“我的教程应用程序”)。 对于网站,如果没有更好的用法,请提供您的Twitter帐户的URL。
  3. 您的应用程序将出现一个新屏幕。 单击底部的“创建我的访问令牌”按钮。
  4. 单击“ OAuth工具”选项卡,您将看到四个必需的身份验证字段,才能使用twitter4j从Twitter访问推文和其他信息:消费者密钥,消费者密钥,访问令牌和访问令牌密钥。

根据这些授权详细信息,您现在需要创建一个twitter4j.conf.Configuration对象,该对象将允许twitter4j代表您访问Twitter API。 这可以通过许多不同的方式来完成,包括环境变量,属性文件和代码。 为了使本教程尽可能简单,我们将使用后一个选项。

StatusStreamer的定义之后添加以下对象,提供您的详细信息,而不是下面给出的描述。

object Util {
  val config = new twitter4j.conf.ConfigurationBuilder()
    .setOAuthConsumerKey('[your consumer key here]')
    .setOAuthConsumerSecret('[your consumer secret here]')
    .setOAuthAccessToken('[your access token here]')
    .setOAuthAccessTokenSecret('[your access token secret here]')
    .build
}

当然,您应该注意不要让您的详细信息被其他人知道,因此请确保此代码保留在您的计算机上。 当您开始进行实际开发时,将使用其他方式将授权信息注入到您的应用程序中。

从样本流中提取推文

在上一教程中,最基本的访问方式是从https://stream.twitter.com/1/statuses/sample.json获取随机的tweet示例,因此让我们使用twitter4j进行相同的操作。

为此,我们将创建一个TwitterStream实例,该实例为我们提供到Twitter API的授权连接。 要查看与TwitterStream类关联的所有方法,请参阅TwitterStream 的API文档 。 TwitterStream实例能够获取推文(和其他信息),然后将其提供给已向其注册的所有侦听器。 因此,为了对这些推文做一些有用的事情,您需要实现StatusListener接口并将其连接到TwitterStream。

在显示用于创建和使用流的代码之前,让我们创建一个StatusListener,它将基于传入的推文执行一个简单的操作。将以下代码添加到之前创建的Util对象中。

def simpleStatusListener = new StatusListener() {
  def onStatus(status: Status) { println(status.getText) }
  def onDeletionNotice(statusDeletionNotice: StatusDeletionNotice) {}
  def onTrackLimitationNotice(numberOfLimitedStatuses: Int) {}
  def onException(ex: Exception) { ex.printStackTrace }
  def onScrubGeo(arg0: Long, arg1: Long) {}
  def onStallWarning(warning: StallWarning) {}
}

此方法创建实现StatusListener的对象(尽管它仅对onStatus方法有用,否则将忽略发送给它的所有其他事件)。 显然,要做的是获取一个Twitter状态(这是与tweet相关的所有信息,包括作者,retweet,地理坐标等)并输出状态文本,即我们通常想到的状态作为“ tweet”。

以下代码将所有内容组合在一起。 我们使用TwitterStreamFactory和配置创建一个TwitterStream对象,向该流中添加一个simpleStatusListener ,然后调用TwitterStream的示例方法以开始接收推文。 如果那是程序的最后一行,它将继续接收推文,直到该进程被杀死。 在这里,我添加了2秒钟的睡眠,以便我们可以看到一些推文,然后清理连接并干净地关闭它。 (我们可以让它无限期地运行,但是要终止该进程,我们将需要使用CTRL-C,它将不仅终止该进程,而且终止正在运行SBT的进程。)

object StatusStreamer {
  def main(args: Array[String]) {
    val twitterStream = new TwitterStreamFactory(Util.config).getInstance
    twitterStream.addListener(Util.simpleStatusListener)
    twitterStream.sample
    Thread.sleep(2000)
    twitterStream.cleanUp
    twitterStream.shutdown
  }
}

要运行此代码,只需像以前一样在SBT中放入相同的run-main命令。

> run-main bcomposes.twitter.StatusStreamer

您应该看到推文流过几秒钟,然后您将返回到SBT提示符。

拉动具有特定属性的推文

与HTTP流一样,使用twitter4j来跟踪一组特定的用户,特定的搜索词或在特定地理区域内产生的推文也很容易。 所需要做的就是创建适当的FilterQuery对象,然后使用TwitterStream的filter方法而不是sample方法。

FilterQuery具有多个构造函数,其中一个构造函数允许提供一个Long值数组,每个构造函数都是要在流之后跟随的Twitter用户的ID。 (请参阅上一教程,以了解一种基于用户名获取用户ID的简便方法。)

object FollowIdsStreamer {
  def main(args: Array[String]) {
    val twitterStream = new TwitterStreamFactory(Util.config).getInstance
    twitterStream.addListener(Util.simpleStatusListener)
    twitterStream.filter(new FilterQuery(Array(1344951,5988062,807095,3108351)))
    Thread.sleep(10000)
    twitterStream.cleanUp
    twitterStream.shutdown
  }
}

这些是《连线》杂志(@wired),《经济学人》(@theeconomist),《纽约时报》(@nytimes)和《华尔街日报》(@wsj)的ID。 将代码添加到TwitterStream.scala ,然后在SBT中运行它。 请注意,我已经使程序Hibernate了10秒钟,以便有更多时间发送推文(因为这只是四个帐户,并且活动会有所不同)。 如果看不到任何东西,请增加睡眠时间。

> run-main bcomposes.twitter.FollowIdsStreamer

要跟踪包含特定术语的推文,请使用默认构造函数创建一个FilterQuery,然后使用包含您感兴趣的查询术语的字符串数组调用track方法。下面的对象执行此操作,并使用args Array作为容器查询条件。

object SearchStreamer {
  def main(args: Array[String]) {
    val twitterStream = new TwitterStreamFactory(Util.config).getInstance
    twitterStream.addListener(Util.simpleStatusListener)
    twitterStream.filter(new FilterQuery().track(args))
    Thread.sleep(10000)
    twitterStream.cleanUp
    twitterStream.shutdown
  }
}

通过这种方式进行设置,您可以通过在命令行中指定任意查询来跟踪任意查询。

> run-main bcomposes.twitter.SearchStreamer scala
> run-main bcomposes.twitter.SearchStreamer scala python java
> run-main bcomposes.twitter.SearchStreamer 'sentiment analysis' 'machine learning' 'text analytics'

如果搜索词不是很常见,则需要增加睡眠时间。

要按位置进行过滤,请再次使用默认的构造函数创建一个FilterQuery,然后使用带有Array [Array [Double]]参数的locations方法-基本上是一个由两个元素组成的数组,每个数组都包含纬度和经度边界框的一角。 这是一个为Austin创建边界框并使用它的示例。

object AustinStreamer {
  def main(args: Array[String]) {
    val twitterStream = new TwitterStreamFactory(Util.config).getInstance
    twitterStream.addListener(Util.simpleStatusListener)
    val austinBox = Array(Array(-97.8,30.25),Array(-97.65,30.35))
    twitterStream.filter(new FilterQuery().locations(austinBox))
    Thread.sleep(10000)
    twitterStream.cleanUp
    twitterStream.shutdown
  }
}

为了使事情变得更加灵活,我们可以在命令行上获取边界框信息,将字符串转换为Doubles并将它们配对。

object LocationStreamer {
  def main(args: Array[String]) {
    val boundingBoxes = args.map(_.toDouble).grouped(2).toArray
    val twitterStream = new TwitterStreamFactory(Util.config).getInstance
    twitterStream.addListener(Util.simpleStatusListener)
    twitterStream.filter(new FilterQuery().locations(boundingBoxes))
    Thread.sleep(10000)
    twitterStream.cleanUp
    twitterStream.shutdown
  }
}

我们可以使用多个边界框来调用LocationStreamer ,例如,对于奥斯丁,旧金山和纽约市,如下所示。

> run-main bcomposes.twitter.LocationStreamer -97.8 30.25 -97.65 30.35 -122.75 36.8 -121.75 37.8 -74 40 -73 41

结论

这显示了如何将Twitter4j与Scala一起用于流式传输的开始。 它还支持以编程方式访问任何Twitter用户可以执行的操作,包括发布消息,转发,关注等等。 我将在以后的教程中介绍。 同样,使用twitter4j的一些示例将很快在tshrldu项目中显示。

参考: 在Scala中使用twitter4j和Scala访问来自Bcomposes博客的JCG合作伙伴 Jason Baldridge的 流式推文

翻译自: https://www.javacodegeeks.com/2013/02/using-twitter4j-with-scala-to-access-streaming-tweets.html

scala使用log4j

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值