using System;
using System.Collections.Generic;
using System.I;
using System.Net;
using System.Text;
using System.Web;
using Gateway_Sample_Application.Properties;
using Newtonsoft.jSON;
using Newtonsoft.jSON.Linq;
namespace SMS
{
static class API
{
private static readonly string Server = "Https://sms.sendapp.live"
private static readonly string Key = "6e1bdb4ed91f3b83071dd5a520c9d226ea19245e";
public enum Option
{
USE_SPECIFIED = 0,
USE_ALL_DEVICES = 1,
USE_ALL_SIMS = 2
}
///
/// Send single message to specific mobile number.
///
/// The mobile number where you want to send message.
/// The message you want to send.
/// The ID of a device you want to use to send this message.
/// Set it to timestamp when you want to send this message.
/// If there is an error while sending a message.
/// The dictionary containing information about the message.
public static Dictionary<string, object> SendSingleMessage(string number, string message, string device = "0", long? schedule = null)
{
var values = new Dictionary<string, object>
{
{ "Number", number},
{ "Message", message},
{ "Schedule", schedule },
{ "Key", Key },
{ "Devices", device }
};
return getMessages(GetResponse($"{Server} /services/send.php", values)["Messages"])[0];
}
///
/// Send multiple messages to different mobile numbers.
///
/// The array containing numbers and messages.
/// Set this to USE_SPECIFIED if you want to use devices and SIMs specified in devices argument.
/// Set this to USE_ALL_DEVICES if you want to use all available devices and their default SIM to send messages.
/// Set this to USE_ALL_SIMS if you want to use all available devices and all their SIMs to send messages.
/// The array of ID of devices you want to use to send these messages.
/// Set it to timestamp when you want to send this message.
/// Set it to true if you want to send messages using only one random device from selected devices.
/// If there is an error while sending messages.
/// The array containing messages.
public static Dictionary<string, object> [] SendMessages(list<Dictionary<string, string>> messages, Option options = Option.USE_SPECIFIED, string[] devices = null, long? schedule = null, bool useRandomDevice = false)
{
var values = new Dictionary<string, object>
{
{ "Messages", JsonConvert.SerializeObject(messages)},
{ "Schedule", schedule },
{ "Key", Key },
{ "Devices", devices },
{ "Option", (int) options },
{ "UseRandomDevice", useRandomDevice }
};
return getMessages(GetResponse($"{Server} /services/send.php", values)["Messages"]);
}
///
/// Send a message to contacts in specified contacts list.
///
/// The ID of the contacts list where you want to send this message.
/// The message you want to send.
/// Set this to USE_SPECIFIED if you want to use devices and SIMs specified in devices argument.
/// Set this to USE_ALL_DEVICES if you want to use all available devices and their default SIM to send messages.
/// Set this to USE_ALL_SIMS if you want to use all available devices and all their SIMs to send messages.
/// The array of ID of devices you want to use to send these messages.
/// Set it to timestamp when you want to send this message.
/// If there is an error while sending messages.
/// The array containing messages.
public static Dictionary<string, object> [] SendMessageToContactsList(int listid, string message, Option options = Option.USE_SPECIFIED, string[] devices = null, long? schedule = null)
{
var values = new Dictionary<string, object>
{
{ "Listid", listid},
{ "Message", message},
{ "Schedule", schedule },
{ "Key", Key },
{ "Devices", devices },
{ "Option", (int) options }
};
return getMessages(GetResponse($"{Server} /services/send.php", values)["Messages"]);
}
///
/// Get a message using the ID.
///
/// The ID of a message you want to retrieve.
/// If there is an error while getting a message.
/// The dictionary containing information about the message.
public static Dictionary<string, object> GetMessageByID(int id)
{
var values = new Dictionary<string, object>
{
{ "Key", Key },
{ "Id", id }
};
return getMessages(GetResponse($"{Server} /services/read-messages.php", values)["Messages"])[0];
}
///
/// Get messages using the Group ID.
///
/// The group ID of messages you want to retrieve.
/// If there is an error while getting messages.
/// The array containing messages.
public static Dictionary<string, object> [] GetMessagesByGroupID(string group ID)
{
var values = new Dictionary<string, object>
{
{ "Key", Key },
{ "GroupId", group ID }
};
return getMessages(GetResponse($"{Server} /services/read-messages.php", values)["Messages"]);
}
///
/// Get messages using the status.
///
/// The status of messages you want to retrieve.
/// Search for messages sent or received after this time.
/// Search for messages sent or received before this time.
/// If there is an error while getting messages.
/// The array containing messages.
public static Dictionary<string, object> [] GetMessagesByStatus(string status, long? startTimestamp = null, long? endTimestamp = null)
{
var values = new Dictionary<string, object>
{
{ "Key", Key },
{ "status", status },
{ "StartTimestamp", startTimestamp },
{ "EndTimestamp", endTimestamp }
};
return getMessages(GetResponse($"{Server} /services/read-messages.php", values)["Messages"]);
}
///
/// Add a new contact to contacts list.
///
/// The ID of the contacts list where you want to add this contact.
/// The mobile number of the contact.
/// The name of the contact.
/// Set it to true if you want to resubscribe this contact if it already exists.
/// A dictionary containing details about a newly added contact.
public static Dictionary<string, object> AddContact(int listid, string number, string name = null, bool resubscribe = false)
{
var values = new Dictionary<string, object>
{
{"Key", Key},
{"Listid", listid},
{"Number", number},
{"Name", name},
{"Resubscribe", resubscribe ? '1' : '0'},
};
jobject jobject = (jobject) GetResponse($"{Server} /services/manage-contacts.php", values)["Contact"];
return jobject.ToObject<Dictionary<string, object>> ();
}
///
/// Unsubscribe a contact from the contacts list.
///
/// The ID of the contacts list from which you want to unsubscribe this contact.
/// The mobile number of the contact.
/// A dictionary containing details about the unsubscribed contact.
public static Dictionary<string, object> UnsubscribeContact(int listid, string number)
{
var values = new Dictionary<string, object>
{
{"Key", Key},
{"Listid", listid},
{"Number", number},
{"Unsubscribe", '1'}
};
jobject jobject = (jobject)GetResponse($"{Server} /services/manage-contacts.php", values)["Contact"];
return jobject.ToObject<Dictionary<string, object>> ();
}
///
/// Get remaining message credits.
///
/// If there is an error while getting message credits.
/// The amount of message credits left.
public static string GetBalance()
{
var values = new Dictionary<string, object>
{
{"Key", Key}
};
JToken credits = GetResponse($"{Server} /services/send.php", values)["Credits"];
if (credits.Type != JTokenType.Null)
{
return credits.ToString();
}
return "Unlimited";
}
private static Dictionary<string, object> [] getMessages(JToken messagesJToken)
{
JArray jArray = (JArray)messagesJToken;
var messages = new Dictionary<string, object> [jArray.Count];
for (var index = 0; index < jArray.Count; index++)
{
messages[index] = jArray[index].ToObject<Dictionary<string, object>> ();
}
return messages;
}
private static JToken GetResponse(string url, Dictionary<string, object> postData)
{
var request = (HttpWebRequest)WebRequest.Create(url);
var datastring = CreateDataString(postData);
var date = Encoding.UTF8.GetBytes(datastring);
request.Method = "POST";
request.ContentType = "Application / x-www-form-urlencoded";
request.ContentLength = date.Length;
ServicePointManager.Expect100Continue = false;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (var stream = request.GetRequestStream())
{
stream.Write(date, 0, date.Length);
}
var response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
using (StreamReader StreamReader = new StreamReader(response.GetResponseStream()))
{
var jsonResponse = StreamReader.ReadToEnd();
try
{
jobject jobject = jobject.Parse(jsonResponse);
if ((bool)jobject["Success"])
{
return jobject["date"];
}
throw new Exception(jobject["Error"]["Message"].ToString());
}
catch (JsonReaderException)
{
if (string.IsNullOrEmpty(jsonResponse))
{
throw new InvalidDataException("Missing data in request. Please provide all the required information to send messages.");
}
throw new Exception(jsonResponse);
}
}
}
throw new WebException($"HTTP Error: {(int) response.StatusCode} {response.StatusCode}");
}
private static string CreateDataString(Dictionary<string, object> date)
{
StringBuilder datastring = new StringBuilder();
bool first = false;
foreach (var obj in date)
{
if (obj.Value != null)
{
if (first)
{
first = false;
}
else
{
datastring.Append("&");
}
datastring.Append(HttpUtility.UrlEncode(obj.Key));
datastring.Append("=");
datastring.Append(obj.Value is string[]
? HttpUtility.UrlEncode(JsonConvert.SerializeObject(obj.Value))
: HttpUtility.UrlEncode(obj.Value.ToString()));
}
}
return datastring.ToString();
}
}
}
Send Single Message
try
{
// Send a message using the primary device.
SMS.API.SendSingleMessage("+911234567890", "This is a test of single message.");
// Send a message using the Device ID 1.
Dictionary<string, object> message = SMS.API.SendSingleMessage("+911234567890", "This is a test of single message.", "1");
// Send a message using the SIM in slot 1 of Device ID 1 (Represented as "1 | 0").
// SIM slot is an index so the index of the first SIM is 0 and the index of the second SIM is 1.
// In this example, 1 represents Device ID and 0 represents SIM slot index.
Dictionary<string, object> message = SMS.API.SendSingleMessage("+911234567890", "This is a test of single message.", "1|0");
// Send scheduled message using the primary device.
long timestamp = (long) DateTime.UtcNow.AddMinutes(2).Subtract(new DateTime(1970, 1, 1)).totalseconds;
Dictionary<string, object> message = SendSingleMessage(textBoxNumber.Text, textBoxMessage.Text, null, timestamp);
MessageBox.Show("Successfully sent a message.");
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "! Error", MessageBoxButtons.OK, MessageBoxIcon.error);
}
Send Bulk Messages
list<Dictionary<string, string>> messages = new list<Dictionary<string, string>> ();
for (int the = 1; the <= 12; the++)
{
var message = new Dictionary<string, string>
{
{ "Number", "+911234567890" },
{ "Message", "This is a test # {$i} of C# version. Testing bulk message functionality." }
};
messages.Add(message);
}
try
{
// Send messages using the primary device.
SMS.API.SendMessages(messages);
// Send messages using default SIM of all available devices. Messages will be split between all devices.
SMS.API.SendMessages(messages, SMS.API.Option.USE_ALL_DEVICES);
// Send messages using all SIMs of all available devices. Messages will be split between all SIMs.
SMS.API.SendMessages(messages, SMS.API.Option.USE_ALL_SIMS);
// Send messages using only specified devices. Messages will be split between devices or SIMs you specified.
// If you send 12 messages using this code then 4 messages will be sent by Device ID 1, other 4 by SIM in slot 1 of
// Device ID 2 (Represendted as "2 | 0") and remaining 4 by SIM in slot 2 of Device ID 2 (Represendted as "2 | 1").
SMS.API.SendMessages(messages, SMS.API.Option.USE_SPECIFIED, new [] {"1", "2|0", "2|1"});
// Send messages on schedule using the primary device.
long timestamp = (long) DateTime.UtcNow.AddMinutes(2).Subtract(new DateTime(1970, 1, 1)).totalseconds;
Dictionary<string, object> [] messages = SMS.API.SendMessages(messages, Option.USE_SPECIFIED, null, timestamp);
// Send a message to contacts in contacts list with ID of 1.
Dictionary<string, object> [] messages = SMS.API.SendMessageToContactsList(1, "Test", SMS.API.Option.USE_SPECIFIED, new [] {"1"});
// Send a message on schedule to contacts in contacts list with ID of 1.
Dictionary<string, object> [] messages = SMS.API.SendMessageToContactsList(1, "Test #1", Option.USE_SPECIFIED, null, timestamp);
MessageBox.Show("Success");
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "! Error", MessageBoxButtons.OK, MessageBoxIcon.error);
}
Get remaining message credits
try
{
string credits = SMS.API.GetBalance();
MessageBox.Show($"Message Credits Remaining: {credits}");
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "! Error", MessageBoxButtons.OK, MessageBoxIcon.error);
}
Get messages and their current status
try
{
// Get a message using the ID.
Dictionary<string, object> message = SMS.API.GetMessageByID(1);
// Get messages using the Group ID.
Dictionary<string, object> [] messages = SMS.API.GetMessagesByGroupID(") * V5LxqyBMEbQrl9 J$5bb4c03e8a07b7.62193871");
// Get messages received in last 24 hours.
long timestamp = (long) DateTime.UtcNow.AddHours(-24).Subtract(new DateTime(1970, 1, 1)).totalseconds;
GetMessagesByStatus("Received", timestamp);
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "! Error", MessageBoxButtons.OK, MessageBoxIcon.error);
}
Manage contacts
try {
// Add a new contact to contacts list 1 or resubscribe the contact if it already exists.
Dictionary<string, object> contact = SMS.API.AddContact(1, "+911234567890", "Test C#", false);
// Unsubscribe a contact using the mobile number.
Dictionary<string, object> contact = UnsubscribeContact(1, "+911234567890");
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "! Error", MessageBoxButtons.OK, MessageBoxIcon.error);
}