Beliebigen RSS-Feed vorlesen

Hier wird über die Entwicklung von Skills diskutiert.
Antworten
Benutzeravatar

Themenstarter
Semenchkare
Beiträge: 63
Registriert: Fr 10. Mär 2017, 22:24
Vorhandene Echos: 3
Vorhandene Echo Dots: 4

Sa 11. Mär 2017, 13:18

Hallo,
ich arbeite mich seit einigen Tagen durchs Internet.
Ich suche einen Skill, mit dem ich RSS-Feeds vorlesen lassen kann.
Damit könnte ich z.B. Lokale Nachrichten anhören.
Beispiel: News Ortenau

wie ich bisher recherchierte, gibt es hierfür noch keinen offiziellen Skill. Auch keine generelle RSS-Lese-Skills.
In der US-Version gibt es wohl einen Skill namens "Flash Briefing Skill API", der funktioniert bei uns nicht. Außerdem sind die Lesezyklen bei max. 1x stündlich, ich bräuchte alle 15 Minuten.

Folgende Quellen habe ich schon gelesen & nachgebaut etc.

-https://github.com/alirawashdeh/rss-reader-alexa (eigentliche Quelle)
-faehigkeiten-skills-entwickeln-f8/skill ... t1025.html
(letzterer ändert die rss-version in lesen von Textfiles um. Der Thread hilft dort habe ich auch eine Datei zum bearbeiten gefzbdeb
(https://dl.dropboxusercontent.com/u/588 ... odules.zip) um dort einige Files zu bearbeiten und dann Auf den AWS hochzuladen.
-es gibt auch noch im obigen Thread einen Hinweis auf Heise-RSS Reader. der baut aber darauf auf, dass man einen eigenen ssl-Server inklusive Proxy verwendet. das finde ich doch etwas zu überkandidelt...

Nun mein Aufbau:
Im AWS habe ich
1) den veränderten Zip-File (index.js wie folgt geändert

Code: Alles auswählen

/**
* App ID for the skill
*/
var APP_ID = "amzn1.ask.skill.dastehtmeinerichtigeNrdrin";

var AlexaSkill = require('./AlexaSkill');
var parser = require('rss-parser');

var RssReader = function () {
  AlexaSkill.call(this, APP_ID);
};

// Extend AlexaSkill
RssReader.prototype = Object.create(AlexaSkill.prototype);
RssReader.prototype.constructor = RssReader;

RssReader.prototype.eventHandlers.onSessionStarted = function (sessionStartedRequest, session) {
  console.log("RssReader onSessionStarted requestId: " + sessionStartedRequest.requestId
  + ", sessionId: " + session.sessionId);
  // any initialization logic goes here
};

RssReader.prototype.eventHandlers.onLaunch = function (launchRequest, session, response) {
  console.log("RssReader onLaunch requestId: " + launchRequest.requestId + ", sessionId: " + session.sessionId);
  var speechOutput = "Willkommen, welche Feeds willst du?";
  var repromptText = "Welche Feeds willst du?";
  response.ask(speechOutput, repromptText);
};

RssReader.prototype.eventHandlers.onSessionEnded = function (sessionEndedRequest, session) {
  console.log("RssReader onSessionEnded requestId: " + sessionEndedRequest.requestId
  + ", sessionId: " + session.sessionId);
  // any cleanup logic goes here
};

RssReader.prototype.intentHandlers = {
  // register custom intent handlers
  "GetBBCNews": function (intent, session, response) {
    var url;
    if(intent.slots && intent.slots.FeedName)
    {
      switch (intent.slots.FeedName.value.toLowerCase()) {
        case "Blitzer":
        url = "http://www.hitradio-ohr.de/ortenauticker";
        break;
        case "Verkehr":
        url = "http://www.hitradio-ohr.de/ortenauticker";
        break;

        default:
        response.tellWithCard("Unable to understand that request" + intent.slots.FeedName.value, "RSS Headlines", "Couldn't understand the request" + intent.slots.FeedName.value);
        return;
      }
    }
    else
    {
      response.tellWithCard("Unable to understand that request", "RSS Headlines", "Couldn't understand the request");
      return;
    }

    parser.parseURL(url, function(err,parsed){

      var output = "" + parsed.feed.title + ". <break time=\"0.8s\"/> ";

      var i = 0;
      parsed.feed.entries.forEach(function(entry){
        if(i <= 4)
        {
          console.log(entry.title);
          output = output + entry.title + ". <break time=\"0.6s\"/> "
          i++;
        }
      })

      var ssmlOutput = {
        speech: '<speak>' + output + '</speak>',
        type: AlexaSkill.speechOutputType.SSML
      };

      response.tellWithCard(ssmlOutput, "RSS Headlines", "Reading headlines from: " + parsed.feed.title);
    });

  },
  "AMAZON.HelpIntent": function (intent, session, response) {
    response.ask("You can say what feed you want to hear", "You can say what feed you want to hear");
  }
};

// Create the handler that responds to the Alexa Request.
exports.handler = function (event, context) {
  // Create an instance of the RssReader skill.
  var rssReader = new RssReader();
  rssReader.execute(event, context);
};
hochgeladen.

Im Developer-Account habe ich dann "Feed" angelegt, bei dem Intent-Schema war bei dem dort angegebenen Muster wohl nicht das passende dabei. Ich habe dann mein eigenes verwendet:

Code: Alles auswählen

{
  "intents": [
    {
      "intent": "GetBBCNews",
      "slots": [
        {
          "name": "FeedName",
          "type": "LISTOFFEEDS"
        }
      ]
    },
    {
      "intent": "GetDailyNewsDigest"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"    
    }
  ]
}

ich legte noch einen Slot "LISTOFFEEDS" an, inhalt "Blitzer" und "Verkehr"

und bei den Utterances war im Alexa-BBC-Feed auch lediglich ein nicht angepasstes Muster dabei. Deshalb habe ich vorläufig folgendes eigegeben:

Code: Alles auswählen

GetBBCNews what's the latest in {FeedName}
GetBBCNews get me {FeedName} news
GetBBCNews what's happening in {FeedName}
GetBBCNews {FeedName}
GetBBCNews tell me about {FeedName}
der Skill wurde aktiviert.
Wenn ich sage "Alexa, starte Feed", bekomme ich die Antwort: "Willkommen, welche Feeds willst Du?

bekomme ich die Antwort: "ich kann folgenden Feed nicht ausführen, Blitzer"

--> an diesem Punkt hänge ich. Alexa erkennt wohl den Feed, aber das handling funktioniert irgendwie nicht...

Grundsätzlich: ich habe schon 3 Skills für mich eingerichtet, bin aber sicher noch am Anfang des mächtigen Alexa-Wissens...
Also, kann jemand helfen?
0 x
Benutzeravatar

amartin
Beiträge: 117
Registriert: Sa 4. Feb 2017, 19:12
Vorhandene Echos: 1
Vorhandene Echo Dots: 1

Sa 11. Mär 2017, 15:17

Code: Alles auswählen

 switch (intent.slots.FeedName.value.toLowerCase()) {
        case "Blitzer":
schreib an dieser Stelle mal das "Blitzer" klein, also "blitzer"
0 x
Benutzeravatar

Themenstarter
Semenchkare
Beiträge: 63
Registriert: Fr 10. Mär 2017, 22:24
Vorhandene Echos: 3
Vorhandene Echo Dots: 4

Sa 11. Mär 2017, 17:32

ich brech zusammen!

Genau das war es !

Vielen Dank Mr. amartin! Ab heute für mich Guru!
0 x
Benutzeravatar

amartin
Beiträge: 117
Registriert: Sa 4. Feb 2017, 19:12
Vorhandene Echos: 1
Vorhandene Echo Dots: 1

Sa 11. Mär 2017, 17:58

Keine Ursache, viel Spaß beim weiterentwickeln :)
0 x
Benutzeravatar

Themenstarter
Semenchkare
Beiträge: 63
Registriert: Fr 10. Mär 2017, 22:24
Vorhandene Echos: 3
Vorhandene Echo Dots: 4

Sa 11. Mär 2017, 21:43

wie bekomme ich den bestimmten feed, z.B. "blitzer", in meine tägliche Zusammenfassung? Meine custom App wird da nicht vorgeschlagen...

Gruß

Seme
0 x
Benutzeravatar

amartin
Beiträge: 117
Registriert: Sa 4. Feb 2017, 19:12
Vorhandene Echos: 1
Vorhandene Echo Dots: 1

Sa 11. Mär 2017, 22:16

das was du gerade hast ist ein ASK Skill (Skill Type: Custom Interaction Model) https://developer.amazon.com/alexa-skills-kit - du willst aber eigentlich einen Flash Briefing Skill (Skill Type: Flash Briefing Skill API) https://developer.amazon.com/alexa-skil ... h-briefing
0 x
Benutzeravatar

TCB
Beiträge: 2
Registriert: Mi 29. Nov 2017, 15:51

Mi 29. Nov 2017, 15:54

Hallo

Ich habe eigentlich überhaupt keine Ahnung von Programmierung und versuche mein Bestes alles nachzuvollziehen.

Die index.js habe ich angepasst.
Beim Intent-Schema scheitere ich aber leider.

Error: There was a problem with your request: Unknown slot type 'LISTOFFEEDS' for slot 'FeedName'


Wie/wo muss ich denn FeedName definieren?

Ich hoffe, dass mir jemand weiterhelfen kann! :)


Danke im Voraus
Thomas
0 x
Benutzeravatar

luigidc
Beiträge: 523
Registriert: Mi 21. Dez 2016, 11:33
Wohnort: Hamburg
Vorhandene Echos: 1
Vorhandene Echo Dots: 2

Mi 29. Nov 2017, 16:44

Unterhalb vom Intent Schema sind die Custom Slot Types und da gibt es einen Button 'Add Slot Type '.
Type ist dann LISTOFFEEDS und Values die Werte die Du in der index.js im case-Statement benutzt hast. Ein Wert pro Zeile.
Hier im Beispiel sind das "Verkehr" und "Blitzer".
Zuletzt geändert von luigidc am Mi 29. Nov 2017, 16:45, insgesamt 1-mal geändert.
1 x
Benutzeravatar

TCB
Beiträge: 2
Registriert: Mi 29. Nov 2017, 15:51

Do 30. Nov 2017, 07:53

Vielen Dank! :)
Darauf bin ich einfach nicht gekommen ^^

----

Nachdem diese Hürde gemeistert war, ist mir aufgefallen, dass ich noch den rss-parser benötige.
Wie ich den auf meinem Webspace einrichte, ist mir ein Rätsel. Einfach herunterladen und hochladen ist wohl nicht richtig.
Und mit LAMBDA verstehe ich noch weniger.

Muss mir wohl doch mal jemanden suchen, der sich damit auskennt! ^^
Zuletzt geändert von TCB am Do 30. Nov 2017, 08:22, insgesamt 1-mal geändert.
0 x
Antworten

Zurück zu „Fähigkeiten (Skills) entwickeln“

  • Information