Api Divar - New ( ای پی ای دیوار )

Api Divar -  New ( ای پی ای دیوار )
Api Divar - New ( ای پی ای دیوار )

سلام دوباره...

چند وقتی بوده که قصد داشتم ورژن جدید این مطلب رو انتشار بدم نه فقط برای این که پستم بیاد بالا

البته یکی از دلایلش هست ولی خب پست قبلی توی گوگل اول هست جای نگرانی نیست.

یکسری از افراد با من تماس گرفتند و از من کمک خواستن تا بتونن از API استفاده کنند یا یکسری چیز های جدید میخواستند که توی پست قبلی توضیح نداده بودم.

مشکلات پست قبلی :

  • نداشتن کد نمونه
  • توضیحات کم درباره محدودیت های API
  • نداشتن کد شهر ها
  • ....

آغاز پست جدید :

از اونجایی که ممکنه دفعه اول شما دوست عزیز باشه که داری این پست رو میبینی من آدرس پست قبلی هم گذاشتم شاید دوست داشتید ببینید.

بعد از اون هم پروژه رو با زبان سیشارپ توی گیت ها گذاشتم.

در ادامه هم میخوام یکسری از کد هارو شرح بدم و باید به دوستانی که سی شارپ بلد نیستند باید بگم نگران نباشید محدودیت زبان،فریم ورک،پلتفرم و .... نداریم.

فراخوانی شهر ها :

 private string GetCities()
        {
            string url = &quothttps://divar.ir/s/tehran&quot
            string result = &quot&quot

           try{
                using (WebClient wb = new WebClient())
                {
                    wb.Headers[HttpRequestHeader.ContentType] = &quotapplication/json; 
harset=utf-8&quot
                    result = wb.DownloadString(url);
                }
            }
            catch (Exception ex)            {
                MessageBox.Show(ex.Message);
            }
            return result;
        }

private void SaveCities()
        {
            string pattern = @&quot&quot&quotplaces.*}}}&quot
            string input = GetCities();
            RegexOptions options = RegexOptions.Multiline;
            Match m = Regex.Match(input, pattern, options);

            string newmatch = m.Value.Replace(&quot\\&quot, &quot&quot);
            newmatch = &quot{&quot + newmatch;
            JObject jb = JObject.Parse(newmatch);

            StreamWriter sw = new StreamWriter(&quotplaces.json&quot);
            sw.Write(jb.ToString());
            sw.Close();
            FetchList();
}

توضیح کلی اینه که دو تا تابع درست کردم به اسم های GetCities , SaveCities

کار تابع اول خیلی ساده هست میاد سورس سایت رو میگیره و میده به تابلع دوم

تابع دوم با توجه به رشته های با قاعده میاد بخش مورد نیاز ما رو پیدا میکنه و توی یک فایل ذخیره میکنه!

فراخوانی آگهی ها :

   private List<DivarPost> GetData()
        {
            curenttxt.Text = curenttxt.Text == &quot-1&quot ? &quot0&quot : curenttxt.Text;
            string url = &quothttps://api.divar.ir/v8/search/&quot + (citycombo.SelectedItem as dynamic).Value + &quot/house-villa-sell&quot
            string data = &quot{\&quotjson_schema\&quot: {\&quotcategory\&quot: {\&quotvalue\&quot: \&quothouse-villa-sell\&quot}},\&quotlast-post-date\&quot: &quot + curenttxt.Text + &quot}&quot       
     string result = &quot&quot
            List<DivarPost> posts = new List<DivarPost>();
            try {
                using (WebClient wb = new WebClient()) {
                    result = wb.UploadString(url, data);
                    JObject j = JObject.Parse(result);
                    curenttxt.Text = j[&quotlast_post_date&quot].ToString();
                    if (curenttxt.Text == &quot-1&quot) {
                        MessageBox.Show(&quotبه اخر لیست رسیدید&quot);
                    }
                    foreach (var item in j[&quotwidget_list&quot]) {
                        posts.Add(
                           new DivarPost {
                                Title = item[&quotdata&quot][&quottitle&quot].ToString() != &quot&quot ? item[&quotdata&quot][&quottitle&quot].ToString() : &quot-&quot,
                                Des = item[&quotdata&quot][&quotdescription&quot].ToString() != &quot&quot ? item[&quotdata&quot][&quotdescription&quot].ToString() : &quot-&quot,
                                Date = item[&quotdata&quot][&quotnormal_text&quot].ToString() != &quot&quot ? item[&quotdata&quot][&quotnormal_text&quot].ToString() : &quot-&quot,
                                Token = item[&quotdata&quot][&quottoken&quot].ToString() != &quot&quot ? item[&quotdata&quot][&quottoken&quot].ToString() : &quot-&quot,
                                Number = GetNumber(item[&quotdata&quot][&quottoken&quot].ToString())
                            }
                            );
                    }
               }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }      
      progres.Visible = false;
            return posts;
        }

این یک تابع ساده نیست فقط توی اون از یک کلاس استفاده کردم که اگر کد هارو خوب نگاه کنید متوجه میشید کلاس ما چی هست اما نگران نباشید در ادامه پست کلاس ها هم اضافه میکنم.

باید درخواست هارو به یک آدرسی ارسال کنیم که توی کد بالا توی خط 4 آورده شده.

بخش متغیر آدرس هم باید از تابع GetCities بگیرید،یادتون باشه که اسم شد نیاز نیست باید کد اون شهر رو استفاده کنید.

حالا باید به سرور بگیم که ما چی نیاز داریم که دقیقا توی خط بعد قابل مشاهده هست من از بخش ویلا ها استفاده کردم و بخش متغیر این قسمت آدرس دسترسی به پست های بعد هست که دفعه اول باید 0 باشه و دفعات بعد از سرور گرفته بشه،خروجی آگهی ها یک عدد با طول 15 هست که به اسم last_post_date قابل شناسایی هست باید از این شماره برای پست های پیشین استفاده کنید.

فراخوانی شماره تماس :

private string GetNumber(string txttocken)
        {
            string url = &quothttps://api.divar.ir/v5/posts/&quot + txttocken + &quot/contact/&quot
            JObject jb = null;
            try
            {
                using (WebClient wb = new WebClient())
                {
                    //WebProxy wp = new WebProxy(&quot137.59.155.253&quot, 8088);                        
                   //wp.UseDefaultCredentials = false;
                    //wp.BypassProxyOnLocal = false;  
                    //wb.Proxy = wp;
                    wb.Headers[HttpRequestHeader.Host] = &quotapi.divar.ir&quot
                    wb.Headers[HttpRequestHeader.UserAgent] = &quotMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0&quot
                    wb.Headers[HttpRequestHeader.Accept] = &quotapplication/json, text/plain, */*&quot
                    wb.Headers[HttpRequestHeader.AcceptLanguage] = &quoten&quot
                    wb.Headers[HttpRequestHeader.AcceptEncoding] = &quotgzip, deflate, br&quot
                    wb.Headers[HttpRequestHeader.Referer] = &quothttps://divar.ir/v/&quot + txttocken;
                    wb.Headers[HttpRequestHeader.Cookie] = &quotdid=bdd79193-eb77-456a-ad56-077766a52e67; _gcl_au=1.1.444842256.1580543925; city=esfahan; MEDIAAD_USER_ID=4e4aeae7-4e49-4e24-a954-9fd5000e570c; device_id=1961478167; _hjid=73c493a0-5571-4fd8-9b77-ef2d08ce71fb; token=&quot+cookielist.SelectedItem.ToString()+&quot _ga=GA1.2.144012545.1588844123; _gid=GA1.2.959140253.1588844123; _pk_id.1.fbba=69e3b8d61114fb79.1588844123.8.1588955692.1588954221.; _pk_ses.1.fbba=1&quot
                    string result = wb.DownloadString(url);
                    jb = JObject.Parse(result);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return jb.First.First.First.First[&quotphone&quot].ToString();
        }

چند خطی که کامنت شدن برای استفاده از پروکسی هست.

خطوط بعد هم برای تعریف Header برای سایت هست که اگر ارسال نکنید بعد از 23 شماره تلفن دیگه اجازه گرفتن شماره ندارید تا روز بعد.البته باید بگم اگر اون ها رو تنظیم کنید محدودیت به یچیزی حدود 100 تا شماره تغیر میکنه.

اگر Header.Cookie رو تنظیم کنید بعد از 100 تا شماره شما میتونید محدودیت رو به 200 یا حتی بیشتر انتقال بدید.

اگر براتون سوال که چطور کوکی گیر بیارید باید بگم گه اول باید وارد سایت دیوار بشید با شمارتون و بعد توی مرورگرتون با استفاده از دکمه F12 پنجره Inspect رو باز کنید و به بخش Console برید و اونجا تایپ کنید

;

و نتیجه به دست امده رو توی فایل تکست و در پوشه Cookie قرار بدید


امیدوارم خوشتون آمده باشه.

پست پیشین :

https://virgool.io/apieco/%D8%AF%DB%8C%D9%88%D8%A7%D8%B1-api-zx6zogkh5vj5

صفحه پروژه :

https://github.com/RezaParsian/Divar

سایت خودم :

https://rp76.ir/