Immobilienscout 24 API - Как использовать? - PullRequest
0 голосов
/ 03 ноября 2018

Я потратил много времени, чтобы попробовать поработать с API из Immobilienscout 24. Я хотел бы использовать C # / Visual Studio и использовать этот код из GitHub https://github.com/mganss/IS24RestApi

Я создал новый проект «Консольное приложение» и скопировал код. Итак, мой код:

    static void Main(string[] args)
    {
        var config = RestSharp.SimpleJson.DeserializeObject<Config>(File.ReadAllText("config.json"));

        if (args.Contains("-a"))
            AuthorizeAsync(config).Wait();
        else
            TestAsync(config).Wait();
    }

с этими двумя функциями:

private static async Task AuthorizeAsync(Config config)
    {
        // see http://api.immobilienscout24.de/useful/authentication/authentication-detailed.html

        var connection = new IS24Connection
        {
            ConsumerKey = config.ConsumerKey,
            ConsumerSecret = config.ConsumerSecret,
            BaseUrlPrefix = @"https://rest.sandbox-immobilienscout24.de/restapi/security"
        };

        // step 1
        await connection.GetRequestToken(callbackUrl: "oob");

        // step 2
        try
        {
            var url = string.Format("{0}/oauth/confirm_access?oauth_token={1}", connection.BaseUrlPrefix,
                HttpUtility.UrlEncode(connection.RequestToken));
            Process.Start(url);
        }
        catch
        {
        }

        Console.Out.Write("Enter verifier: ");
        var verifier = Console.In.ReadLine().Trim();

        // step 3
        await connection.GetAccessToken(verifier);

        Console.Out.WriteLine("Access Token: {0}", connection.AccessToken);
        Console.Out.WriteLine("Access Token Secret: {0}", connection.AccessTokenSecret);
    }

и

private static async Task TestAsync(Config config)
    {
        var connection = new IS24Connection
        {
            ConsumerKey = config.ConsumerKey,
            ConsumerSecret = config.ConsumerSecret,
            AccessToken = config.AccessToken,
            AccessTokenSecret = config.AccessSecret,
            BaseUrlPrefix = @"https://rest.sandbox-immobilienscout24.de/restapi/api"
        };

        var searchResource = new SearchResource(connection);
        var query = new RadiusQuery
        {
            Latitude = 52.49023,
            Longitude = 13.35939,
            Radius = 1,
            RealEstateType = RealEstateType.APARTMENT_RENT,
            Parameters = new
            {
                Price = new DecimalRange { Max = 1000 },
                LivingSpace = new DecimalRange { Min = 100 },
                NumberOfRooms = new DecimalRange { Min = 4 },
                Equipment = "balcony"
            },
            Channel = new HomepageChannel("me")
        };
        var results = await searchResource.Search(query);

        var api = new ImportExportClient(connection);
        RealtorContactDetails contact = null;

        try
        {
            contact = await api.Contacts.GetAsync("Hans Meiser", isExternal: true);
        }
        catch (IS24Exception ex)
        {
            if (ex.Messages.Message.First().MessageCode != MessageCode.ERROR_RESOURCE_NOT_FOUND) throw;
        }

        if (contact == null)
        {
            contact = new RealtorContactDetails
            {
                Lastname = "Meiser",
                Firstname = "Hans",
                Address = new Address
                {
                    Street = "Hauptstraße",
                    HouseNumber = "1",
                    Postcode = "10827",
                    City = "Berlin",
                    InternationalCountryRegion = new CountryRegion { Country = CountryCode.DEU, Region = "Berlin" }
                },
                Email = "hans.meiser@example.com",
                ExternalId = "Hans Meiser"
            };

            await api.Contacts.CreateAsync(contact);

            contact.Address.HouseNumber = "1a";
            await api.Contacts.UpdateAsync(contact);
        }

        IRealEstate realEstate = null;

        try
        {
            realEstate = await api.RealEstates.GetAsync("Hauptstraße 1", isExternal: true);
        }
        catch (IS24Exception ex)
        {
            if (ex.Messages.Message.First().MessageCode != MessageCode.ERROR_RESOURCE_NOT_FOUND) throw;
        }

        if (realEstate == null)
        {
            var re = new ApartmentRent
            {
                Contact = new RealEstateContact { Id = contact.Id },
                ExternalId = "Hauptstraße 1",
                Title = "IS24RestApi Test",
                Address = new Wgs84Address { Street = "Hauptstraße", HouseNumber = "1", City = "Berlin", Postcode = "10827" },
                BaseRent = 500.0,
                LivingSpace = 100.0,
                NumberOfRooms = 4.0,
                ShowAddress = true,
                Courtage = new CourtageInfo { HasCourtage = YesNoNotApplicableType.NO }
            };

            await api.RealEstates.CreateAsync(re);

            re.BaseRent += 100.0;
            await api.RealEstates.UpdateAsync(re);

            realEstate = new RealEstateItem(re, connection);
        }
        else
        {
            var re = (ApartmentRent)realEstate.RealEstate;
            re.BaseRent += 100.0;
            await api.RealEstates.UpdateAsync(re);
            re.BaseRent -= 100.0;
            await api.RealEstates.UpdateAsync(re);
        }

        var projects = await api.RealEstateProjects.GetAllAsync();
        if (projects.RealEstateProject.Any())
        {
            var project = projects.RealEstateProject.First();
            var entries = await api.RealEstateProjects.GetAllAsync(project.Id.Value);
            if (!entries.RealEstateProjectEntry.Any(e => e.RealEstateId.Value == realEstate.RealEstate.Id.Value))
                await api.RealEstateProjects.AddAsync(project.Id.Value, realEstate.RealEstate);
        }

        var placement = await realEstate.PremiumPlacements.GetAsync();

        var a1 = new KeyValuePair<Attachment, string>(new Picture { Title = "Zimmer 1", Floorplan = false, TitlePicture = true }, @"..\..\test.jpg");
        var a2 = new KeyValuePair<Attachment, string>(new Picture { Title = "Zimmer 2" }, @"..\..\test.jpg");
        var a3 = new KeyValuePair<Attachment, string>(new Picture { Title = "Zimmer 3" }, @"..\..\test.jpg");
        var pdf = new KeyValuePair<Attachment, string>(new PDFDocument { Title = "Test" }, @"..\..\test.pdf");
        var video = new KeyValuePair<Attachment, string>(new StreamingVideo { Title = "Video" }, @"..\..\test.avi");
        var link = new KeyValuePair<Attachment, string>(new Link { Title = "Test", Url = "http://www.example.com/" }, null);

        var atts = new[] { video, a1, pdf, a2, link, a3 };

        await realEstate.Attachments.UpdateAsync(atts);

        var res = new List<RealEstate>();
        await api.RealEstates.GetAsync().ForEachAsync(x => res.Add(x.RealEstate));
    }

Я также создал файл с именем «Config.json» с необходимым ключом / токеном для реальной и песочнице (тестовой) учетной записи. Если я запускаю этот код, я получаю сообщение об ошибке:

"System.AggregateException Сообщение = Mindestens ein Fehler is aufgetreten. Внутреннее исключение 1: XmlException: Unerwartetes Token 'doctype'. Erwartet wurde das Token 'DOCTYPE'. Zeile 1, позиция 3. ".

На английском языке: XmlException: неожиданный токен 'doctype'. Ожидаемый токен был «DOCTYPE».

В Github автор также говорит что-то о файлах .xsd, которые также названы в руководстве от Immobilienscout 24 (https://api.immobilienscout24.de/useful/tutorials-sdks-plugins.html).

PS: я не привык работать с другими проектами, кроме "Windows Forms App"

Буду очень признателен за вашу помощь! Я думал, что будет проще создать небольшую поисковую программу на Immobilienscout 24 с REST API, но мой опыт не достаточно велик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...