انتقل إلى المحتوى

كيفية استخدام الوصول إلى الشبكة

يعد الوصول إلى الإنترنت حالة استخدام شائعة للإضافات وخوارزميات cBot والمؤشرات. في السابق، كان على الخوارزميات طلب أذونات خاصة لإجراء أي عمليات متعلقة بالشبكة، مما قد يثير بعض المخاوف لدى المستخدمين، خاصة إذا تم توزيع هذه الخوارزميات بدون أي شفرة مصدرية. لحسن الحظ، تسمح cTrader الآن لجميع الخوارزميات بالوصول إلى موارد الويب دون الحاجة إلى حقوق وصول مرتفعة.

في هذه المقالة والفيديو المصاحب لها، سنوضح كيفية استرداد الأخبار من واجهة برمجة تطبيقات (API) مجانية تستخدم JSON للتسلسل وإلغاء التسلسل.

استهلاك نقطة نهاية API

في مثالنا، سنستخدم cBot الخاص بنا لقراءة معلومات الأخبار من مصدر خارجي وطباعتها في السجل. لهذا الغرض، سنستخدم واجهة برمجة تطبيقات (API) مجانية مقدمة من NewsData.

لمعرفة كيف تبدو واجهة برمجة التطبيقات (API) في المتصفح، يمكننا ببساطة الوصول إلى هذا الرابط.

https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&&language=en

كما نرى، توفر نقطة النهاية سلسلة من أزواج المفتاح-القيمة التي يمكننا استهلاكها بسهولة باستخدام cBot. سنبدأ بإضافة مساحات الأسماء التي تحتوي على العديد من الفئات والطرق لإلغاء تسلسل وقراءة البيانات بتنسيق JSON.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Net.Http.Json;
using System.Net.Http;

يمكننا بعد ذلك التصريح عن HttpClient() بسيط سيصل إلى الإنترنت.

1
private static readonly HttpClient client = new HttpClient();

بعد ذلك، سنتمكن من قراءة البيانات في طريقة OnStart().

1
2
3
4
protected override void OnStart()
{
    HttpResponseMessage responseToGet = client.GetAsync("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en").Result;
}

سيعيد الطلب استجابة خام بتنسيق JSON. يمكننا رؤية كيف تبدو باستخدام MessageBox.

1
2
3
var stream = responseToGet.Content.ReadAsStream();
var reader = new StreamReader(stream);
MessageBox.Show(reader.ReadToEnd());

إلغاء تسلسل بيانات JSON

لإلغاء تسلسل بيانات JSON الخاصة بنا، سنستخدم فئة JsonSerialiser. ومع ذلك، قبل أن نتمكن من القيام بذلك، سيتعين علينا تحديد الفئات المطلوبة لإلغاء التسلسل.

  • NewsItem - تمثل هذه الفئة مقالة إخبارية واحدة.
  • News - تحتوي هذه الفئة على مجموعة من كائنات NewsItem.
1
2
3
4
5
6
7
8
9
public class NewsItem
{
    public string title { get; set; }   
}

public class News
{
    public List<NewsItem> results { get; set; }
}

إذا كنت ترغب في تجنب كتابة هذا الكود الجاهز، يمكنك أيضًا استخدام محول عبر الإنترنت من JSON إلى C#.

باستخدام المحول، قمنا بتعريف فئاتنا على النحو التالي:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class NewsItem
{
    public string article_id { get; set; }
    public string title { get; set; }
    public string link { get; set; }
    public List<string> keywords { get; set; }
    public List<string> creator { get; set; }
    public object video_url { get; set; }
    public string description { get; set; }
    public string content { get; set; }
    public string pubDate { get; set; }
    public string image_url { get; set; }
    public string source_id { get; set; }
    public int source_priority { get; set; }
    public List<string> country { get; set; }
    public List<string> category { get; set; }
    public string language { get; set; }
}

public class News
{
    public string status { get; set; }
    public int totalResults { get; set; }
    public List<NewsItem> results { get; set; }
    public string nextPage { get; set; }
}

يمكننا الآن كتابة كود إلغاء التسلسل الخاص بنا.

1
News news = JsonSerializer.Deserialize<News>(responseToGet.Content.ReadAsStream());

بالإضافة إلى ذلك، يمكننا إضافة الكود التالي لطباعة عناوين الأخبار في السجل.

1
2
3
4
5
6
7
if (responseToGet.IsSuccessful)
{
    News news = JsonSerializer.Deserialize<News>(responseToGet.Body);

    foreach (var item in news.results)
            Print(item.title);
}

إذا قمنا ببناء وتشغيل cBot الخاص بنا، سنرى ظهور استثناء في السجل. ومع ذلك، إذا قمنا بتغيير حقوق الوصول لـ cBot إلى AccessRights.FullAccess، سنرى أن cBot الخاص بنا يعمل كما هو مقصود.

الوصول إلى الإنترنت دون حقوق وصول مرتفعة

لتجنب حدوث موقف يحتاج فيه cBot الخاص بنا إلى طلب حقوق وصول مرتفعة، يمكننا تعديل طريقة OnStart() الخاصة بنا إلى ما يلي.

1
2
3
4
protected override void OnStart()
{
    var responseToGet = Http.Get("https://newsdata.io/api/1/news?apikey=pub_32606381862bbdf07962c72ae7bc6135d6332&q=inflation&language=en");
}

إذا قمنا بتعيين حقوق الوصول إلى AccessRights.None وإعادة بناء cBot الخاص بنا، يجب أن نرى عناوين الأخبار تُطبع في السجل دون أي مشاكل. ببذل المزيد من الجهد، يمكن تحويل cBot الخاص بنا إلى قارئ أخبار فاخر متاح مباشرة داخل أي رسم بياني لـ cTrader!