Sonntag, 13. Juli 2014

Mit Facebook Plätze suchen

In diesem Post möchte ich zeigen, wie man über die Facebook API Suchanfragen durchführt, insbesondere zu Plätzen (Orten) - places auf englisch. Das Prinzip ist dasselbe wie beim generellen Auslesen von Daten von Facebook, nur dass wir hier die Suchfunktion nutzen. Aus diesem Grund brauchen wir auch, im Gegensatz zu dem Beispielprogramm aus dem vorigen Post, ein user access token. Wie man dieses erhält, könnt ihr dem verlinkten Post entnehmen.
Bei der Suche nach Orten gibt es dann mehrere Möglichkeiten, ich werde hier 2 vorstellen: Über Koordinaten oder Schlagworte.
Um nach Plätzen in der Nähe bestimmter Koordinaten zu suchen, ist folgende Abfrage nötig:

https://graph.facebook.com/search?access_token=ACCESS_TOKEN &type=place&center=BREITENGRAD,LÄNGENGRAD &distance=ENTFERNUNG"

Hierbei sind die Platzhalter in Großbuchstaben durch die richtigen Angaben zu ersetzen. Breiten- und Längengrad müssen in Dezimalschreibweise (Punkt als Trennzeichen) eingegeben werden, positive Werte stehen für Nord bzw Ost, negative für Süd bzw. West. So ist zum Beispiel (37° 27′ N, 122° 11′ W) = 37.27, -122.11.
Über den Parameter distance kann die Entfernung von den Koordinaten in Metern angegeben werden, bis zu welcher Orte gesucht werden sollen.

Um nach Schlagwörtern zu suchen benutzen wir

https://graph.facebook.com/search?access_token=ACCESS_TOKEN &type=place &q=KEYWORDS

Mittels des Parameters q können Schlagwörter eingegeben werden, welche den Ort beschreiben, zum Beispiel Teile des Names, die Stadt in welcher er sich befindet etc.

Beide Anfragen können natürlich wie immer auch im Browser ausgeführt werden, oder wir benutzen eine HTTP Abfrage in C#.
Bevor wir zum Code kommen, müssen wir noch kurz auf das Ausgabeformat zu Sprechen kommen. Führt man die Abfrage https://graph.facebook.com/search?access_token=ACCES_TOKEN&type=place&q=aachen im Browser aus, erhält man das folgende Ergebnis:

{
   "data": [
      {
         "category": "Club",
         "category_list": [
            {
               "id": "354275401259620",
               "name": "Nightlife"
            }
         ],
         "location": {
            "street": "Liebigstra\u00dfe 19",
            "city": "Aachen",
            "state": "",
            "country": "Germany",
            "zip": "52070",
            "latitude": 50.789739317735,
            "longitude": 6.1094749147791
         },
         "name": "STARFISH-Aachen.de",
         "id": "106940009344240"
      },
...

Das Ergebnis wird im JSON Format ausgeben, was für JavaScript Object Notation steht und ein einfaches Textformat zum Datenaustausch darstellt.
Um das Format in C# interpretieren zu können, benutzen wir Json.Net, welches hier heruntergeladen werden kann. Danach müssen wir im Projekt einen Verweis auf die Newtonsoft.Json.dll hinzufügen, welche sich im BIN Verzeichnis der Installation und dann dem entsprechenden .Net Versionsordner befindet.
Das folgende Programm sucht Orte in der Nähe der angegebenen Koordinaten und gibt ID, Name etc. dieser in einem Textfeld aus:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;

namespace FacebookSearch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string RequestURL;
            RequestURL = "https://graph.facebook.com/search?access_token=ACCESS_TOKEN" +
            "&type=place&center=52.3110,13.2424&distance=1000";

            // using Keywords:
            // RequestURL = "https://graph.facebook.com/search?access_token=ACCESS_TOKEN&type=place&q=aachen";

            WebRequest GetRequest;
            GetRequest = WebRequest.Create(RequestURL);

            Stream ResponseStream;
            ResponseStream = GetRequest.GetResponse().GetResponseStream();
            StreamReader ResponseReader = new StreamReader(ResponseStream);

            string TempLine = ResponseReader.ReadLine();

            JObject FoundPlaces = JObject.Parse(TempLine);

            foreach (var x in FoundPlaces["data"].Children())
            {
                string CategoryName = "";

                textBox1.Text += "Name:" + x["name"].ToString() + "   ID: " + x["id"] +  "   City: " + x["location"]["city"] + "    Street: " + x["location"]["street"] + Environment.NewLine;
            }

        }
    }
}

Keine Kommentare:

Kommentar veröffentlichen