在Twitter Feed中搜索Alexa技能

时间:2017-08-22 06:47:07

标签: twitter oauth alexa-skills-kit alexa-skill alexa-voice-service

我正在研究一种相当基本的Alexa技能,实质上,它通过特定的Twitter搜索来搜索主题标签,解析推文并将其读回。 从Twitter Feed中提取数据的最简单方法是什么?我一直在使用Twitter API(见下文)和scraping data from Twitter appears to be against the TOS.

时遇到问题
  

...如果按照robots.txt文件的规定进行,则允许抓取服务,但是,未经Twitter事先同意,明确禁止抓取服务。

撰写Alexa技能

  1. Follow a tutorial.

    足够简单。使用漂亮的接口添加调用,一些意图和带有我想要的数据的插槽类型。

  2. 编写AWS Lambda函数来处理所有内容。

    Python因为我比JavaScript更了解它。选择one of the Python wrappers for the Twitter API,然后意识到因为Twitter,他们所有的API都需要身份验证 - 甚至是基本搜索。

  3. Register an app with Twitter所以我有钥匙和钥匙。

  4. 在应用程序中实现明文中的身份验证密钥和令牌是一个坏主意,并决定为Alexa确定帐户链接。

  5. Try following the one tutorial aroundtwice遇到问题并转到StackExchange。

    为什么需要外部网络应用程序?

      

    ...我们需要自己的OAuth实现才能使集成正常工作

    What's wrong with the one provided by Twitter?为什么在Lambda方法中无法解决任何问题,因为除非AFAIK触及帐户集成?是不是通过URL传递令牌也是一个坏主意?他们的示例代码似乎也要求消费者密钥也是硬编码的。

      

    输入:“https://alexa-twitter-airport-info.herokuapp.com/oauth/request_token?vendor_id=XXXXXX&consumer_key=YYYYYY&consumer_secret=ZZZZZZ”。

    至少,他们的网络应用程序暂时似乎已经停止了,而且选择一个不需要付钱来托管另一个副本的选项很不错。

    < / LI>

    I've seen this post讨论了Node.js OAuth实现,但这种实现的必要性仍然让我感到厌烦。

1 个答案:

答案 0 :(得分:0)

我发现twitter Node包很有用。为了我的目的,我使用了搜索/推文GET API,如下所示。但是,您可以使用各种AP​​I来处理推文。下面的代码仅显示从Node JS中访问Twitter API所需的部分。

var Twitter = require('twitter');
var client = new Twitter({
      // I added the keys as AWS Environment variables
      consumer_key: process.env.consumer_key,
      consumer_secret: process.env.consumer_secret,
      access_token_key: process.env.access_token_key,
      access_token_secret: process.env.access_token_secret
    });

    client.get('search/tweets', {q: <<your search query>>,count:<<if you want to receive specific number of tweets>>}, function(error, tweets, response) {
          var noOfTweets = tweets.statuses.length;
           if(error) {
               speechOutput = "I could not find tweets for <<your reason>>"
               self.emit(':tell', speechOutput);
           } else if(noOfTweets === 0) {
               speechOutput = "another speech output";
               self.emit(':tell', speechOutput);
           } else {
               tweets.statuses.forEach(function(tweet) {
                   //process the tweet the way you want to.
               });
           }
    });