This article is available in English too, check it out here.
Code: Geming.twittoo.msi
المحتويات
محتويات هذا الموضوع:
- المحتويات
- مقدمة
- برمجة Twitter
- دوال الـ API
- الدوال البسيطة
- المدخلات للدوال
- التوثيق Authentication
- تويتر والدوت نت
- الوصول إلى الدوال
- الدوال والتوثيق
- الترميز Encoding
- عناصر البيانات
- تخزين البيانات
- المثال، برنامج twittoo
- الوصف
- لقطات
- التصميم
- تقصير العناوين URL Shortening
- التحميل
- خاتمة
مقدمة
درسنا اليوم ليس كأي سابق له، درسنا اليوم يتكلم عن موضوع مميز للغاية وهو كيفية برمجة تويتر Twitter.
هل تستخدم Twitter؟ هل لديك حساب في Twitter؟ هل تريد أن تنشئ برنامج أو موقع إنترنت يقوم بالارتباط مع تويتر Twitter؟ إذا كانت إجابتك بنعم، فحتما سوف تعجبك هذه الصفحات القليلة والتي تتحدث عن تويتر Twitter وكيفية استغلاله برمجيا.
درسنا اليوم ليس مقصورا على Twitter فقط! بل إنه يعلمك أفكار جديدة ومتنوعة منها كيفية التعامل مع بيانات الـ XML، وكيفية التعامل مع دوال ومكاتب الويب Web APIs وغيرها. بجانب هذا سوف نتعرض لفكرة أكثر من رائعة وهي كيفية استخدام خدمات تقصير العناوين URL Shortening مثل http://is.gd وبرمجتها والاستفادة منها.
علاوة على هذا كله، يمكنك تحميل مثال رائع عبارة عن برنامج Desktop بسيط للتعامل مع تويتر Twitter.
بداية وقبل أن نبدأ أحب أن أقدم لك حساب الـ Twitter الخاص بي وهو @elsheimy.
أحب أن أنبه على أن برمجة تويتر Twitter هي موضوع كبير للغاية يحتاج إلى كتاب بأكمله! لهذا فطريقنا في هذا الدرس سوف يكون بشرح الأفكار وإعطاء أمثلة حول الدوال وغيرها، وستترك باقي الدوال للقارئ يبحث فيها باستخدام الشرح الخاص بموقع Twitter.
لن نطيل أكثر، هيا بنا إلى الموضوع.
برمجة Twitter
بداية، يجب عليك معرفة بعض الأشياء قبل الشروع في الكود من أهمها ما هو طقم البرمجة أو Twitter API؟ الـ Twitter API هي عبارة عن مجموعة كبيرة من الدوال كل واحدة فيها لها وظيفتها الخاصة بها.
مثلا، هناك دالة تقوم بإرجاع الـ Tweets الخاصة بالأصدقاء الذين تتبعهم، ودالة ثانية تقوم بإرجاع قائمة بالأصدقاء الذين تتبعهم Following، ودالة ثالثة تقوم بإرجاع الأصدقاء الذين يتبعوك Following. بالإضافة إلى ذلك فهناك دالة لإضافة Status أو كما تسمى Update أو Tweet جديدة، وأخرى لعمل Retweet، وأخرى لعمل Reply، وأخيرة لعمل Direct Message.
ولكن، كيف هي هذه الدوال؟ هل هذه الدوال هي عبارة عن مكتبة Library مثلا نقوم بإرفاقها كمرجع Reference في مشروعنا؟ هل هذه الدوال هي عبارة عن خدمة ويب Web Service أو خدمة WCF Service؟ لا هذا ولا ذاك! دوال الـ Twitter ببساطة عبارة عن عناوين إنترنت Web Addresses أو نقاط وصول Endpoints. كيف هذا؟
نأخذ مثلا مثال، هناك الدالة statuses/public timeline method مثلا والتي تقوم بإرجاع آخر تحديثات Updates (أو Tweets) بطريقة عشاوئية، فهذه الدالة لديها العنوان http://api.twitter.com/1/statuses/public_timeline.xml، فنلاحظ أنه يمكنك نسخ هذا العنوان ووضعه في المتصفح الخاص بك ومشاهدة النتائج والتي هي عبارة عن بيانات XML.
ولكن كيف نتعامل مع هذه الدوال من خلال الكود؟ يمكننا من خلال الأنواع Classes الموجودة في الـ Namespace المسماة System.Net بأن نقوم بعمل طلب Request على الدالة (عن طريق عنوانها) ونحصل على الإجابة Response المطلوبة والتي هي عبارة عن بيانات XML أيضا. وبعد حصولنا على هذه البيانات يمكننا معالجتها عن طريق الـ Classes الموجودة في System.Xml كي نستطيع عرضها بالشكل المناسب في موقعنا.
كما ذكرنا، سيكون عمدتنا في هذا الموضوع بإذن الله هو بوابة برمجة تويتر http://apiwiki.twitter.com، سوف نتكلم عن بعض الدوال وستترك باقيها للقارئ يبحث عنها في الموقع.
دوال الـ API
هنا سوف نأخذ جولة سريعة في طقم البرمجة لـ Twitter وسوف نستعرض بعض من أهم الدوال لـ API.
الدوال البسيطة
الدالة الأولى معنا وهي دالة الـ Public Timeline وهي دالة بسيطة أي أنها لا تحتاج إلى توثيق للمستخدم Authentication (أي لا تحتاج إلى اسم الحساب وكلمة المرور) وأيضا لا تحتاج إلى أي مدخلات Arguments.
تقوم هذه الدالة statuses/public timeline method بإرجاع أحدث 20 تحديث Tweet (أو Update) من مستخدمين تويتر بطريقة عشوائية. عنوان هذه الدالة هو http://api.twitter.com/1/statuses/public_timeline.xml. إذا قمت بنسخ هذا العنوان ولصقه في المتصفح الخاص بك سوف تحصل على نتيجة مشابهة للنتيجة التالية:
Wed Apr 14 19:32:07 +0000 2010 12179999634 35 Ingenious Examples of Footwear - http://su.pr/1JxMAr <a href="http://apiwiki.twitter.com/" rel="nofollow">API</a> false false 15736190 Smashing Magazine smashingmag Freiburg, Germany Vitaly Friedman, editor-in-chief of SmashingMagazine.com and Noupe.com, online magazines dedicated to designers and developers.http://www.smashingmagazine.com false 166019 B2DFDA 333333 f51616 ffffff eeeeee 394 Tue Aug 05 14:00:40 +0000 2008 4 -10800 <time>Greenland</time>
true false true false false 8703 en false . . .
نلاحظ أن النتيجة هي عبارة عن بيانات XML. ونلاحظ أيضا أن هذه البيانات لها تركيب معين، والجميل في تويترTwitter هو أنه هناك نظام وتركيب معين XML Schema ينطبق على جميع البيانات من نفس النوع. فهذه البيانات هي عبارة عن قائمة من التحديثات Statuses، فبالتالي أي قائمة من التحديثات مثل تحديثات الأصدقاء لمستخدم معين أو تحديثات هذا المستخدم نفسه سوف يكون لها نفس النظام والتركيب Schema.
المدخلات للدوال
بعض الدوال تحتاج إلى مدخلات. من هذه الدوال دالة users/show method وهي تقوم بإرجاع التحديثات الخاصة بمستخدم معين. وهذه الدالة لديها العنوان http://api.twitter.com/1/users/show.xml وهي تطلب إما تحديد الكود المعرف ID الخاص بالمستخدم المطلوب وإما تحديد اسم الظهور للمستخدم Screen Name.
إذا فعندما تريد الحصول على تحديثات من المستخدم @elsheimy، فإنك تقوم النداء على هذه الدالة بواحدة من أربعة طرق:
- http://api.twitter.com/1/users/show.xml?id=19645411
- http://api.twitter.com/1/users/show.xml?id=elsheimy
- http://api.twitter.com/1/users/show.xml?user_id=19645411
- http://api.twitter.com/1/users/show.xml?screen_name=elsheimy
فتكون النتيجة لهذه الدالة هي بيانات XML مطابقة تماما لما يظهر لك إذا ذهبت إلى صفحة المستخدم مثلا http://twitter.com/elsheimy.
19645411 Mohammad Elsheimy Elsheimy KB, Egypt Technology evangelist from Egypt born in 1991http://justlikeamagic.com false 278 DBE9ED 333333 CC3366 E6F6F9 DBE9ED 179 Wed Jan 28 10:47:36 +0000 2009 7 7200 <time>Cairo</time>
false true false 1877 en false Wed Apr 21 16:21:46 +0000 2010 12585240751 I'm reading this, it's really hot: #RFC 2616 - Hypertext Transfer Protocol -- #HTTP /1.1 http://bit.ly/b1353K #tech #www <a href="http://bit.ly" rel="nofollow">bit.ly</a> false false
نلاحظ أن هذه البيانات لها نفس التركيب Schema مثل سابقتها.
التوثيق Authentication
بعض الدوال تحتاج إلى عملية توثيق Authentication للمستخدم. فمثلا، الدوال التي تعرض التحديثات Statuses الخاصة بأصدقاء هذا المستخدم تحتاج إلى إدخال اسم المستخدم وكلمة المرور كي يتسنى له مشاهدة البيانات.
فالقاعدة هي كالآتي: البيانات التي لا يسمح لك بمشاهدتها في موقع http://Twitter.com قبل عملية الدخول Sign in هي التي تحتاج دوالها إلى توثيق Authentication، فعملية التوثيق هي بمثابة عملية الدخول Sign in.
هناك نوعين من التوثيق:
- التوثيق البسيط Basic Authentication:
وفيها نقوم بإرفاق البيانات المطلوبة (اسم المستخدم وكلمة المرور) في كل عملية نداء Request لأي دالة. هذه الطريقة هي الأسهل وللأسف أعلن Twitter أنها سوف تمنع في وقت لاحق. سوف نستخدم هذا النوع في درسنا. - توثيق OAuth:
وهي عملية أكثر تعقيدا، وتتطلب موضوع بأكلمه، لذلك لن نستخدمها في درس اليوم وسوف نقوم بشرحها في درس آخر بإذن الله تعالى. وهذه العملية تعتمد على قيام المبرمج بتسجيل برنامجه في Twitter والحصول على بيانات خاصة به.
من الدوال التي تحتاج إلى توثيق دالة statuses/friends timeline method وهي التي تقوم بإرجاع التحديثات الخاصة بأصدقاء المستخدم. وهذه الدالة لها العنوان http://api.twitter.com/1/statuses/friends_timeline.xml. عند قيامك بالذهاب إلى هذا العنوان في متصفحك، سوف تظهر أمامك شاشة صغيرة خاصة بالمتصفح مسؤولة عن عملية التوثيق، وهذه الشاشة تكون مشابهة للشاشة التالية:
فقط عند إدخالك لإسم مستخدم وكلمة مرور صحيحين سوف تحصل على البيانات المطلوبة.
من الدوال الأخرى الجميلة جدا دالة direct_messages/new method وهي تقوم بإرسال رسالة شخصية Direct Message من المستخدم الموثق إلى مستخدم آخر. وهذه الدالة تأخذ مدخلين، كود ID المستخدم أو اسم ظهوره Screen Name، ونص الرسالة والذي لا يزيد عن 140 حرف.
فعلى سبيل المثال يمكنك إرسال الرسالة “hi, how is it going” إلى المستخدم @elsheimy عن طريق أيا من الطريقتين:
- http://api.twitter.com/1/direct_messages/new.xml?user_id=19645411&text=hi,%20how%20is%20it%20going
- http://api.twitter.com/1/direct_messages/new.xml?screen_name=elsheimy&text=hi,%20how%20is%20it%20going
نلاحظ أنه هناك حروف وعلامات مثل المسافة وعلامة الاستفهام (؟) لا يمكنها الظهور في عناوين الإنترنت ولهذا فإنه يستعاض عنها بالرمز الخاص بها، مثلا المسافة تساوي %20 لأ الكود الستعشري Hexadecimal الخاص بها هو 20. سوف نتعلم في هذا الدرس كيفية عمل Encoding للنصوص لتصبح قابلة للتداول في عناوين الإنترنت.
إذا نجحت هذه العملية فإنها تقوم بإرجاع بيانات XML مشابهة للتالية:
88619848 1401881 all your bases are belong to us. 7004322 Wed Apr 08 20:30:04 +0000 2009 dougw igudo 1401881 Doug Williams dougw San Francisco, CA Twitter API Support. Internet, greed, users, dougw and opportunities are my passions.http://www.igudo.com false 1036 9ae4e8 000000 0000ff e0ff92 87bc44 290 Sun Mar 18 06:42:26 +0000 2007 0 -18000 <time>Eastern Time (US & Canada)</time>
false 3394 false false true 7004322 Doug Williams igudo North Carolina A character.
http://www.igudo.com false 19 69A1AA 000000 F00 ACBEC1 8A8F85 3 Thu Jun 21 21:16:21 +0000 2007 0 -18000 <time>Eastern Time (US & Canada)</time>
false 382 false true true
تويتر والدوت نت
الوصول إلى الدوال
كي يمكنك النداء على أي دالة ستحتاج إلى عمل طلب Request إلى هذه الدالة وانتظار الجواب Response أو النتيجة من هذه الدالة. ويمكنك عمل هذا عن طريق العناصر Classes الموجود في الـ Namespace المسمى System.Net وبالتحديد العنصرين WebRequest و WebResponse.
الكود التالي يوضح كيفية الوصول إلى دالة بسيطة والنداء عليها:
// C# Code public static Main() { GetResponse("http://api.twitter.com/1/statuses/public_timeline.xml"); } public static XmlDocument GetResponse(string uri) { WebRequest req = WebRequest.Create(new Uri(uri)); XmlDocument doc = new XmlDocument(); doc.Load(req.GetResponse().GetResponseStream()); return doc; }
' VB.NET Code Sub Main() GetResponse("http://api.twitter.com/1/statuses/public_timeline.xml") End Sub Public Function GetResponse(ByVal uri As String) As XmlDocument Dim req As WebRequest = WebRequest.Create(New Uri(uri)) Dim doc As New XmlDocument() doc.Load(req.GetResponse().GetResponseStream()) Return doc End Function
نلاحظ أن الكود قام باستخدام العنصر System.Xml.XmlDocument والذي يمكننا من معالجة بيانات الـ XML بسهولة.
الدوال والتوثيق
الكود التالي يوضح كيفية النداء على الدالة statuses/update method والتي تقوم بإرسال تحديث أو Tweet جديد عن طريق المستخدم المحدد. نلاحظ أن الكود استخدم التوثيق البسيط Basic Authentication.
// C# Code public static void Main() { GetResponse("http://api.twitter.com/1/statuses/update.xml?status=hello%20from%20the%20API", "elsheimy", "b@zzword", true); } public static XmlDocument GetResponse(string uri, string username, string password, bool post) { WebRequest req = WebRequest.Create(new Uri(uri)); if (post) req.Method = "POST"; if ((username != null) && (username.Trim() != String.Empty) && (!String.IsNullOrEmpty(password))) req.Credentials = new NetworkCredential(username.Trim(), password); XmlDocument doc = new XmlDocument(); doc.Load(req.GetResponse().GetResponseStream()); return doc; }
' VB.NET Code Sub Main() GetResponse("http://api.twitter.com/1/statuses/update.xml?status=hello%20from%20the%20API", "elsheimy", "b@zzword", True) End Sub Public Function GetResponse(ByVal uri As String, ByVal username As String, ByVal password As String, ByVal post As Boolean) As XmlDocument Dim req As WebRequest = WebRequest.Create(New Uri(uri)) If (post) Then req.Method = "POST" End If If ((username Nothing) And (username.Trim() String.Empty) And (Not String.IsNullOrEmpty(password))) Then req.Credentials = New NetworkCredential(username.Trim(), password) End If Dim doc As XmlDocument = New XmlDocument() doc.Load(req.GetResponse().GetResponseStream()) Return doc End Function
الترميز Encoding
كما ذكرنا سابقا، فإن هناك حروف يجب أن لا تظهر في المدخلات للدوال مثل المسافات وعلامات الاستفهامات وغيرها. وهذه الحروف يجب استبدالها بالتمثيل الستعشري Hexadecimal لأكوادها مسبوقة بعلامة النسبة المئوية %.
الكلاس التالي تقوم بتوضيح عملية الترميز Encoding. الكود لعلمية التوضيح فقط، فنحن لا نحتاج إلى تسجيل كل حرف بمقابله.
// C# Code public static class UrlEncoder { private static string[,] _chars = new string[,] { { "%", "%25" }, // this is the first one { "$" , "%24" }, { "&", "%26" }, { "+", "%2B" }, { ",", "%2C" }, { "/", "%2F" }, { ":", "%3A" }, { ";", "%3B" }, { "=", "%3D" }, { "?", "%3F" }, { "@", "%40" }, { " ", "%20" }, { """ , "%22" }, { "", "%3E" }, { "#", "%23" }, { "{", "%7B" }, { "}", "%7D" }, { "|", "%7C" }, { "", "%5C" }, { "^", "%5E" }, { "~", "%7E" }, { "[", "%5B" }, { "]", "%5D" }, { "`", "%60" } }; public static string EncodeUrl(string url) { for (int i = 0; i < _chars.GetUpperBound(0); i++) url = url.Replace(_chars[i, 0], _chars[i, 1]); return url; } public static string DecodeUrl(string url) { for (int i = 0; i < _chars.GetUpperBound(0); i++) url = url.Replace(_chars[i, 1], _chars[i, 0]); return url; }
' VB.NET Code Public Module UrlEncoder Private _chars(,) As String = _ { _ {"%", "%25"}, _ {"$", "%24"}, _ {"&", "%26"}, _ {"+", "%2B"}, _ {",", "%2C"}, _ {"/", "%2F"}, _ {":", "%3A"}, _ {";", "%3B"}, _ {"=", "%3D"}, _ {"?", "%3F"}, _ {"@", "%40"}, _ {" ", "%20"}, _ {"", "%22"}, _ {"", "%3E"}, _ {"#", "%23"}, _ {"{", "%7B"}, _ {"}", "%7D"}, _ {"|", "%7C"}, _ {"", "%5C"}, _ {"^", "%5E"}, _ {"~", "%7E"}, _ {"[", "%5B"}, _ {"]", "%5D"}, _ {"'", "%60"}} Public Function EncodeUrl(ByVal url As String) As String For i As Integer = 0 To _chars.GetUpperBound(0) - 1 url = url.Replace(_chars(i, 0), _chars(i, 1)) Next Return url End Function Public Function DecodeUrl(ByVal url As String) As String For i As Integer = 0 To _chars.GetUpperBound(0) - 1 url = url.Replace(_chars(i, 1), _chars(i, 0)) Next Return url End Function End Module
الآن يمكننا استخدام هذا الكود لتغيير الحالة المستخدم Status:
// C# Code public static void Main() { string uri; string text = UrlEncoder.EncodeUrl("hello from the API"); uri = "http://api.twitter.com/1/statuses/update.xml?status=" + text; GetResponse(uri, "elsheimy", "b@zzwrd", true); }
' VB.NET Code Public Sub Main() Dim uri As String Dim text As String = UrlEncoder.EncodeUrl("hello from the API") uri = "http://api.twitter.com/1/statuses/update.xml?status=" & text GetResponse(uri, "elsheimy", "b@zzwrd", True) End Sub
عناصر البيانات
ماذا بعد حصولنا على بيانات XML كيف سنقوم بتخزينها؟ يمكننا ذلك عن طريق استخدام عناصر Classes تحوي البيانات المطلوبة وهذه العناصر، نظريا، تسمى عناصر البيانات أو Business Objects.
الكود التالي هو عبارة عن ثلاثة أنواع Classes تمثل الثلاثة عناصر التي نريدها وهي المستخدم والحالة والرسالة:
// C# Code public structure TwitterUser { public long ID; public string Name; public string ScreenName; public string Location; public string Description; public string ProfileImage; public string Url; public bool IsProtected; public long FollowersCount; public long FriendsCount; public string CreatedAt; public long FavoritesCount; public bool Verified; public bool Following; public long StatusCount; } public structure TwitterStatus { public string CreatedAt; public long ID; public string Text; public string Source; public bool Truncated; public long InReplyToStatusID; public long InReplyToUserID; public bool Favorited; public string InReplyToScreenName; public TwitterUser User; } public structure TwitterMessage { public long ID; public long SenderID; public long SenderScreenName; public long RecipientID; public long RecipientScreenName; public string Text; public string CreatedAt; public TwitterUser Sender; public TwitterUser Recipient; }
' VB.NET Code Public Structure TwitterUser Public ID As Long Public Name As String Public ScreenName As String Public Location As String Public Description As String Public ProfileImage As String Public Url As String Public IsProtected As Boolean Public FollowersCount As Long Public FriendsCount As Long Public CreatedAt As String Public FavoritesCount As Long Public Verified As Boolean Public Following As Boolean Public StatusCount As Long End Structure Public Structure TwitterStatus Public CreatedAt As String Public ID As Long Public Text As String Public Source As String Public Truncated As Boolean Public InReplyToStatusID As Long Public InReplyToUserID As Long Public Favorited As Boolean Public InReplyToScreenName As String Public User As TwitterUser End Structure Public Structure TwitterMessage Public ID As Long Public SenderID As Long Public SenderScreenName As Long Public RecipientID As Long Public RecipientScreenName As Long Public Text As String Public CreatedAt As String Public Sender As TwitterUser Public Recipient As TwitterUser End Structure
تخزين البيانات
بعد أن قمنا باسترجاع البيانات الـ XML وبعد أن قمنا بتجهيز العناصر Classes التي ستحويها، يأتي الدور الآن على تحويل هذه البيانات إلى قائمة من هذه العناصر كي يتنسى لنا استخدامها في برنامجنا بسهولة.
الكود التالي يقوم باسترجاع التحديثات Statuses الخاصة بأصدقاء المستخدم ويحولها إلى قائمة من العنصر TwitterStatus. لاحظ الكود (الكود مختصر للإفادة):
// C# Code public static void Main() { GetStatuses("elsheimy", "b@zzword"); } public static List GetStatuses(string username, string password) { XmlNode node = GetResponse("http://api.twitter.com/1/statuses/friends_timeline.xml", username, password, true); List lst = new List(node.ChildNodes.Count); foreach (XmlNode nd in node.ChildNodes) // for each status lst.Add(HandleStatus(nd)); return lst; } public static TwitterStatus HandleStatus(XmlNode nd) { // HandleNumber, FormatText, HandleBool // are just functions that converts strings // to numbers, decoded strings, and bool TwitterStatus status = new TwitterStatus( nd["created_at"].InnerText, HandleNumber(nd["id"]), FormatText(nd["text"]), FormatText(nd["source"]), HandleBool(nd["truncated"]), HandleNumber(nd["in_reply_to_status_id"]), HandleNumber(nd["in_reply_to_user_id"]), HandleBool(nd["favorited"]), FormatText(nd["in_reply_to_screen_name"]), HandleUser(nd["user"])); return status; } public static TwitterUser HandleUser(XmlNode nd) { // HandleNumber, FormatText, HandleBool // are just functions that converts strings // to numbers, decoded strings, and bool long id = HandleNumber(nd["id"]); TwitterUser user; user = new TwitterUser( id, FormatText(nd["name"]), FormatText(nd["screen_name"]), FormatText(nd["location"]), FormatText(nd["description"]), nd["profile_image_url"].InnerText, nd["url"].InnerText, HandleBool(nd["protected"]), HandleNumber(nd["followers_count"]), HandleNumber(nd["friends_count"]), nd["created_at"].InnerText, HandleNumber(nd["favourites_count"]), HandleBool(nd["verified"]), HandleBool(nd["following"]), HandleNumber(nd["statuses_count"])); return user; }
' VB.NET Code Sub Main() GetStatuses("elsheimy", "b@zzword") End Sub Public Function GetStatuses(ByVal username As String, ByVal password As String) As List(Of TwitterStatus) Dim node As XmlNode = GetResponse("http://api.twitter.com/1/statuses/friends_timeline.xml", username, password, True) Dim lst As New List(Of TwitterStatus)(node.ChildNodes.Count) For Each nd As XmlNode In node.ChildNodes lst.Add(HandleStatus(nd)) Next Return lst End Function Public Function HandleStatus(ByVal nd As XmlNode) As TwitterStatus ' HandleNumber, FormatText, HandleBool ' are just functions that converts strings ' to numbers, decoded strings, and bool Dim status As New TwitterStatus( _ nd("created_at").InnerText, _ HandleNumber(nd("id")), _ FormatText(nd("text")), _ FormatText(nd("source")), _ HandleBool(nd("truncated")), _ HandleNumber(nd("in_reply_to_status_id")), _ HandleNumber(nd("in_reply_to_user_id")), _ HandleBool(nd("favorited")), _ FormatText(nd("in_reply_to_screen_name")), _ HandleUser(nd("user"))) Return status End Function Public Function HandleUser(ByVal nd As XmlNode) As TwitterUser ' HandleNumber, FormatText, HandleBool ' are just functions that converts strings ' to numbers, decoded strings, and bool Dim id As Long = HandleNumber(nd("id")) Dim user As New TwitterUser( _ id, _ FormatText(nd("name")), _ FormatText(nd("screen_name")), _ FormatText(nd("location")), _ FormatText(nd("description")), _ nd("profile_image_url").InnerText, _ nd("url").InnerText, _ HandleBool(nd("protected")), _ HandleNumber(nd("followers_count")), _ HandleNumber(nd("friends_count")), _ nd("created_at").InnerText, _ HandleNumber(nd("favourites_count")), _ HandleBool(nd("verified")), _ HandleBool(nd("following")), _ HandleNumber(nd("statuses_count"))) Return user End Function
المثال، برنامج twittoo
الوصف
وإلى النقطة الأكثر إثارة في موضوعنا، وهي المثال. مثالنا عبارة عن برنامج بسيط اسمه twittoo تستطيع من خلاله تصفح التحديثات Tweets وكذلك إضافة تحديثات أخرى، وتصفح الرسائل، والأصدقاء وغيرها.
لقطات
وهذه لقطات من البرنامج:

تم تطوير المثال باستخدام تقنية C# و WinForms.
التصميم
واجهة البرنامج بسيطة جدا لا تعتمد على أي أدوات Controls خارجية، جميع الأدوات هي أدوات الويندوز المعروفة. قمنا باستخدام الأداة System.Windows.Forms.TableLayoutPanel لعرض الحالات Statuses وكذلك الرسائل Direct Messages، لاحظ الشكل التالي.
تقصير العناوين URL Shortening
يتيح لك البرنامج تقصير أي عنوان إنترنت URL Shortening عن طريق خدمة http://is.gd وهذه الخدمة لها نظام API مشابه إلى حد كبير نظام التويتر. الكود التالي عبارة عن دالة تقوم بعمل تفصير لأي عنوان URL Shortening:
// C# Code public static string Shorten(string url) { if (!System.Text.RegularExpressions.Regex.IsMatch (url, @"(http|ftp|https)://[w-_]+(.[w-_]+)+([w-.,@?^=%&;:/~+#]*[w-@?^=%&;/~+#])?")) throw new FormatException("The URL you specificed is not in the current format."); url = Uri.EscapeUriString(url); string reqUri = String.Format(@"http://is.gd/api.php?longurl={0}", url); WebRequest req = WebRequest.Create(reqUri); req.Timeout = 5000; using (System.IO.StreamReader reader = new System.IO.StreamReader(req.GetResponse().GetResponseStream())) { return reader.ReadLine(); } }
' VB.NET Public Function Shorten(ByVal url As String) As String If (Not System.Text.RegularExpressions.Regex.IsMatch _ (url, "(http|ftp|https)://[w-_]+(.[w-_]+)+([w-.,@?^=%&;:/~+#]*[w-@?^=%&;/~+#])?")) Then Throw New FormatException("The URL you specificed is not in the current format.") End If url = Uri.EscapeUriString(url) Dim reqUri As String = String.Format("http://is.gd/api.php?longurl={0}", url) Dim req As WebRequest = WebRequest.Create(reqUri) req.Timeout = 5000 Dim reader As New System.IO.StreamReader(req.GetResponse().GetResponseStream()) url = reader.ReadLine() reader.Close() Return url End Function
التحميل
خاتمة
وأخيرا، أرجو أن أكون وفقت في عرض الموضوع، وعذرا على الإطالة، وأتمنى أن تشاركنوا بآرائكم واقتراحاتكم.
ما شاء الله عليك
الله يوفقك يا محمد
عبدالله القحطاني
إعجابإعجاب
شكرا على مروركم الكريم
إعجابإعجاب
شكرا استاذ محمد عمل رائع وانا من المتابعين لك منذ فتره
ولكن هل لاحظت مشكلة الترميز والكتابة باللغه العربية حيث ان تويتر لا يسمح لك بكتابة 140 حرف ( عربي )
إعجابإعجاب
ما شاء الله عليك
الله يوفقك يا محمد
عبدالله القحطاني
إعجابإعجاب
شكرا على مروركم الكريم
إعجابإعجاب
مقالة رائعة، أفادتني كثيراً في عمل برنامج فيجوال بيسك سكربت بسيط.أتمني أن أري مقالات مشابهة تتحدث عن الآي بي آي بالعربيةبالتوفيق =)
إعجابإعجاب
شكرا جزيلا شكرا لمشاركتك معناهل لديك أي اقتراحات للموقع، مقالات، أفكار، إلخ؟
إعجابإعجاب
🙂 جميل جدًا
لقد سبقتني , فقد كنت أود كتابة درس عن هذا الموضوع وعمل تطبيق جاهز
ولكن أنت مبدع , شكرًا لك أخي الحبيب
إعجابإعجاب
لست مبدعا إطلاقا، بل أنت المبدع. شكرا لك أخي الكريم لمشاركتك معنا. بالتأكيد عند كتابتك لنفس الموضوع سوف يكون أفضل مني بملايين المرات، أنا متأكد من ذلك. 🙂
إعجابإعجاب
جهد رائع ومشكور
للأسف الشديد تويتر منع التوثيق البسيط
واعتبرني من اليوم متابع دائم لك ولمدونتك الرائعة
إعجابإعجاب
بداية أتشرف بمتابعة حضرتك لينا، ويا رب دايما نكون عند حسن ظنك.
فعلا، تويتر منع التوثيق البسيط أعلن عنه بعد فترة من نشر المقالة وبدأ في استخدام الأوأوث OAuth وبالفعل فيه خطة لتعديل الموضوع ليشمل توثيق الأوأوث، وسوف يتم نشر الموضوع الأحدث قريبا بإذن الله تعالى.
شكرا على مروركم.
إعجابإعجاب
برافو محمد ، درس كتير حلو و إستفدت منه كتير
إعجابإعجاب
السلام عليكم
ما شاء الله درس رائع و كنت أبحث عنه في جووجل و الحمد لله وجدته ..
لكن هل هناك مصادر أخرى أو دروس أخرى يمكن أن تنصح بها جزاك الله خير
أبحث عن برمجة تويتر لموقع بواسطة الPHP
يا ريت لو تقدر تساعدني بارك الله فيك
شكرا جزيلاً
إعجابإعجاب