

Η .net βιβλιοθήκη επιτρέπει στους προγραμματιστές που γράφουν σε C#, VB.net και άλλες γλώσσες που χρησιμοποιούν .net DLLs, να στέλνουν μηνύματα πολύ εύκολα χρησιμοποιώντας την.
Μπορείτε να χρησιμοποιήσετε τα παρεχόμενα DLLs μέσα από ASP.net, C#, VB.NET applications όπως και C# scripts (http://www.csscript.net/), με τον συνήθη τρόπο που κάνετε include οποιοδήποτε DLL (https://msdn.microsoft.com/en-us/library/wkze6zky.aspx).
Θα πρέπει να κάνετε include και τα 2 DLL files (Newtonsoft.Json.dll & Terracom.Liveall.ConnectorLib.dll)
Το target framework για το συγκεκριμένο library είναι το .net 4.6.1. Μπορείτε να κατεβάσετε το library από το παρακάτω link.
Η κλάση [Terracom.Liveall.ConnectorLib.Connector] καλεί ένα web-service για τη μαζική αποστολή, αφού πρώτα μετατρέψει τα δεδομένα σε μορφή JSON.
Το web-service αυτό είναι το ίδιο που περιγράφεται κι εδώ.
Για να τη χρησιμοποιήσουμε ενεργούμε ως εξής:
// *************************** VARIOUS LIBRARY TYPES FOR NAMESPACE [Terracom.Liveall.ConnectorLib] namespace Terracom.Liveall.ConnectorLib { public enum SMS_SERVICE_ERROR_CODES { NO_ERROR = 0, EMPTY_SENDERID = 1, INVALID_SENDERID = 2, UNAUTHORIZED_NUM_SENDER_ID = 3, ALPHA_SENDERID_TOO_LONG = 4, NUM_SENDERID_TOO_LONG = 5, INTERR_NO_SMS_TYPE_PROV = 6, INTERR_NO_SMS_TEXT = 7, INTERNAL_ERROR = 8, ILLEGAL_SENDERID = 9, SMS_TEXT_EMPTY = 10, SMS_TEXT_LEN_TOO_LONG = 11, NO_DESTINATION_NUMBERS_PROVIDED = 12, INVALID_DESTINATION_NUMBER = 13, INVALID_GREEK_DEST_NUM = 14, INVALID_CYPR_DEST_NUM = 15, INVALID_ITALIAN_DEST_NUM = 16, NOTFOUND_BUFFERED_BATCH_HEAD = 17, INSUFFICIENT_USER_BALANCE = 18, INTERR_COULDNT_FOUND_BUFFBATCH = 19, INVALID_BATCHID_GIVEN = 20, ERROR_CREATING_SMSLOGFILE = 21, ERROR_WHEN_TRYING_TO_BLACKLIST = 22, ERROR_ON_GETTING_CONTACTS = 23, ERROR_NO_CONTACT_TO_DELETE = 24, RECORD_ALREADY_EXISTS = 25, RECORD_DOES_NOT_EXISTS = 26, RECORD_CHANGE_FROM_DIFF_SESSION = 27, PBOOK_CONTACT_CELL_EMPTY = 28, PBOOK_CONTACT_NAME_EMPTY = 29, PBOOK_INVLD_CELL = 30, PBOOKGRP_NO_GROUP_PRVD_TO_DEL = 31, ACCSETT_EMPTY_SETTINGS = 32, INVALID_IMPORT_FILE = 33, INSUFFICIENT_INVLD_PARAMETER_DATA = 34, ERROR_IMPORTING_CONTACTS = 35, INS_UPD_DUPLICATE_CELL_FOUND = 36, NOT_ENOUGH_CREDITS_FOR_HLR_QUERY = 37, ERROR_WHEN_TRYING_SUBMIT_USERHLR = 38, API_TOKEN_NOT_PROVIDED = 39, API_TOKEN_MISMATCH = 40, INVALID_SCHEDULED_SENDOUT_DATE = 41, SMSIDS_PARAMETER_INVALID = 42, NO_SUBMITTED_SMS_FOUND = 43, INVALID_API_TOKEN = 44, ERROR_HTTP_RESPONSE = 1001, ERROR_DESERIALIZING_JSON = 1002, ERROR_MAKING_WEB_REQUEST = 1003, ERROR_EMPTY_WEB_RESPONSE = 1004, ERROR_LIBRARY_INIT_NOK = 4001, ERROR_DEST_MSG_COUNT_MISMATCH = 4002, ERROR_DEST_MSG_NULL = 4003, ERROR_DEST_MSG_COUNT_ZERO = 4004, } } // *************************** VARIOUS LIBRARY TYPES FOR NAMESPACE [Terracom.Liveall.ConnectorLib.Models] namespace Terracom.Liveall.ConnectorLib.Models { public class SMSLogParameters { public string submit_date { get; set; } public int? timezone_offset { get; set; } public string senderid { get; set; } public string destination { get; set; } public uint sms_id { get; set; } public uint batch_id { get; set; } public uint gt_sms_id { get; set; } } //############################################################################# public class HttpApiJSMSParts { public string destination { get; set; } public string message { get; set; } } //############################################################################# public class OP_RESULT_BASE { public OP_RESULT_BASE() { ErrorCode = SMS_SERVICE_ERROR_CODES.NO_ERROR; ErrorMessage = null; } public SMS_SERVICE_ERROR_CODES ErrorCode { get; set; } public string ErrorMessage { get; set; } } //############################################################################# public class OP_RESULT : OP_RESULT_BASE { public OP_RESULT() :base() { SubmitInfo = null; } public SubmissionInfo[] SubmitInfo { get; set; } } //############################################################################# public class OP_RESULT_SMSSTAT : OP_RESULT_BASE { public OP_RESULT_SMSSTAT() :base() { } public SmsStatusInfo[] StatusInfo { get; set; } } //############################################################################# public class OP_RESULT_ACCOUNT_INFO : OP_RESULT_BASE { public OP_RESULT_ACCOUNT_INFO() :base() { } public AccountBalanceInfo AccountBalance { get; set; } } //############################################################################# public class OP_RESULT_SMSLOG : OP_RESULT_BASE { public OP_RESULT_SMSLOG() : base() { } public Models.SMSLogRow[] SMSLogRows { get; set; } } //############################################################################# } // *************************** SAMPLE PROGRAM using System; using System.Linq; using System.Threading.Tasks; //using Terracom.Liveall.ConnectorLib; namespace Terracom.Liveall.ConnectorLib.Tester { class Program { static void Main(string[] args) { Connector sms_connector = new Connector(); Models.OP_RESULT initRes = sms_connector.Init("YOUR_ACCOUNT_API_TOKEN", "SenderName"); /*όπου: OP_RESULT είναι η κλάση με το αποτέλεσμα της κλήσης των συναρτήσεων της Connector class api_token είναι το secret api token (η ταυτοποίηση του account σας) που μπορείτε <a href="https://www.liveall.eu/user">να το βρείτε εδώ</a> sender_id είναι ο αποστολέας που θέλετε να φαίνεται στο κινητό του παραλήπτη */ //------------------------------------------------------------------------------------- // Send SMS synchronously - this actually calls SendSmsAsync() and returns the .Result property #region ~~~~~~~~~~~~~~~~~~~~~~~~ SYNC SMS SENDOUT /* OP_RESULT είναι η κλάση με το αποτέλεσμα της κλήσης των συναρτήσεων της Connector class messages είναι ένας πίνακας με όλα τα ζευγάρια αριθμών και μηνυμάτων (περιγράφεται παρακάτω) που θέλουμε να στείλουμε. price_category (προεραιτική) είναι η κατηγορία τιμών που θέλουμε να χρησιμοποιήσουμε. 0 για normal & 1 για low cost send_on (προεραιτική) είναι η ώρα που θέλουμε να αποσταλεί. Η μεταβλητή αυτή είναι τύπου DateTime nullable */ Models.OP_RESULT res1 = sms_connector.SendSms( new Models.HttpApiJSMSParts[] { new Models.HttpApiJSMSParts { destination = "306901234567", message = "Test message (sync) - English. Δοκιμαστικό μήνυμα (Ελληνικά)" } }); if (res1.ErrorCode != SMS_SERVICE_ERROR_CODES.NO_ERROR) Console.WriteLine("Problem sending SMS. Error message: {0}", res1.ErrorMessage); else Console.WriteLine("SMS sent sucessfully! SMSId for 1st sent message: {0}", res1.SubmitInfo.FirstOrDefault().smsid); #endregion //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- // Send SMS asynchronoysly - When you're in a sync method you can use Task class and set the // async keyword before the lamda method declaration #region ~~~~~~~~~~~~~~~~~~~~~~~~ TEST SMS SENDOUT ASYNC Task tSout = Task.Run(async () => { /* OP_RESULT είναι η κλάση με το αποτέλεσμα της κλήσης των συναρτήσεων της Connector class. Η async συνάρτηση μπορεί να κληθεί με τoν await operator messages είναι ένας πίνακας με όλα τα ζευγάρια αριθμών και μηνυμάτων (περιγράφεται παρακάτω) που θέλουμε να στείλουμε. price_category (προεραιτική) είναι η κατηγορία τιμών που θέλουμε να χρησιμοποιήσουμε. 0 για normal & 1 για low cost send_on (προεραιτική) είναι η ώρα που θέλουμε να αποσταλεί. Η μεταβλητή αυτή είναι τύπου DateTime nullable */ Models.OP_RESULT res = await sms_connector.SendSmsAsync( new Models.HttpApiJSMSParts[] { new Models.HttpApiJSMSParts { destination = "306901234567", message = "Test message (async) - English. Δοκιμαστικό μήνυμα (Ελληνικά)" } }); if (res.ErrorCode != SMS_SERVICE_ERROR_CODES.NO_ERROR) Console.WriteLine("Problem sending SMS. Error message: {0}", res.ErrorMessage); else Console.WriteLine("SMS sent sucessfully! SMSId for 1st sent message: {0}", res.SubmitInfo.FirstOrDefault().smsid); }); // Wait until async code finishes execution tSout.Wait(); #endregion //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- // Fetches the SMS history of a specific date // For more info see at https://www.liveall.eu/sms-services/httpapi#getSMSLogAnc #region ~~~~~~~~~~~~~~~~~~~~~~~~ GET SMS HISTORY OF A SPECIFIC DATE Task tlog = Task.Run(async () => { Models.OP_RESULT_SMSLOG res = await sms_connector.GetSMSHistoryAsync(new Models.SMSLogParameters() { submit_date = "20200402", //timezone_offset = 2, //sms_id = 47680777, }); if (res.ErrorCode == SMS_SERVICE_ERROR_CODES.NO_ERROR) { Console.WriteLine("Results\r\n\r\n" + "Sms id\t\tBatch id\tSender id\tDestination\tStatus DT\tStatus\t\tQty\t\tMsg charge\tIM Status\r\n" + "========================================================================================================================================="); foreach (var line in res.SMSLogRows) Console.WriteLine($"{line.SMS_ID}\t{line.BatchID}\t\t{line.Sender_ID}\t{line.Destination}\t{line.LastStatusUnixDatetime}\t" + $"{line.StatusStr}\t{line.SMS_Qty}\t\t{line.MessageCharge}\t\t{line.InstantMessageStatusStr}"); } else { Console.WriteLine($"Problem while trying to fetch SMS log data: {res.ErrorCode} - {res.ErrorMessage}"); } }); tlog.Wait(); Console.ReadLine(); return; #endregion //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- // Gets the status of sent message(s) providing their sms_id(s) in array // The same applies here as SendSmsAsync() regarding its async usage #region ~~~~~~~~~~~~~~~~~~~~~~~~ GET SENT SMS STATUS BY ID var tStat = Task.Run(async () => { Models.OP_RESULT_SMSSTAT res = await sms_connector.GetSMSStatusAsync(new uint[] { 99999998, 99999999 }); if (res.ErrorCode == SMS_SERVICE_ERROR_CODES.NO_ERROR) { foreach (var sms_stat in res.StatusInfo) Console.WriteLine($"sms_id: {sms_stat.sms_id}, recipient: {sms_stat.recipient}, " + $"last_status_time: {sms_stat.last_status_time}, status_code: {sms_stat.status_code}, " + $"ststus_txt: {sms_stat.status_txt}"); } else { Console.WriteLine($"Failed to get SMS status: {res.ErrorCode} - {res.ErrorMessage}"); } }); // Wait until async code finishes execution tStat.Wait(); #endregion //------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------- // Gets various info about the account - currently this returns the current balance and the remaining SMS count // GetAccountBalanceAsync() has an optional parameter (countryprefix). When this is provided, it can calculate the // remaining SMS count - for the provided country, otherwise only the balance is returned. For example if you // provide 30, it will return the remaining SMS for Greece #region ~~~~~~~~~~~~~~~~~~~~~~~~ GET ACCOUNT BALANCE Task t = Task.Run(async () => { Models.OP_RESULT_ACCOUNT_INFO res = await sms_connector.GetAccountBalanceAsync("30"); if (res.ErrorCode == SMS_SERVICE_ERROR_CODES.NO_ERROR) Console.WriteLine($"Balance: {res.AccountBalance.Balance}, SMS balance: {res.AccountBalance.SmsRemainCount}"); else Console.WriteLine($"Problem when trying to get account info: {res.ErrorCode} - {res.ErrorMessage}"); }); t.Wait(); #endregion //------------------------------------------------------------------------------------- Console.WriteLine("Press Enter to terminate..."); Console.ReadLine(); } } }
Για VB.NET υπάρχει το παρακάτω παράδειγμα:
Imports Terracom.Liveall.ConnectorLib Module Module1 Sub Main() Dim sms_connector As New Connector() Dim res As Models.OP_RESULT Dim submit_info(1) As Models.HttpApiJSMSParts Dim si As New Models.HttpApiJSMSParts si.destination = "306912345678" si.message = "Test message - English. Δοκιμαστικό μήνυμα (Ελληνικά)" submit_info(0) = si sms_connector.Init("MY_VERY_SECRET_TOKEN", "mySenderID") res = sms_connector.SendSms(submit_info, 0) If res.ErrorCode <> SMS_SERVICE_ERROR_CODES.NO_ERROR Then Console.WriteLine("Problem sending SMS. Error message: {0}", res.ErrorMessage) Else Console.WriteLine("SMS sent sucessfully! SMSId for 1st sent message: {0}", res.SubmitInfo.FirstOrDefault().smsid) End If End Sub End Module