Send #Faxes via #API using C# @Twilio

May 25, 2017 Leave a comment

fax-machine-component1

Faxes are still an old technology, and to be honest, I fail to understand how some companies still require them for certain authenticated (signed) documents. There are numerous services online that provide paid-for faxes, like sendfaxes.co.uk 

However, I saw that Twilio offers a FAX API, so if you wanted to add the functionality to your C# application, then here’s some sample code;

const string username = “xxxxx”;
const string password = “zzzzzz”;

var strUrl = “https://fax.twilio.com/v1/Faxes”;
strUrl = string.Format(strUrl, username);
var wc = new WebClient();
wc.Headers[“Content-Type”] = “application/x-www-form-urlencoded”;
var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes(username + “:” + password));
wc.Headers[HttpRequestHeader.Authorization] = string.Format(
“Basic {0}”, credentials);

var strResponse = wc.UploadString(strUrl, “To=%2B” + strToNumber +
“&From=%2B” + strFromNumber +
“&MediaUrl=” + strFax);

I tested this against FaxBurner, in order to get a temporary FAX number, and after about 2 minutes the fax arrived.

The Fax I sent was this: http://www.xmlpdf.com/manualfiles/hello-world.pdf – and it arrived in a similar format, but with the grey turned into a pattern of dots, since Faxes are monochrome. (as below)

b4

It is worth noting that during the 2 minutes when the FAX was being sent, it was possible to poll on Twilio for a status update, by calling the url with authentication, and with the SID returned in the JSON – https://fax.twilio.com/v1/Faxes\/{sid}

The status property of the JSON moved from “queued” to “sending” then finally “delivered” – i.e.

{
“media_sid”: “ME88a43ed8bdf1ddc9dbce3914ceeee7f3”,
“status”: “delivered”,
“direction”: “outbound”,
“from”: “+16193332636”,
“date_updated”: “2017-05-25T11:09:29Z”,
“price”: “-0.035”,
“account_sid”: “AC84d144631d43d12966be8c03e2c6a640”,
“to”: “+18668158879”,
“date_created”: “2017-05-25T11:04:20Z”,
“url”: “https:\/\/fax.twilio.com\/v1\/Faxes\/FXa6503014cfdc71509b9bf9f02cc7976a”,
“sid”: “FXa6503014cfdc71509b9bf9f02cc7976a”,
“duration”: 286,
“num_pages”: 1,
“quality”: “fine”,
“price_unit”: “USD”,
“api_version”: “v1”,
“media_url”: “https:\/\/media.twiliocdn.com\/fax\/AC84d144631d43d12966be8c03e2c6a640\/e5225a49644c2edd383baa803b4db3a2061c7301cdea8b2b600568b5adfa16b326c345334b0b0a8100a5fc608fa58ab330b365830df5308a84a2ec78bc924137?x-amz-security-token=FQoDYXdzEOr%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDHhP4wXa%2F%2BYky2StOCK3A2efy0tyDbg1GlWUU58EVMiK8arQIwL8MuNF0RkNNjeQ7OhI5rEJ8Jt3Gm59qYbBTpS7Ay9RmVNkePDTc19I96r16IZQzBR3G1zlZ4rhZE%2BORofirA3qv2lopLvokhyHj8UNtXMZ73pvWaJ32fcXmvbpkbgc50O8Mjuah84D5pc2w1nI0WlhCQB5btB9bvL5gbavI2ZbHKodUpgA%2FrQilGtEn7fXeO4S4J07Vp5o4LRSzFH7K3HWfgRdZxo3GYxKZqm6WCiR8qk2JQubBNbqJByY4Wb6R4a39OykpkZHPcr6gllDFqrF0fV%2B4%2FyWeukGfvEaEN332LZGJ%2BZj6hLyAWrG5vNtDZNvDr%2BoSwssnXhiu7wQn7syqs6WVCxy5KnmRi6c3PNvsAgAL6RkI%2F2alN7hxexVMxN%2BhnDmuT6c2Wb%2FtEFXJwIxOd1vMWgVIVDX%2FORrxyugIpcyNyDLghRm8cMtCKeED12TpGIdpbHQLPZTBpObPyRluJ4ZYOQkcGfRoFrJxdBPayRawTlLOBaKfY23yMzwWkH9cQKHlvXTGDy6MBrjb3wEVwHu5C4B1WndHIpSfKXPaAMotL%2BayQU%3D&AWSAccessKeyId=ASIAJH4JX2XKGVNEIEFA&Expires=1495717784&Signature=erQay6zd%2BzjBjYGxtf5BoHIiJMo%3D”,
“links”: {
“media”: “https:\/\/fax.twilio.com\/v1\/Faxes\/FXa6503014cfdc71509b9bf9f02cc7976a\/Media”
}
}

 

 

Categories: Uncategorized

#REST based #API open for feedback

May 23, 2017 Leave a comment

Beta REST API reference

Overview

The REST Beta API is a JSON based API that accepts basic HTTP authentication for user identification.  This API is still in BETA, and is therefore open for discussion and feedback from our users, but also may be changed without warning. If you would like to use this API in production, please let us know.

The format of the REST URL is as follows:

https://www.regcheck.org.uk/api/json.aspx/{Method}/{Parameter1}/{Parameter2}

Where {Method} is one of the following options;

CarSpecifications
Get static data based on a make, model and year of a car

Check
Get details for a vehicle in the UK

CheckAustralia
Get details for a vehicle in Australia

CheckBelgium
Get details for a vehicle in Belgium

CheckCroatia
Get details for a vehicle in Croatia

CheckCzechRepublic
Get details for a vehicle in the Czech Republic

CheckDenmark
Get details for a vehicle in Denmark

CheckEstonia
Get details for a vehicle in Estonia

CheckFinland
Get details for a vehicle in Finland

CheckFrance
Get details for a vehicle in France

CheckHungary
Get details for a vehicle in Hungary

CheckIndia
Get details for a vehicle in India

CheckIreland
Get details for a vehicle in Ireland

CheckItaly
Get details for a vehicle in Italy

CheckMotorBikeUK
Get details for a motorbike in the UK

CheckNetherlands
Get details for a vehicle in the Netherlands

CheckNewZealand
Get details for a vehicle in New Zealand

CheckNorway
Get details for a vehicle in Norway

CheckPakistan
Get details for a vehicle in Pakistan

CheckPortugal
Get details for a vehicle in Portugal

CheckRussia
Get details for a vehicle in Russia

CheckSlovakia
Get details for a vehicle in Slovakia

CheckSouthAfrica
Get details for a vehicle in South Africa

CheckSpain
Get details for a vehicle in Spain

CheckSriLanka
Get details for a vehicle in Sri Lanka

CheckSweden
Get details for a vehicle in Sweden

CheckUAE
Get details for a vehicle in United Arab Emirates

CheckUSA
Get details for a vehicle in the USA

UKMOT
Get MOT (Vehicle test) data for a car in England, Scotland or Wales

VinCheck
Get details for a vehicle based on its VIN number

WheelSize
Get Wheel size data based on a make, model and year of a car

So a sample request for a search on plate YYO7XHH in the UK would be:

https://www.regcheck.org.uk/api/json.aspx/Check/YYO7XHH

Which would return the following JSON

{
 “ABICode”: “39049602”,
 “Description”: “2007 Peugeot 307 X-line, 1360CC Petrol, 5DR, Manual”,
 “RegistrationYear”: “2007”,
 “CarMake”: {
   “CurrentTextValue”: “Peugeot”
 },
 “CarModel”: {
   “CurrentTextValue”: “307”
 },
 “EngineSize”: {
   “CurrentTextValue”: “1360CC”
 },
 “FuelType”: {
   “CurrentTextValue”: “Petrol”
 },
 “MakeDescription”: “Peugeot”,
 “ModelDescription”: “307”,
 “Immobiliser”: {
   “CurrentTextValue”: “”
 },
 “NumberOfSeats”: {
   “CurrentTextValue”: 5
 },
 “IndicativeValue”: {
   “CurrentTextValue”: “”
 },
 “DriverSide”: {
   “CurrentTextValue”: “RHD”
 },
 “Transmission”: {
   “CurrentTextValue”: “Manual”
 },
 “NumberOfDoors”: {
   “CurrentTextValue”: “5”
 },
 “ImageUrl”: “http:\/\/www.regcheck.org.uk\/image.aspx\/@UGV1Z2VvdCAzMDc=”,
 “VehicleInsuranceGroup”: “04”
}

 

Exceptions:

Certain REST API calls require more than one parameter, and these are as follows;

CarSpecifications

This is called in the format Make / Model / Year, for example;

https://www.regcheck.org.uk/api/json.aspx/CarSpecifications/Honda/Civic/2014

CheckAustralia

This is called in the format Registration Number / State, for example:

https://www.regcheck.org.uk/api/json.aspx/CheckAustralia/CEC36T/NSW

CheckUSA

This is called in the format Registration Number / State, for example:

https://www.regcheck.org.uk/api/json.aspx/CheckUSA/jxv7422/pa

CheckPakistan

This is called in the format Registration Number / State / District, for example:

https://www.regcheck.org.uk/api/json.aspx/CheckPakistan/STR%206006/PB/Pathankot

UKMOT

This is called in the format Registration Number / Make, for example:

https://www.regcheck.org.uk/api/json.aspx/UKMOT/DE02VOV/PEUGEOT

VinCheck

This is called with a VIN number instead of a registration number. for example;

https://www.regcheck.org.uk/api/json.aspx/VinCheck/5XYZT3LB9FG259411

WheelSize

This is called in the format Make / Model / Year, for example;

https://www.regcheck.org.uk/api/json.aspx/WheelSize/Ford/Focus/2014

 

Categories: Uncategorized

Enter card details using camera @cardio #cordova #phonegap

May 23, 2017 Leave a comment

cardio

Entering a 16 digit number into an app is error prone, and can frustrate a user right at the point of purchase. There is a really cool Cordova / Phonegap plugin that allows you scan a credit card using the camera, so you can input it into the page, without the user having to type.

Although the plugin is developed by paypal, you can use it with other PSPs, like stripe, – and since the processing is done on-device, there is no transmission of sensitive data.

You add the plugin to your project using:

cordova plugin add https://github.com/card-io/card.io-Cordova-Plugin

Then you call it in Javascript with code such as;

CardIO.scan({
“requireExpiry”: true,
“requireCVV”: true,
“requirePostalCode”: false,
“restrictPostalCodeToNumericOnly”: true
},
function(response){

$scope.form.CardNumber = parseInt(response[“cardNumber”]);
var dtExpiry = new Date(response[“expiryYear”], response[“expiryMonth”], 1);
$scope.form.CardExpiry = dtExpiry;
$scope.form.CardCvv = parseInt(response[“cvv”]);
$scope.$apply();
},
function(){
sweetAlert(“Oops…”, “Your card scan has failed”, “error”);
}
);

Categories: Uncategorized

Adding a #URL to #Google just got easier #SEO

May 9, 2017 Leave a comment

addurl

Step 1 of any SEO exercise is to add the URL to google; now you just can just search in the address bar, add URL to Google, and just add it below, without leaving the Google search.

Sure, Google will find your new website in a few days as long as you are doing “some” sort of off-page SEO activity; but this is the fast-track.

If you are planning to target Chinese users you’ll need to submit to Baidu also; and a couple of other minor search engines in China – for this I’d recommend using a service on fiverr to do this, since it is difficult to follow the procedure without knowing chinese.

Similarly, if you want to target the Russian market you will need to submit to Yandex. This has an english version, and you can get by without knowing any russian.

Just for context, I was relaunching two indian sites; http://india.appaio.com and http://india.listofcardealers.info

Categories: Uncategorized

Send #Email with Attachments from #Javascript

May 4, 2017 Leave a comment

logo

We’ve made a few updates to SMTPJS.com –

  1. We now allow attachments, so you can get your Javascript to include an attachment with the email;
     

    use sendWithAttachment:

    Email.sendWithAttachment(
        "from@you.com",
        "to@them.com",
        "Subject",
        "Body",
        "host.yourisp.com",
        "username",
        "password",
        "http://url-where-your-attachment-file-is-stored");
  2. We now assume your SMTP server supports SSL. If it doesn’t … it should! 🙂
  3. We’ve secured all client-server communications using HTTPS for added security.
  4. We now use CORS for client-server communication, which currently has 95.33 % browser coverage.
Categories: Uncategorized

#AWS #S3 upload with C# and HttpPostedFile

April 24, 2017 Leave a comment

Amazon-S3-outage-and-AWS-status

Uploading a file to AWS S3 via C# has been documented a million times, but I thought I’d put my own version here, a simple upload from a HTML page, a bit of ajax, and an ASPX file to upload the file to S3, and return a unique file name.

Firstly, you need to include the Nuget package with Install-Package AWSSDK.S3

Here’s the javascript:

$(document).ready(function(e) {
$(“#uploadimage”).on(‘submit’,
(function(e) {
e.preventDefault();
$.ajax({
url: “/api/imageUpload.aspx”, // Url to which the request is sent
type: “POST”, // Type of request to be send, called as method
data: new
FormData(
this), // Data sent to server, a set of key/value pairs (i.e. form fields and values)
contentType: false, // The content type used when sending data to the server.
cache: false, // To unable request pages to be cached
processData: false, // To send DOMDocument or non processed data file it is set to false
success: function(data) // A function to be called if request succeeds
{
$(“#previewing”).attr(“src”,data);
}
});}));});

Then, here is the api/imageUpload.aspx file codebehind (with keys removed)

var MyFiles = Request.Files;
for (int l = 0; l < MyFiles.Count; l++)
{
if (MyFiles.GetKey(l) != “file”) continue;
var file = MyFiles.Get(“file”);
var strExt = Path.GetExtension(file.FileName);
var filename = Guid.NewGuid().ToString(“D”) + strExt;
var cfg = new AmazonS3Config {RegionEndpoint = Amazon.RegionEndpoint.EUWest1};
const string bucketName = “xxxxxx”;
var s3Client = new AmazonS3Client(“xxxxx”, “xxxxx”, cfg);
var fileTransferUtility = new TransferUtility(s3Client);
var fileTransferUtilityRequest = new TransferUtilityUploadRequest
{
BucketName = bucketName,
InputStream = file.InputStream,
StorageClass = S3StorageClass.ReducedRedundancy,
Key = filename,
CannedACL = S3CannedACL.PublicRead
};
fileTransferUtility.Upload(fileTransferUtilityRequest);
Response.Write(“https://s3-eu-west-1.amazonaws.com/xxxxxx/&#8221; + filename);
}

Categories: Uncategorized

Bing Image search using #Cognitive Search

April 24, 2017 2 comments

bing speech

The Bing Image search based on the DataMarket service by Microsoft is closing down, and it is moving to cognitive services. This means that if you have code that uses an endpoint like this;

https://api.datamarket.azure.com/Bing/Search/v1/Image

It needs to be changed to code like this:

https://api.cognitive.microsoft.com/bing/v5.0/images/search

And your quote is reduced to 1,000 per month… 😦

Here’s some code I’ve written in C# to do a basic image search

public static List<String> GetImages(string searchText)
{
var strUrl = “https://api.cognitive.microsoft.com/bing/v5.0/images/search?q=&#8221; + searchText + “&count=1000”;
var wc = new WebClient();
wc.Headers[“Ocp-Apim-Subscription-Key”] = “xxxxxxxxxxx”;
var strJson = wc.DownloadString(strUrl);
var bing = JavascriptDeserialize<BingSearchObject>(strJson);
var lResults = new List<string>();
foreach (var result in bing.value)
{
var qs = HttpUtility.ParseQueryString(result.contentUrl);
lResults.Add(qs[“r”]);

}
return lResults;
}

Where “BingSearchObject” is defined as:

#region BingSearchResults
public class Instrumentation
{
public string pageLoadPingUrl { get; set; }
}

public class Thumbnail
{
public int width { get; set; }
public int height { get; set; }
}

public class InsightsSourcesSummary
{
public int shoppingSourcesCount { get; set; }
public int recipeSourcesCount { get; set; }
}

public class Value
{
public string name { get; set; }
public string webSearchUrl { get; set; }
public string thumbnailUrl { get; set; }
public string datePublished { get; set; }
public string contentUrl { get; set; }
public string hostPageUrl { get; set; }
public string contentSize { get; set; }
public string encodingFormat { get; set; }
public string hostPageDisplayUrl { get; set; }
public int width { get; set; }
public int height { get; set; }
public Thumbnail thumbnail { get; set; }
public string imageInsightsToken { get; set; }
public InsightsSourcesSummary insightsSourcesSummary { get; set; }
public string imageId { get; set; }
public string accentColor { get; set; }
}

public class Thumbnail2
{
public string thumbnailUrl { get; set; }
}

public class QueryExpansion
{
public string text { get; set; }
public string displayText { get; set; }
public string webSearchUrl { get; set; }
public string searchLink { get; set; }
public Thumbnail2 thumbnail { get; set; }
}

public class Thumbnail3
{
public string thumbnailUrl { get; set; }
}

public class Suggestion
{
public string text { get; set; }
public string displayText { get; set; }
public string webSearchUrl { get; set; }
public string searchLink { get; set; }
public Thumbnail3 thumbnail { get; set; }
}

public class PivotSuggestion
{
public string pivot { get; set; }
public List<Suggestion> suggestions { get; set; }
}

public class Thumbnail4
{
public string url { get; set; }
}

public class SimilarTerm
{
public string text { get; set; }
public string displayText { get; set; }
public string webSearchUrl { get; set; }
public Thumbnail4 thumbnail { get; set; }
}

public class BingSearchObject
{
public string _type { get; set; }
public Instrumentation instrumentation { get; set; }
public string readLink { get; set; }
public string webSearchUrl { get; set; }
public int totalEstimatedMatches { get; set; }
public List<Value> value { get; set; }
public List<QueryExpansion> queryExpansions { get; set; }
public int nextOffsetAddCount { get; set; }
public List<PivotSuggestion> pivotSuggestions { get; set; }
public bool displayShoppingSourcesBadges { get; set; }
public bool displayRecipeSourcesBadges { get; set; }
public List<SimilarTerm> similarTerms { get; set; }
}
#endregion

Categories: Uncategorized