محاسبه سرعت بارگیری و بارگذاری و میزان پینگ با پایتون!
speedtest in python
سلام به همگی!
خب خب خب...
بالاخره بعد از چند هفته دوباره برگشتم با چند تا مقاله توپ که انشاالله این هفتۀ آخر تعطیلات نهایت استفاده رو ببریم!(پیشنهاد ویژه : تا میتونید این هفته رو بخورید🤦♂️🤣🤣 آجیل، شیرینی، هر چی🍕🍗🥩🍦🍬!!)
بگذریم! توی این مقاله میخوایم بریم سراغ یه بحث جذاب که توی امیگو هم ترند شده با عنوان #سرعت_نتم
در قسمت اول این آموزش میریم سراغ محاسبه سرعت بارگیری(download) و بارگذاری(upload) اونم توی پایتون...
ما این کار رو با یه کتابخونه انجام میدیم به نام speedtest که همون طور از اسمش مشخصه از سایت speedtest.net استفاده می کنه!
شما حتی میتونید لیست سرور هایی که بهشون دسترسی دارید برای محاسبه رو ببینید! بهترین هاشونو ببینید و اونهایی که بهتون نزدیک تر هستن رو مشاهده کنید...
خب حرف بسه بریم سراغ عمل😉
مرحله اول(نصب کتابخونه):
اینجا حواستون باشه به اسم باید یه cli- هم اضافه کنید یعنی اینجوری :
pip install speedtest-cliمرحله دوم(وارد کردن کتابخونه):
ابتدا کلاس Speedtest رو وارد می کنیم:
from speedtest import Speedtestو حالا یه شی از این کلاس می سازیم!
st = Speedtest()مرحله سوم(آشنایی با توابع):
خب این کلاس چندین تابع مختلف داره...
1-get_servers : دریافت تمامی سرور های قابل دسترسی:
servers = st.get_servers()
for key, value in servers.items():
print(key, ' : ', value)خروجی این کد برای من:
# Output:
1.7006881859750698 : [{'url': 'http://ookla-tehran.tci.ir:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'TCI', 'id': '15416', 'host': 'ookla-tehran.tci.ir:8080', 'd': 1.7006881859750698}, {'url': 'http://speedtest.mobinnet.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MobinNet (MTC)', 'id': '35113', 'host': 'speedtest.mobinnet.net:8080', 'd': 1.7006881859750698}, {'url': 'http://speedtest.sahamyab.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Sahamyab', 'id': '37280', 'host': 'speedtest.sahamyab.com:8080', 'd': 1.7006881859750698}, {'url': 'http://sp2.petiak.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Petiak', 'id': '40164', 'host': 'sp2.petiak.com:8080', 'd': 1.7006881859750698}, {'url': 'http://turbo.nakhl.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'ATRINNET-SERVCO', 'id': '22097', 'host': 'turbo.nakhl.net:8080', 'd': 1.7006881859750698}, {'url': 'http://tehran.abnoos.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46551', 'host': 'tehran.abnoos.com:8080', 'd': 1.7006881859750698}]
127.32944313224503 : [{'url': 'http://st1.aminidc.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'AminIDC', 'id': '8667', 'host': 'st1.aminidc.com:8080', 'd': 127.32944313224503}, {'url': 'http://qom.abnoos.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46334', 'host': 'qom.abnoos.com:8080', 'd': 127.32944313224503}]
337.1927569203184 : [{'url': 'http://esfahan1.irancell.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Isfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MTNIrancell', 'id': '9795', 'host': 'esfahan1.irancell.ir:8080', 'd': 337.1927569203184}, {'url': 'https://efmspd2.mci.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Esfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MCI (Hamrahe Avval)', 'id': '22245', 'host': 'efmspd2.mci.ir:8080', 'd': 337.1927569203184}]همونطور که می بینید خروجی این تابع دیکشنری هست که ما اومدیم با for توش پیمایش کردیم!
نکته مهم اینه که هر کلید خودش شامل چند دیکشنری دیگه هم هست و اطلاعات کاملی از هر سرور برای ما نمایش داده میشه!
برای من 6 سرور از تهران، 2 سرور از قم و 2 سرور از اصفهان در دسترسه!
2-get_best_server : دریافت بهترین سرور قابل دسترسی:
server = st.get_best_server()
for key, value in server.items():
print(key, ' : ', value)و خروجی از کد برای من:
# Output:url : http://ookla-tehran.tci.ir:8080/speedtest/upload.phplat : 35.6833 lon : 51.4167 name : Tehran country : Iran cc : IR sponsor : TCI id : 15416 host : ookla-tehran.tci.ir:8080 d : 1.7006881859750698 latency : 43.823
همونطور که میبینید این تابع یه دیکشنری به ما میده که توش کلید های مختلفی وجود داره که مقادیرش رو مشاهده می کنید!
فعلا در شرایط کنونی من بهترین سرور موجود سرور TCI یا همون مخابرات خودمونه!
3-get_closest_servers : دریافت نزدیکترین سرور ها:
servers = st.get_closest_servers()
for server in servers:
print(server)و خروجی برای من:
# Output:{'url': 'http://ookla-tehran.tci.ir:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'TCI', 'id': '15416', 'host': 'ookla-tehran.tci.ir:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.mobinnet.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MobinNet (MTC)', 'id': '35113', 'host': 'speedtest.mobinnet.net:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.sahamyab.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Sahamyab', 'id': '37280', 'host': 'speedtest.sahamyab.com:8080', 'd': 1.7006881859750698} {'url': 'http://sp2.petiak.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Petiak', 'id': '40164', 'host': 'sp2.petiak.com:8080', 'd': 1.7006881859750698} {'url': 'http://turbo.nakhl.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'ATRINNET-SERVCO', 'id': '22097', 'host': 'turbo.nakhl.net:8080', 'd': 1.7006881859750698} {'url': 'http://ookla-tehran.tci.ir:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'TCI', 'id': '15416', 'host': 'ookla-tehran.tci.ir:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.mobinnet.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MobinNet (MTC)', 'id': '35113', 'host': 'speedtest.mobinnet.net:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.sahamyab.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Sahamyab', 'id': '37280', 'host': 'speedtest.sahamyab.com:8080', 'd': 1.7006881859750698} {'url': 'http://sp2.petiak.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Petiak', 'id': '40164', 'host': 'sp2.petiak.com:8080', 'd': 1.7006881859750698} {'url': 'http://turbo.nakhl.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'ATRINNET-SERVCO', 'id': '22097', 'host': 'turbo.nakhl.net:8080', 'd': 1.7006881859750698} {'url': 'http://tehran.abnoos.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46551', 'host': 'tehran.abnoos.com:8080', 'd': 1.7006881859750698} {'url': 'http://st1.aminidc.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'AminIDC', 'id': '8667', 'host': 'st1.aminidc.com:8080', 'd': 127.32944313224503} {'url': 'http://qom.abnoos.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46334', 'host': 'qom.abnoos.com:8080', 'd': 127.32944313224503} {'url': 'http://esfahan1.irancell.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Isfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MTNIrancell', 'id': '9795', 'host': 'esfahan1.irancell.ir:8080', 'd': 337.1927569203184} {'url': 'https://efmspd2.mci.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Esfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MCI (Hamrahe Avval)', 'id': '22245', 'host': 'efmspd2.mci.ir:8080', 'd': 337.1927569203184} {'url': 'http://ookla-tehran.tci.ir:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'TCI', 'id': '15416', 'host': 'ookla-tehran.tci.ir:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.mobinnet.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MobinNet (MTC)', 'id': '35113', 'host': 'speedtest.mobinnet.net:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.sahamyab.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Sahamyab', 'id': '37280', 'host': 'speedtest.sahamyab.com:8080', 'd': 1.7006881859750698} {'url': 'http://sp2.petiak.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Petiak', 'id': '40164', 'host': 'sp2.petiak.com:8080', 'd': 1.7006881859750698} {'url': 'http://turbo.nakhl.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'ATRINNET-SERVCO', 'id': '22097', 'host': 'turbo.nakhl.net:8080', 'd': 1.7006881859750698} {'url': 'http://tehran.abnoos.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46551', 'host': 'tehran.abnoos.com:8080', 'd': 1.7006881859750698} {'url': 'http://st1.aminidc.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'AminIDC', 'id': '8667', 'host': 'st1.aminidc.com:8080', 'd': 127.32944313224503} {'url': 'http://qom.abnoos.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46334', 'host': 'qom.abnoos.com:8080', 'd': 127.32944313224503} {'url': 'http://esfahan1.irancell.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Isfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MTNIrancell', 'id': '9795', 'host': 'esfahan1.irancell.ir:8080', 'd': 337.1927569203184} {'url': 'https://efmspd2.mci.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Esfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MCI (Hamrahe Avval)', 'id': '22245', 'host': 'efmspd2.mci.ir:8080', 'd': 337.1927569203184} {'url': 'http://ookla-tehran.tci.ir:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'TCI', 'id': '15416', 'host': 'ookla-tehran.tci.ir:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.mobinnet.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MobinNet (MTC)', 'id': '35113', 'host': 'speedtest.mobinnet.net:8080', 'd': 1.7006881859750698} {'url': 'http://speedtest.sahamyab.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Sahamyab', 'id': '37280', 'host': 'speedtest.sahamyab.com:8080', 'd': 1.7006881859750698} {'url': 'http://sp2.petiak.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Petiak', 'id': '40164', 'host': 'sp2.petiak.com:8080', 'd': 1.7006881859750698} {'url': 'http://turbo.nakhl.net:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'ATRINNET-SERVCO', 'id': '22097', 'host': 'turbo.nakhl.net:8080', 'd': 1.7006881859750698} {'url': 'http://tehran.abnoos.com:8080/speedtest/upload.php', 'lat': '35.6833', 'lon': '51.4167', 'name': 'Tehran', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46551', 'host': 'tehran.abnoos.com:8080', 'd': 1.7006881859750698} {'url': 'http://st1.aminidc.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'AminIDC', 'id': '8667', 'host': 'st1.aminidc.com:8080', 'd': 127.32944313224503} {'url': 'http://qom.abnoos.com:8080/speedtest/upload.php', 'lat': '34.6399', 'lon': '50.8759', 'name': 'Qom', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'Abnoos.Com', 'id': '46334', 'host': 'qom.abnoos.com:8080', 'd': 127.32944313224503} {'url': 'http://esfahan1.irancell.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Isfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MTNIrancell', 'id': '9795', 'host': 'esfahan1.irancell.ir:8080', 'd': 337.1927569203184} {'url': 'https://efmspd2.mci.ir:8080/speedtest/upload.php', 'lat': '32.6729', 'lon': '51.6666', 'name': 'Esfahan', 'country': 'Iran', 'cc': 'IR', 'sponsor': 'MCI (Hamrahe Avval)', 'id': '22245', 'host': 'efmspd2.mci.ir:8080', 'd': 337.1927569203184}
این تابع برخلاف توابع قبلی لیست برمیگردونه و علی ماشاالله لیست پر باری هم هست و اکثرا از تهران و قم و کمی هم اصفهان!...
این لیست خودش دارای چندین دیکشنریه که اطلاعات هر سرور داخلش قرار گرفته!
4-get_config : دریافت پیکربندی ها:
config = st.get_config()
for key, value in config.items():
print(key, ' : ', value)و خروجی:
# Output:
client : {'ip': 'Your ip', 'lat': '35.698', 'lon': '51.4115', 'isp': 'Iran Telecommunication Company PJS', 'isprating': '3.7', 'rating': '0', 'ispdlavg': '0', 'ispulavg': '0', 'loggedin': '0', 'country': 'IR'}
ignore_servers : []
sizes : {'upload': [524288, 1048576, 7340032], 'download': [350, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000]}
counts : {'upload': 17, 'download': 4}
threads : {'upload': 2, 'download': 8}
length : {'upload': 10, 'download': 10}
upload_max : 51این تابع هم خروجی دیکشنری داره و باز هر مقدارش هم شامل چند کلید مختلف هست!(این دیکشنری های تو در توی این توابع حال میده واسه API نویسی و JSON و این داستانا😍)
بگذریم... توی این دیکشنری اطلاعاتی داریم درباره client یا همون کاربر در حال استفاده! مثلا آی پی شو داریم؛ طول و عرض جغرافیایی(البته فک کنم این مختصاتی که می بینید مال شرکت ارائه دهنده اس وگرنه ما کجا تهران کجا؟😅😑) و ...
خب حالا میرسیم به اصل کاریا...
5-download : دریافت سرعت بارگیری:
download_speed = st.download()
print(download_speed)خروجی این تابع بر حسب بیت بر ثانیه است:
# Output:
13678922.4535488066-upload : دریافت سرعت بارگذاری:
upload_speed = st.upload()
print(upload_speed)خروجی این تابع بر حسب بیت بر ثانیه است:
# Output:
1082577.9470550693این هم از سرعت بارگیری و بارگذاری...
حالا میرسیم به میزان پینگ! در ویندوز و اون طور که من میدونم گنو/لینوکس دستوری هست برای محاسبه پینگ بدین صورت:
ping [hotname]مثلا:
ping google.comحالا خروجی ها شاید کمی تفاوت داشته باشه در سیستم عامل های مختلف اما ما مبنا رو میگیریم بر ویندوز و در این آموزش از ویندوز استفاده می کنیم!(شاید بعد ها این پست رو برای گنو/لینوکس هم آپدیت کنم...)
مثلا خروجی در ویندوز :
Pinging google.com [142.250.186.46] with 32 bytes of data:
Reply from 142.250.186.46: bytes=32 time=142ms TTL=109
Reply from 142.250.186.46: bytes=32 time=141ms TTL=109
Reply from 142.250.186.46: bytes=32 time=142ms TTL=109
Reply from 142.250.186.46: bytes=32 time=141ms TTL=109
Ping statistics for 142.250.186.46:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 141ms, Maximum = 142ms, Average = 141msخب بریم سراغ کدهای پایتون:
مرحله اول(وارد کردن کتابخونه):
ما از کتابخونه subprocess برای این کار استفاده می کنیم
import subprocessمرحله دوم(اجرا کردن کد محاسبه):
این کتابخونه تابعی داره تحت عنوان Popen که برای اجرا کردن کد های terminal هست!
p = subprocess.Popen(["ping", "hostname here"], stdout = subprocess.PIPE)ما از پارامتر stdout برای این استفاده کردیم که کاربر خروجی طویلی که این کد میده رو نبینه و فقط میزان پینگشو ببینه!(جای "hostname here" آدرس سایت یا آیپی رو بذارید)
مرحله سوم(جدا کردن میزان پینگ از خروجی):
ما برای این کار اول خروجی رو نسبت به هر r\n\ میشکنیم و اونو به لیست تبدیل می کنیم
p = str(p.communicate()[0]).split(r"\r\n")p.communicate()[0] برای گرفتن خروجی اون دستور هست!
حالا اگر دقت کنید بیشترین پینگ، کمترین پینگ و میانگینشون در index یکی مونده به آخر هست یعنی همون ایندکس 2- ؛بنابراین اون رو دریافت می کنیم و چون در اون ایندکس اگر در مثالی که از ویندوز گذاشتم دقت کنید می بینید هر کدوم از اطلاعات با , از هم جدا شدند:
Minimum = 141ms, Maximum = 142ms, Average = 141msپس باید اونها رو نسبت به , هم بشکنیم!
p = p[-2].split(",")حالا اگه بخوایم فقط اون اعداد رو با واحدشون داشته باشیم این کارو انجام میدیم:
min = p[0].split(" ")[-1]
max = p[1].split(" ")[-1]
avg = p[2].split(" ")[-1]اینجا اومدیم چون بین عنوان هر مقدار و خودش یه = وجود داشت اونها رو حذف کردیم و فقط اعداد رو گذاشتیم!
تمامی کد:
p = subprocess.Popen(["ping", "Hostname"], stdout = subprocess.PIPE) p = str(p.communicate()[0]).split(r"\r\n") p = p[-2].split(",") min = p[0].split(" ")[-1] max = p[1].split(" ")[-1] avg = p[2].split(" ")[-1]print(max, min, avg)
مثلا ما این کد رو برای سایت google.com اجرا می کنیم و خروجی به این صورته:
# Output:
164ms 147ms 151msخب این آموزش هم به پایان رسید!
امیدوارم براتون مفید بوده باشه!
لایک و کامنت یادتون نره...
تا کُدی دیگر خدانگهدار :)


مشاهده نظرات بیشتر...