رابط برنامه‌نویسی دیوار- Api دیوار

رابط برنامه‌نویسی دیوار- Api دیوار

Tips and Trick

3 دقیقه

1399/06/13

رضا پارسیان

رضا پارسیان

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

هرسایت موفقی مثل spotify و facebook یا هر سایت موفق دیگه ای که به فکرتون برسه برای توسعه دهنده های آزاد یک رابط کاربری طراحی میکنند که کار با سایت رو برای این افراد و برنامه هاشون آسون تر میکنه.

متاسفانه سایت دیوار بنا بر سیاست های کاریی که داره هیچ api برای برنامه نویس ها اماده نکرده شاید براتون سوال پیش بیاد که چطور برنامه نویس های خودشون با سایت کار میکنند؟

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

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

توی این قسمت نتونستم api پیدا کنم،امدم سایت رو باز کردن و با dom pars اطلاعاتی که میخواستم رو پیدا کردم.مهم نیست به چه ادرسی از سایت دیوار درخواست رو ارسال کنید،تقریبا توی همه صفحه ها هست این تگ html.

من از عبارات با قاعده استفاده کردم برای این بخش

 private string GetCities()  
        {  
            string url = "https://divar.ir/s/tehran"  
            string result = ""  

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

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

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

            StreamWriter sw = new StreamWriter("places.json");  
            sw.Write(jb.ToString());  
            sw.Close();  
            FetchList();  
}

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

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

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

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

   private List GetData()  
        {  
            curenttxt.Text = curenttxt.Text == "-1" ? "0" : curenttxt.Text;  
            string url = "https://api.divar.ir/v8/search/" + (citycombo.SelectedItem as dynamic).Value + "/house-villa-sell"  
            string data = "{\"json_schema\": {\"category\": {\"value\": \"house-villa-sell\"}},\"last-post-date\": " + curenttxt.Text + "}"         
     string result = ""  
            List posts = new List();  
            try {  
                using (WebClient wb = new WebClient()) {  
                    result = wb.UploadString(url, data);  
                    JObject j = JObject.Parse(result);  
                    curenttxt.Text = j["last_post_date"].ToString();  
                    if (curenttxt.Text == "-1") {  
                        MessageBox.Show("به اخر لیست رسیدید");  
                    }  
                    foreach (var item in j["widget_list"]) {  
                        posts.Add(  
                           new DivarPost {  
                                Title = item["data"]["title"].ToString() != "" ? item["data"]["title"].ToString() : "-",  
                                Des = item["data"]["description"].ToString() != "" ? item["data"]["description"].ToString() : "-",  
                                Date = item["data"]["normal_text"].ToString() != "" ? item["data"]["normal_text"].ToString() : "-",  
                                Token = item["data"]["token"].ToString() != "" ? item["data"]["token"].ToString() : "-",  
                                Number = GetNumber(item["data"]["token"].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 = "https://api.divar.ir/v5/posts/" + txttocken + "/contact/"  
            JObject jb = null;  
            try  
            {  
                using (WebClient wb = new WebClient())  
                {  
                    //WebProxy wp = new WebProxy("137.59.155.253", 8088);                          
                   //wp.UseDefaultCredentials = false;  
                    //wp.BypassProxyOnLocal = false;    
                    //wb.Proxy = wp;  
                    wb.Headers[HttpRequestHeader.Host] = "api.divar.ir"  
                    wb.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"  
                    wb.Headers[HttpRequestHeader.Accept] = "application/json, text/plain, */*"  
                    wb.Headers[HttpRequestHeader.AcceptLanguage] = "en"  
                    wb.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate, br"  
                    wb.Headers[HttpRequestHeader.Referer] = "https://divar.ir/v/" + txttocken;  
                    wb.Headers[HttpRequestHeader.Cookie] = "did=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="+cookielist.SelectedItem.ToString()+" _ga=GA1.2.144012545.1588844123; _gid=GA1.2.959140253.1588844123; _pk_id.1.fbba=69e3b8d61114fb79.1588844123.8.1588955692.1588954221.; _pk_ses.1.fbba=1"  
                    string result = wb.DownloadString(url);  
                    jb = JObject.Parse(result);  
                }  
            }  
            catch (Exception ex)  
            {  
                MessageBox.Show(ex.Message);  
            }  
            return jb.First.First.First.First["phone"].ToString();  
        }

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

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

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

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

document.cookie;

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

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

صفحه پروژه

🤯

😍

😁

😬

😊

🤨

🙁

🥲

😭

😡

🤬

Postman چیست؟

مقاله بعدی
Postman چیست؟
فریم ورک لاراول

فریم ورک لاراول

مقاله قبلی