Giter VIP home page Giter VIP logo

sendcloudapi.net's Introduction

SendCloudApi.Net

An unofficial client for the SendCloud API. More info about SendCloud on http://sendcloud.nl. Below are some examples on the usage of this client.

Full docs of the SendCloud API can be found on https://api.sendcloud.dev/docs/sendcloud-public-api/getting-started

GitHub license Twitter URL Donate

Installation

This project can easily be installed through NuGet.

Install-Package SendCloudApi

Set-up connection

Prepare the client for connecting to SendCloud with your API key, API secret and Sendcloud Partner id (optional)

var client = new SendCloudApi.Net.SendCloudApi("apikey", "apisecret", "partnerid")

Get all parcels

Returns an array of Parcel objects

var parcels = await client.Parcels.Get();

Get a single parcel

Returns a Parcel object

var parcel = await client.Parcels.Get(2342);

Create a new parcel

var parcel = new CreateParcel
{
	Name = "John Smith",
	CompanyName = "ACME",
	Address = "Wellingtonstreet 25",
	City = "Wellington",
	PostalCode = "3423 DD",
	Country = "NL",
	RequestLabel = true,
	ShippingMethod = 1, // Shipping method, get possibilities from client.ShippingMethods.Get()
	OrderNumber = "ORDER2014-52321",
};
var response = await client.Parcels.Create(parcel);

Retrieve a PDF label

var url = "https://panel.sendcloud.sc/api/v2/labels/normal_printer/{id}";
var label = await client.Label.Download(url);
File.WriteAllBytes("{path}", label);

Exceptions

Actions to the API may cause an Exception to be thrown in case something went wrong

try
{
	var response = await client.Parcels.Create(parcel);
}
catch (SendCloudException e)
{
	throw new Exception(e.Message);
}

sendcloudapi.net's People

Contributors

sar0z avatar sepplk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

sendcloudapi.net's Issues

Error deserializing

Hi,
following your instruction in creating a parcel this is the error we are getting:

The data contract type 'SendCloudApi.Net.Models.Country' cannot be deserialized because the required data members 'from_id, from_iso_2, from_iso_3, from_name' were not found.'

This is the code:
var parcel = new CreateParcel { Name = "John Smith", CompanyName = "ACME", Address = "Wellingtonstreet 25", City = "Wellington", PostalCode = "3423 DD", Country = "NL", RequestLabel = true, ShippingMethod = 8, // Shipping method, get possibilities from client.ShippingMethods.Get() OrderNumber = "ORDER2014-52321", }; try { var response = await client.Parcels.Create(parcel); } catch (SendCloudException e) { throw new Exception(e.Message); }

Nullable date values in Parcel.cs

Hi,

We just had a case when the announcement to DHL failed in creating a parcel.

It returned null in DateAnnounced. So the fields below should be nullable in Parcel.cs so that it does not fail on serialization, and then the error can be retrieved from the status property.

[DataMember(Name = "date_created", EmitDefaultValue = false, IsRequired = false)]
public DateTime DateCreated { get; set; }

    [DataMember(Name = "date_announced", EmitDefaultValue = false, IsRequired = false)]
    public DateTime DateAnnounced { get; set; }

    [DataMember(Name = "date_updated", EmitDefaultValue = false, IsRequired = false)]
    public DateTime DateUpdated { get; set; }

Shipping price not working

Hi,

I am trying to run the following code:
var pr = await client.ShippingPrice.Get(1, "NL", "NL", 1, "kilogram");

In my response I see that pr.Price and pr.Currency are null.

Is this a issue/bug?

Using verbose on Create parcel

Hi,

We would like that you implement the use of verbose in Create parcel. This gives more detailed information from the carrier when it fails. So instead of getting "Announcement failed" exception that means nothing to the user, it will give more details like: non_field_errors: "Service error: Die angegebene Straße kann nicht gefunden werden."

This example message comes from a shipment with DHL Germany.

From the Sendcloud API documentation:

Developers
If you are using this API for development purposes, you might want to use the errors query string in the URL. That allows you to visualize the errors from the carrier.

GET https://panel.sendcloud.sc/api/v2/parcels?errors=verbose-carrier

We have tested it, and the code below works.

public abstract class SendCloudApiAbstractResource
{
protected readonly SendCloudApi Client;
protected string HostUrl = "https://panel.sendcloud.sc/api/v2/";
protected string Authorization;
protected bool CreateRequest = true;
protected bool GetRequest = true;
protected bool UpdateRequest = true;
protected bool DeleteRequest = false;
protected string SingleResource = string.Empty;
protected string ListResource = string.Empty;
protected string CreateResource = string.Empty;
protected string UpdateResource = string.Empty;
protected string Resource = string.Empty;
protected string DateTimeFormat = "yyyy-MM-dd HH:mm:ss";
protected string Verbose = "?errors=verbose-carrier";

    protected SendCloudApiAbstractResource(SendCloudApi client)
    {
        Client = client;
        Authorization = client.GetBasicAuth();
    }

    protected async Task<ApiResponse<T>> Create<T>(string data)
    {
        if (CreateRequest)
        {
            return await Client.Create<T>($"{HostUrl}{CreateResource}{Verbose}", Authorization, data, SingleResource, DateTimeFormat);
        }
        return new ApiResponse<T>(System.Net.HttpStatusCode.MethodNotAllowed, default(T));
    }

Client.ShippingProducts.Get() is missing the returns parameter

Hi,

I'm using the ShippingProducts Api to receive the available shipping methods between 2 countries.

Client.ShippingProducts.Get("[FROMCOUNTRY]", "[TOCOUNTRY]")
SendCloud also supports the "Returns" (boolean) parameter to receive only shipping methods for return labels from any country to our warehouse.

Is it possible to provide this parameter in your library?

Many thanks

Issue when errors encounted

Hi,

We had a big struggle to debug a problem with a shipment.

Using the GetShipments.

The value of shipping_method was null, but the error was triggered on the json parsing with a invalid value on int32 (but not which).

I downloaded the code, and found out by setting the shipping_method to int? it would not fail here, and by adding the errors properties these errors can actually be read.

This would be much more useful to show the user also. And another benefit would be that a shipment can actually be validated in the GetShipments with a list of validation errors.

I only made a change in the Shipment.cs

Should I upload it to here, or send it to you?

We would really like to use the "official" package, rather than fixing this locally ourselves.

Creating Multicollo Parcels

I am struggling to create multicollo parcels (RequestLabel = true)

If I use Parcels.Create(parcel) with quantity >1 I get an exception 'Requesting a label for a multi-collo shipment in only allowed via creating multiple parcels"

So I tried with Parcels.BulkCreate(new CreateParcel[] { parcel }) with the same parcel object as before but I got independent labels who are not detected as Multicollo.

Is there a specific method I haven't found?

GetServicePoints not all params are available

Hi Rob, thanks for the great work for this package.

I've noticed there's more options available on the API:
https://api.sendcloud.dev/docs/sendcloud-public-api/service-points%2Foperations%2Flist-service-points

Specifically, looking at their docs, we could pass "address" and "radius".

However SendCloudApiServicePointsResource doesnt really offer these params in the GetServicePoints function.

Any way to work around this or should we just work around it with an HTTPclient parallel from your sdk?

Converting an address to lat/long isnt too difficult but would require another integration with gmaps for example.

Thanks in advance

client.Integrations.Get() error

After last fix there is a new issue:

System.Runtime.Serialization.SerializationException
HResult=0x8013150C
Message=There was an error deserializing the object of type SendCloudApi.Net.Models.Integration[]. String '2021-03-08T11:00:24.277796+01:00' was not recognized as a valid DateTime.
Source=System.Private.DataContractSerialization
StackTrace:
at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver)
at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(XmlDictionaryReader reader)
at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(Stream stream)
at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream)
at SendCloudApi.Net.Helpers.JsonHelper.Deserialize[T](String json, String dateTimeFormat)
at SendCloudApi.Net.SendCloudApi.d__251.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()
at SendCloudApi.Net.SendCloudApi.d__221.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()
at SendCloudApi.Net.Resources.SendCloudApiAbstractResource.d__141.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()
at SendCloudApi.Net.Resources.SendCloudApiIntegrationsResource.d__1.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()

Inner Exception 1:
FormatException: String '2021-03-08T11:00:24.277796+01:00' was not recognized as a valid DateTime.

I think the issue is that you use DateTime instead of DateTimeOffset everywhere

Integrations.GetShipments() errors

Sorry to bother you again ;(

Shipment[] pTest= await SendcloudClient.Integrations.GetShipments(366789, orderNumber: "405-0794075-2815560");
pTest= await SendcloudClient.Integrations.GetShipments(366789, shippingRules: true);

First line works, but second doesn't. Using other filters like startDate also return the same error:
System.Runtime.Serialization.SerializationException

"Expected 'Element'.. 'Text' was found with name '',namespace ''. " (translated, it comes in my pc language)

Maybe they changed the returned element?

DateTime problems and missing fields

You should use DateTimeOffset instead of DateTime on all date fields returned.

These fields are actually DateTimeOffset fields from Sendcloud, but for some reason are treated as DateTime.

I made a test myself with RestAPI and with for example shipment I set the created_at to DateTimeOffset and it returned {08.03.2021 11:24:25 +01:00}. Your API returned {08.03.2021 10:24:25} that will be incorrect if the time zone is different from UTC. In general DateTimeOffset is better since we dont need to worry about time zone issues.

Also fields are missing. For example in Shipment the allowed_shipping_methods field is missing, and we need this.

Unable to catch SendCloudException

Trying to catch a SendCloudException when making a HttpRequest will fail because the HandleReponseError method is async void. Shouldn't this method have a Task return type?

Error message when getting list of shipments

Hi,

When getting a list of shipments we get this error:

System.Runtime.Serialization.SerializationException
HResult=0x8013150C
Message=There was an error deserializing the object of type System.Collections.Generic.Dictionary2[[System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[SendCloudApi.Net.Models.Shipment[], SendCloudApi.Net, Version=2.0.2.0, Culture=neutral, PublicKeyToken=null]]. String '2021-03-06T09:26:49Z' was not recognized as a valid DateTime. Source=System.Private.DataContractSerialization StackTrace: at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(XmlDictionaryReader reader) at System.Runtime.Serialization.Json.DataContractJsonSerializerImpl.ReadObject(Stream stream) at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(Stream stream) at SendCloudApi.Net.Helpers.JsonHelper.DeserializeAsDictionary[T](String json, String dateTimeFormat) at SendCloudApi.Net.SendCloudApi.<SendRequest>d__251.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at SendCloudApi.Net.SendCloudApi.<Get>d__221.MoveNext()
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at SendCloudApi.Net.Resources.SendCloudApiIntegrationsResource.<GetShipments>d__3.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult()

Inner Exception 1:
FormatException: String '2021-03-06T09:26:49Z' was not recognized as a valid DateTime.

We are using a Shopify connector in Sendcloud.

.Net Core 3.1

Print label

Is it possible to add an example about downloading the pdf label of a parcel?
Thanks in advance for your work

Error in GetShipment

Hi,

When there is an error in missing country of origian or hs code the returned error message triggers an exception instead of just populating the error property.

We use this to get the shipment, and then we can populate parcel items with correct values.

BTW. You made a GetShipmentsWithHttpInfo call to see the payload, but if json serialization fails, it will also trigger an exception. This function should be able to return the payload even if json error.

This happens on export from EU, but the error issue will be the same for other things.

But now this triggers an exception, and we cannot get the shipment object:

{
"next": null,
"previous": null,
"results":
[
{
"address": "43",
"address_2": "",
"allowed_shipping_methods": [],
"barcode": "PSxxxx",
"city": "XX",
"company_name": "",
"country": "CH",
"created_at": "2022-05-12T17:34:09.391873Z",
"currency": "EUR",
"customs_invoice_nr": "XX",
"customs_shipment_type": 2,
"email": "[email protected]",
"external_order_id": "000001",
"external_shipment_id": "",
"house_number": "",
"integration": 323323,
"name": "My name",
"order_number": "1234",
"order_status":
{
"id": "unfulfilled",
"message": "Unfulfilled"
},
"parcel_items":
[
{
"description": "Product 1",
"hs_code": "",
"origin_country": null,
"product_id": "6721039466649",
"properties": {},
"quantity": 1,
"sku": "sku1",
"value": "240.00",
"weight": "1.600"
}
],
"payment_status":
{
"id": "paid",
"message": "Paid"
},
"postal_code": "0001",
"sender_address": 1234,
"shipment_uuid": "xxxxx",
"shipping_method": 2255,
"shipping_method_checkout_name": "DHL Express : home delivery",
"telephone": "911",
"to_post_number": "",
"to_service_point": null,
"to_state": null,
"total_order_value": "10.00",
"updated_at": "2022-05-12T17:34:09.391879Z",
"weight": "1.600",
"width": null,
"height": null,
"length": null,
"errors":
{
"parcel_items":
[
{
"hs_code":
[
"This field is required."
],
"origin_country":
[
"This field is required."
]
}
]
}

}
]
}

Models.DocumentTypeExtensions.ToDocumentType() generates error

Hi,

I found an error in the ToDocumentType() function in the Model.Documentype.cs class.
It gives us a "ToEnumValue(): Invalid description for enum DeliveryOption" error.

On line 39 it says: var type = typeof(DeliveryOption);
I think DeliveryOption should be DocumentType

SendCloudApiParcelDocumentsResource.Download - Double slash in URL results in 404 response

Hi

Downloading Parcel Documents doesn't work anymore.

The slash after the HostUrl must be removed as the host URL ends with a slash. The SendCloud API does not accept this anymore and returns a 404 Not Found error.

// File SendCloudApiParcelDocumentsResource.cs
// Line 21
 Uri uri = Client.GetUrl($"{HostUrl}/parcels/{parcelId}/documents/{type}", parameters);

Client.ShippingMethods.Get() does not support return labels

Hi,

The Client.ShippingMethods.Get() gives us all possible shippingmethods for normal parcels.
If you want to get the shipping methods for return parcels, according to the SendCloud docs, you must add the parameter is_return (true).

This parameter is not provided in the api. Is there a way to obtain these shipping methods or can you add the parameter?

Exception with Verbose mode

Hi,

I seem to have a problem when I activate the verbose mode.

Without verbose mode, this code works :

var client = new SendCloudApi.Net.V2.SendCloudApi("xxx", "yyy");

var putParcel = new CreateParcel
{
    Id = 12345,
    Name = "NAME"
};
await client.Parcels.Update(putParcel);

But with verbose mode :
var client = new SendCloudApi.Net.V2.SendCloudApi("xxx", "yyy", verbose: true);
The same code throws a NullReferenceException :
System.NullReferenceException: 'Object reference not set to an instance of an object.'

After investigation, it seems that the error is in SendCloudApiBase.cs:L114, where parameters is null :
parameters.Add("errors", "verbose-carrier");

The reason is that the Update<T> method pass null instead of a Dictionary :

internal async Task<ApiResponse<T>> Update<T>(string url, string authorization, string data, string returnObject, string dateTimeFormat, bool verbose)
{
    return await SendRequest<T>(url, authorization, "PUT", null, data, returnObject, dateTimeFormat, verbose);
}

I see that only the Get<T> method pass a Dictionary, but the other methods pass null.

Did i miss something, or is there really an issue there ?

Error handling of HTML response

Hi,

Sometimes Sendcloud returns an HTML error instead of Json.

I have updated the code to take care of this, so now it can return for example: 500 - Page is not working

Can you implement this code?

private async Task HandleResponseError(HttpResponseMessage response)
        {
            string message;
            switch (response.StatusCode)
            {
                case HttpStatusCode.NotFound:
                    message = "Page not found";
                    break;
                default:
                    var responseBody = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                    try
                    {
                        var result = JsonHelper.Deserialize<SendCloudError>(responseBody, "yyyy-MM-dd HH:mm:ss");
                        message = result.Message;

                        if (!string.IsNullOrEmpty(result.Error?.Message))
                        {
                            message = result.Error.Message;
                        }
                    }
                    catch
                    {
                        // Probably HTML error, return the title of the HTML instead
                        // Locate the <title> tag. In HTML from Sendcloud it seems like it's returning <title >, so we just check for <title
                        string title = "";
                        int titleStart = responseBody.IndexOf("<title",0,StringComparison.OrdinalIgnoreCase);
                        if ( titleStart > -1)
                        {
                            // Set the start index to end of <title>. Locate the >
                            for (int index = titleStart; index < responseBody.Length; index++)
                            {
                                if (responseBody[index] == '>')
                                {
                                    // Set the position to the first char after >
                                    titleStart = index + 1;

                                    // Found the title, get the position of the </title tag
                                    int tagEnd = responseBody.IndexOf("</title", titleStart,StringComparison.OrdinalIgnoreCase);
                                    if (tagEnd > 0)
                                    {
                                        title = responseBody.Substring(titleStart, tagEnd - titleStart);
                                    }
                                    break;
                                }
                            }
                        }

                        if (!string.IsNullOrEmpty(title))
                        {
                            message = title;
                        }
                        else
                        {
                            message = "Sendcloud unknown error";
                        }
                    }

                    break;
            }
            throw new SendCloudException(message);
        }

Bug in reading ParcelItems properties

Hi,

We have a major problem when getting the shipment from Sendcloud.

The json payload is correct, but this case is quite special.

We actually have multi level properties, and it only allows for key and a value.

This is the payload from Sendcloud:

{ "next": null, "previous": null, "results": [{ "address": Mystreet", "address_2": "", "allowed_shipping_methods": [1883, 2021, 1951, 3486, 91, 3744, 3745, 2830, 89, 193, 3480, 111, 85, 78, 3808, 3807, 3806, 3805, 176, 250, 216, 127, 122, 316, 8], "barcode": "PS0000000171863582", "city": "MyCity", "company_name": "", "country": "DE", "created_at": "2021-10-27T09:15:12.490785Z", "currency": "EUR", "customs_invoice_nr": "#1033", "customs_shipment_type": 2, "email": "[email protected]", "external_order_id": "4189342302402", "external_shipment_id": "", "house_number": "1", "integration": 123456, "name": "Me", "order_number": "#1033", "order_status": { "id": "unfulfilled", "message": "Unfulfilled" }, "parcel_items": [{ "description": "Product1", "hs_code": "", "origin_country": "", "product_id": "6109169156290", "properties": { "_upsell_discount_percent": 0.25, "_upsell_discount_label": "Angebot" }, "quantity": 1, "sku": "LG1311tt", "value": "18.00", "weight": "0.150" }, { "description": "Product2", "hs_code": "", "origin_country": "", "product_id": "6109173219522", "properties": { "1. Mini Lipstick": "Royal Red", "2. Mini Lipstick": "Rosy Pink", "3. Mini Lipstick": "Rusty Red", "_MemberCustomAttributes": [{ "Qty": 1, "SKU": "Mini-LS-26", "Name": "Mini Lipstick - Royal Red", "Barcode": "4260645340367", "variantGid": "gid://shopify/ProductVariant/123434434" }, { "Qty": 1, "SKU": "Mini-LS-25", "Name": "Mini Lipstick - Rosy Pink", "Barcode": "4260645340350", "variantGid": "gid://shopify/ProductVariant/3213331233" }, { "Qty": 1, "SKU": "Mini-LS-22", "Name": "Mini Lipstick - Rusty Red", "Barcode": "4260645340329", "variantGid": "gid://shopify/ProductVariant/43244344" }] }, "quantity": 1, "sku": "SET-018", "value": "32.00", "weight": "0.300" }], "payment_status": { "id": "paid", "message": "Paid" }, "postal_code": "1400", "sender_address": 111923, "shipment_uuid": "66efad62-2807-4dc8-bf62-6a2441acef0b", "shipping_method": 2830, "shipping_method_checkout_name": "Standard", "telephone": "", "to_post_number": "", "to_service_point": null, "to_state": null, "total_order_value": "54.99", "updated_at": "2021-10-27T09:15:12.490790Z", "weight": "0.450", "width": null, "height": null, "length": null }] }

So it fails when it tries to parse the _MemberCustomAttributes because there is an array and not a single value. In our case we could not care less about these properties, but it fails when we trying to get the shipment.

Regarding issue #20

I have made a comment on this closed issue.

It's much more informative to return the actual error message, than a generic one.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.