الان لاراول کار میکنم ولی هنوز سایتم همونه https://Rp76.ir
Api Divar - New ( ای پی ای دیوار )
سلام دوباره...
چند وقتی بوده که قصد داشتم ورژن جدید این مطلب رو انتشار بدم نه فقط برای این که پستم بیاد بالا
البته یکی از دلایلش هست ولی خب پست قبلی توی گوگل اول هست جای نگرانی نیست.
یکسری از افراد با من تماس گرفتند و از من کمک خواستن تا بتونن از API استفاده کنند یا یکسری چیز های جدید میخواستند که توی پست قبلی توضیح نداده بودم.
مشکلات پست قبلی :
- نداشتن کد نمونه
- توضیحات کم درباره محدودیت های API
- نداشتن کد شهر ها
- ....
آغاز پست جدید :
از اونجایی که ممکنه دفعه اول شما دوست عزیز باشه که داری این پست رو میبینی من آدرس پست قبلی هم گذاشتم شاید دوست داشتید ببینید.
بعد از اون هم پروژه رو با زبان سیشارپ توی گیت ها گذاشتم.
در ادامه هم میخوام یکسری از کد هارو شرح بدم و باید به دوستانی که سی شارپ بلد نیستند باید بگم نگران نباشید محدودیت زبان،فریم ورک،پلتفرم و .... نداریم.
فراخوانی شهر ها :
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<DivarPost> 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<DivarPost> posts = new List<DivarPost>();
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 برید و اونجا تایپ کنید
;
و نتیجه به دست امده رو توی فایل تکست و در پوشه Cookie قرار بدید
امیدوارم خوشتون آمده باشه.
مطلبی دیگر از این انتشارات
انتقال امن اطلاعات بین API و App
مطلبی دیگر از این انتشارات
درک ساده دکوراتورها در پایتون
مطلبی دیگر از این انتشارات
احراز هویت با استفاده از github در express