<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های علی زاهدی گل</title>
        <link>https://virgool.io/feed/@ali-zahedi</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-10 12:33:35</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/556955/avatar/Dh7vJc.png?height=120&amp;width=120</url>
            <title>علی زاهدی گل</title>
            <link>https://virgool.io/@ali-zahedi</link>
        </image>

                    <item>
                <title>متصل کردن یوزر شخصی و یا بات تلگرام به جنگو و ارسال پاسخ و یا انجام کارها به صورت اتوماتیک برای تلگرام</title>
                <link>https://virgool.io/@ali-zahedi/%D9%85%D8%AA%D8%B5%D9%84-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%D9%88%D8%B2%D8%B1-%D9%88-%DB%8C%D8%A7-%D8%A8%D8%A7%D8%AA-%D8%AA%D9%84%DA%AF%D8%B1%D8%A7%D9%85-%D8%A8%D9%87-%D8%AC%D9%86%DA%AF%D9%88-%D9%88-%D8%A7%D8%B1%D8%B3%D8%A7%D9%84-%D9%BE%D8%A7%D8%B3%D8%AE-%D9%88-%DB%8C%D8%A7-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%DA%A9%D8%A7%D8%B1%D9%87%D8%A7-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%A7%D8%AA%D9%88%D9%85%D8%A7%D8%AA%DB%8C%DA%A9-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D9%84%DA%AF%D8%B1%D8%A7%D9%85-tlv9vjooly17</link>
                <description>برای اینکه بتونیم یوزر تلگرام رو به جنگو متصل کنیم اول باید چند کار رو انجام بدیم. بعد از نصب جنگو و کارهای اولیه، پکیج زیر و نصب می کنیم.pip install django-telethonو بعد در فایل settings.py به عنوان یک اپ نصب شده معرفیش می کنیم. INSTALLED_APPS = [
   # ....
   &#039;django_telethon&#039;,
   # ...
]بعد هم یو آر ال ها رو تعریف می کنیم که بتونیم ازشون استفاده کنیم. from django.contrib import admin
from django.urls import path

from django_telethon.urls import django_telethon_urls

admin.autodiscover()

urlpatterns = [
    path(&#039;admin/&#039;, admin.site.urls),
    path(&#039;telegram/&#039;, django_telethon_urls()),
]در آخر هم دیتابیس رو بروز می کنیم.python manage.py migrateو همین. پروسه نصب تموم شد. حالا بریم سراغ اتصال یوزر یا بات به تلگرام.اگر میخواید یوزر معمولی رو متصل کنید:اول یه سر به این سایت تلگرام بزنین و از قسمت API Development tools یک اپلیکیشن جدید بسازید. هیچ یو آر الی هم لازم نیست وارد کنید و فقط در انتها  بعد از ساخته شدن این صفحه رو نبندید که با اون کار داریم. حالا برنامه جنگو رو ران کنید. python manage.py runserverو بعد از اون سرویس تلگرام رو ران می کنیم.python manage.py runtelegramدقت کنین که بزارین هر دو باز بمونن و نبندینشون. بعد از این مراحل از لینک زیر وارد پنل ادمین بشید و یک اپ جدید بسازید. مقادیر مورد نیاز رو از اپی که در تلگرام ساختین وارد کنین. http://127.0.0.1:8000/admin/django_telethon/app/مرحله بعد اینه که با استفاده از پست من یا هر ابزاری که باهاش راحت هستید، یک ریکوئست برای درخواست توکن و یک ریکوئست برای ورود به تلگرام بزنیم. (در مجموع دو تا) من برای اینکه در اینجا واضح تر باشه، ریکوئست ها رو با پایتون میزنم. پس یک ترمینال پایتونی باز کنید و ریکوئست زیر رو بزنین. import requests
import json

url = &amp;quot127.0.0.1:8000/telegram/send-code-request/&amp;quot

payload = json.dumps({
  &amp;quotphone_number&amp;quot: &amp;quot+12345678901&amp;quot,
  &amp;quotclient_session_name&amp;quot: &amp;quotname of the client session&amp;quot
})
headers = {
  &#039;Content-Type&#039;: &#039;application/json&#039;
}

response = requests.request(&amp;quotPOST&amp;quot, url, headers=headers, data=payload)

print(response.text) طبیعتا به جای phone_number و client_session_name شماره تلفن و اسم دلخواهتون رو وارد کنید و درخواست رو ارسال کنید. منتظر بشید تا کد تایید براتون روی تلگرام نمایش داده بشه. ممکن ه حدود سی ثانیه تا یک دقیقه طول بکشه. اگر در همین زمان لینک پایین رو چک کنید یک درخواست ورود ثبت شده:http://127.0.0.1:8000/admin/django_telethon/login/مرحله بعدی باید تایید رو انجام بدیم. import requests
import json

url = &amp;quot127.0.0.1:8000/telegram/login-user-request/&amp;quot

payload = json.dumps({
  &amp;quotphone_number&amp;quot: &amp;quot+12345678901&amp;quot,
  &amp;quotclient_session_name&amp;quot: &amp;quotname of the client session&amp;quot,
  &amp;quotcode&amp;quot: &amp;quot1234&amp;quot,
  &amp;quotpassword&amp;quot: &amp;quot1234&amp;quot
})
headers = {
  &#039;Content-Type&#039;: &#039;application/json&#039;
}

response = requests.request(&amp;quotPOST&amp;quot, url, headers=headers, data=payload)

print(response.text)همون شماره تلفن و همون client_session_name قبلی رو اینجا وارد کنید و کدی که براتون اومده رو در قسمت کد و برای password اگر از Two-Step Verification استفاده می کنید اون رو در قسمت پسورد بفرستید وگرنه یک رشته خالی ارسال کنید. بعد از حداکثر یک دقیقه اگر همه چیز رو درست وارد کرده باشید باید پیام ورود از تلگرام دریافت کنید و در لینک زیر هیچ رکوردی نباید وجود داشته باشد. http://127.0.0.1:8000/admin/django_telethon/login/توی لینک زیر هم باید احتمالا چند تا رکورد مشاهده کنید. http://127.0.0.1:8000/admin/django_telethon/entity/چطوری تست کنیم؟فرض کنید من میخوام کاری کنیم، هر کسی به من پیام ping رو داد، من در جواب بهش بگم pong چیکار کنیم؟بیاید یک اپ جدید به اسم تلپای ایجاد کنیم. python manage.py startapp telpyبعد توی فایل settings.py به عنوان یک اپ نصب شده معرفیش می کنیم. INSTALLED_APPS = [    
# ....    
&#039;telpy&#039;,   
 # ... ]یک فایلی که مطمئن باشیم که برنامه که لود میشه اون فایل لود میشه رو باز می کنیم. مثلا فایل models.py رو انتخاب می کنیم و بازش می کنیم و کدهای زیر و میزاریم. from functools import partial

from django.dispatch import receiver
from telethon import events

from django_telethon.signals import telegram_client_registered

async def event_handler(event, client_session):
    print(client_session.name, event.raw_text, sep=&#039; | &#039;)
    # if you need access to telegram client, you can use event.client
    # telegram_client = event.client
    await event.respond(&#039;!pong&#039;)


@receiver(telegram_client_registered)
def receiver_telegram_registered(telegram_client, client_session, *args, **kwargs):
    handler = partial(event_handler, client_session=client_session)
    telegram_client.add_event_handler(
        handler,
        events.NewMessage(pattern=&#039;ping&#039;),
    )حالا هر دو تا جنگو و تلگرام رو استاپ می کنیم. برنامه جنگو رو مجدد ران کنید. python manage.py runserverو بعد از اون سرویس تلگرام رو مجدد ران می کنیم.python manage.py runtelegramدقت کنین که بزارین هر دو باز بمونن و نبندینشون. یک پیام با مزمون ping بفرستید. اینم لینک گیت هاب پروژهhttps://github.com/ali-zahedi/django-telethonاگر موردی دیدید و یا دوست داشتید چیزی کم یا زیاد بشه، ممنون میشم اونجا در موردش صحبت کنیم. همینطور اگر روی گیت هاب بهش ستاره بدید برای من خیلی ارزشمند خواهد بود و متوجه میشم که دوستش داشتید. اگر دوست داشتید این مطلب ادامه داشته باشه و در موردش بیشتر صحبت بشه بهش ستاره بدید و توی کامنت ها بهم بگید! </description>
                <category>علی زاهدی گل</category>
                <author>علی زاهدی گل</author>
                <pubDate>Tue, 19 Jul 2022 12:41:19 +0430</pubDate>
            </item>
                    <item>
                <title>پیاده سازی درگاه پرداخت بانک های مختلف با پایتون</title>
                <link>https://virgool.io/@ali-zahedi/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1%DA%AF%D8%A7%D9%87-%D9%BE%D8%B1%D8%AF%D8%A7%D8%AE%D8%AA-%D8%A8%D8%A7%D9%86%DA%A9-%D9%87%D8%A7%DB%8C-%D9%85%D8%AE%D8%AA%D9%84%D9%81-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ngy6yfkagodj</link>
                <description>تو هر پروژه از یک درگاه استفاده می شد و عموما برای هر کدوم یک مقدار دردسر می کشیدم چون نه مستندات درست و حسابی خیلی هاشون داشتند و نه SDK مناسبی برای اون ها وجود داشت. همین شد که تصمیم گرفتم بیام یه سری از درگاه ها رو در قالب یک پکیج در اختیار همه قرار بدم تا این مسئله حل بشه. البته که بعضی از بانک ها هستند که در حال حاضر روی این پروژه پورت نشدن که شما می تونید خودتون در توسعه اش نقش داشته باشید و یا اگر وقت و حوصله کافی برای این کار رو ندارید می تونید از طریق قسمت Issues یک Issue مرتبط باز کنید تا بانک مورد نظر اضافه بشه.در زمان نوشتن این مقاله چند درگاه زیر پشتیبانی می شن که احتمالا زمانی که شما این مقاله رو می خونید شاید درگاه های دیگه هم زیاد شده باشن، پس توصیه می کنم حتما به صفحه خود پروژه سر بزنین.درگاه پرداخت بانک ملی ایران (BMI)درگاه پرداخت بانک سامان (SEP)درگاه پرداخت زرین پالدرگاه پرداخت آی دی پی (IDPay)درگاه پرداخت زیبالدرگاه پرداخت باهمتادرگاه پرداخت بانک ملت (‌به پرداخت)برای پیاده سازی و اتصال به درگاه بانک ها کافی ه که پکیج رو نصب کنید و اون رو به عنوان یک اپ در پروژه جنگو تون معرفی کنید.pip install az-iranian-bank-gatewaysبعد از نصب توسط پکیج منیجر  اون رو در فایل ستینگ پروژه به عنوان اپ نصب شده معرفی می کنیم.INSTALLED_APPS = [
   # ....
   &#039;azbankgateways&#039;,
   # ...
]در فایل تنظیمات، درگاه های مورد نظرمون رو تنظیم می کنیم.حالا فرض کنین که من میخوام از دو درگاه پرداخت بانک ملی و درگاه پرداخت بانک سامان خودم استفاده کنم و در صورتی که در هنگام درخواست و اتصال به بانک ملی، اتصال بر قرار نشد و به هر دلیلی درگاه در دسترس نبود به صورت خودکار کاربر رو به درگاه پرداخت بانک سامان متصل کنه، البته که قصد هم دارم که درگاه پیش فرضم بانک ملی باشه، اون موقع تنظیمات رو به صورت زیر انجام میدم.AZ_IRANIAN_BANK_GATEWAYS = {
   &#039;GATEWAYS&#039;: {
       &#039;BMI&#039;: {
           &#039;MERCHANT_CODE&#039;: &#039;&lt;YOUR MERCHANT CODE&gt;&#039;,
           &#039;TERMINAL_CODE&#039;: &#039;&lt;YOUR TERMINAL CODE&gt;&#039;,
           &#039;SECRET_KEY&#039;: &#039;&lt;YOUR SECRET CODE&gt;&#039;,
       },
       &#039;SEP&#039;: {
           &#039;MERCHANT_CODE&#039;: &#039;&lt;YOUR MERCHANT CODE&gt;&#039;,
           &#039;TERMINAL_CODE&#039;: &#039;&lt;YOUR TERMINAL CODE&gt;&#039;,
       },
   },
   &#039;DEFAULT&#039;: &#039;BMI&#039;,
   &#039;BANK_PRIORITIES&#039;: [
       &#039;BMI&#039;,
       &#039;SEP&#039;,
       # and so on ...
   ],
}البته که ممکنه توی پروژه من از واحد ریال یا تومان استفاده کنم که اون هم قابل تنظیم هست و فقط باید یک پارامتر دیگه رو به فایل تنظیماتم اضافه کنم.&#039;CURRENCY&#039;: &#039;IRR&#039;,تنظیمات دیگه ای هم هست که واقعا از حوصله ی این پست خارجه که البته سعی کردم در مستندات خود پروژه بهشون اشاره بکنم. البته که باز هم بنظرم یک سری بخش ها مثل خوندن از طریق یک کلاس دیگر که هر کسی بتونه اون رو به هر روشی که دوست داره شخصی سازی کنه، مثلا شما دوست ندارید که کلید های امنیتی رو از اینجا تعیین کنید، می تونید اون ها رو از طریق کلاسی که خودتون تعریفش می کنید بخونه، پس در بخش تنظیمات معرفی کنید و پکیج می ره سراغ اون کلاس و از اون سوال می کنه، یا اینکه بتونید به ازای هر پرداخت تنظیمات مختلفی رو بدید مثل اینکه ممکن ه شما دو درگاه بانک ملی داشته باشید یا حالت هایی از این قبیل که احتمالا موارد کم کاربردی هستند ولی در پروژه پیش بینی شده که البته این ها رو در مستندات پروژه خیلی خلاصه نوشتم که در آینده اگر زمان بود حتما سعی می کنم یک ویدئو آماده کنم و به اشتراک بگذارم. از بحث دور نشیم.به عنوان آخرین کار کافیه که آدرس ها رو برای پروژه تعریف کنیم که این اتفاق هم خیلی راحت می فته. فایل یو ار ال پروژه رو باز کنید و کد زیر رو اضافه کنید. این آدرس ها هم برای اتصال به درگاه و بازگشت و مدیریتشون لازمه. احتمالا یک سری از این کد ها به صورت پیش فرض وجود دارند و فقط نیاز هست که اون دو خطی رو که بولد کردم اضافه کنید.from django.contrib import admin
from django.urls import path

from azbankgateways.urls import az_bank_gateways_urls

admin.autodiscover()

urlpatterns = [
    path(&#039;admin/&#039;, admin.site.urls),
    path(&#039;bankgateways/&#039;, az_bank_gateways_urls()),
]تنها کاری که موند این هست که به دیتا بیس بگیم خودش و آماده کنه برای درگاه ها.python manage.py migrateحالا میخوایم کاربر رو به بانک بفرستیم چیکار کنیم؟می گیم این مبلغ و پرداخت کن. البته که می تونم شماره موبایل کاربر رو هم بفرستم که اگر روی شماره موبایلش کارتی تنظیم شده بود لیست کارت ها رو بانک در زمان پرداخت بهش نمایش بده.from django.urls import reverse
from azbankgateways import bankfactories, models as bank_models, default_settings as settings

def go_to_gateway_view(request):
    # خواندن مبلغ از هر جایی که مد نظر است
    amount = 1000
    # تنظیم شماره موبایل کاربر از هر جایی که مد نظر است
    user_mobile_number = &#039;+989112221234&#039;  # اختیاری

    factory = bankfactories.BankFactory()
    bank = factory.create() 
    bank.set_request(request)
    bank.set_amount(amount)
    # یو آر ال بازگشت به نرم افزار برای ادامه فرآیند
    bank.set_client_callback_url(reverse(&#039;callback-gateway&#039;))
    bank.set_mobile_number(user_mobile_number)  # اختیاری

    bank_record = bank.ready()
 
    # هدایت کاربر به درگاه بانک
    return bank.redirect_gateway()

البته که باید یه آدرس برگشت هم بهش بدیم که بدونه بعد از اینکه پرداخت تموم شد و عملیات تایید و این ها اتفاق افتاد کجا برگرده و بهمون خبر بده. که از این      bank.set_client_callback_url(reverse(&#x27;callback-gateway&#x27;)) استفاده کردیم. همینجا این رو هم اضافه کنم که، فرض کنیم کاربر گفته می خوام از بین چند بانکی که داری به بانک سامان من و متصل کن و پرداخت و از اون طریق انجام بده، کافیه که به جای    bank = factory.create()   کد زیر رو بزاریم factory.create(bank_models.BankType.SEP)و اون موقع است که به جای بانک پیش فرض، مستقیم به بانک سامان متصل میشه. حالا اگر می خواستیم خودش به ترتیبی که توی تنظیمات، تنظیمات و انجام داده بودیم به درگاه ها متصل می شد تا اولین درگاه در دسترس رو پیدا کنه کافی بود به جای این    bank = factory.create()  کد زیر رو میزاشتیم.    bank = factory.auto_create()  حالا فکر کنید از بانک برگشتیم چه طوری میفهیم که پرداخت انجام شده یا نه، خیلی راحت.import logging

from django.http import HttpResponse, Http404
from django.urls import reverse

from azbankgateways import bankfactories, models as bank_models, default_settings as settings


def callback_gateway_view(request):
    tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
    if not tracking_code:
        logging.debug(&amp;quotاین لینک معتبر نیست.&amp;quot)
        raise Http404

    try:
        bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code)
    except bank_models.Bank.DoesNotExist:
        logging.debug(&amp;quotاین لینک معتبر نیست.&amp;quot)
        raise Http404

    # در این قسمت باید از طریق داده هایی که در بانک رکورد وجود دارد، رکورد متناظر یا هر اقدام مقتضی دیگر را انجام دهیم
    if bank_record.is_success:
        # پرداخت با موفقیت انجام پذیرفته است و بانک تایید کرده است.
        # می توانید کاربر را به صفحه نتیجه هدایت کنید یا نتیجه را نمایش دهید.
        return HttpResponse(&amp;quotپرداخت با موفقیت انجام شد.&amp;quot)

    # پرداخت موفق نبوده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.
    return HttpResponse(&amp;quotپرداخت با شکست مواجه شده است. اگر پول کم شده است ظرف مدت ۴۸ ساعت پول به حساب شما بازخواهد گشت.&amp;quot)و تمام!البته که شما می تونین این قسمت ها رو با سناریوی خودتون بنویسید، من سعی کردم تا جای ممکن ساده و بدون پیچیدگی بنویسم. امیدوارم در زمان و انرژی تون صرفه جویی کرده باشه و بتونین تمرکز بیشتری رو روی کارهای خودتون بزارین.اگر درگاهی رو پشتیبانی نکردیم یا اگر موردی رو دیدید خیلی خوبه که رفعش کنید یا اضافه اش کنید ولی اگر به هر دلیلی وقتش رو ندارید حداقل می تونید از طریق Issue ها در گیت های پروژه بقیه رو از وجود اون ها مطلع کنید.آدرس پروژه https://github.com/ali-zahedi/az-iranian-bank-gatewaysآدرس ویدئو آموزشی در آکادمی ژاک</description>
                <category>علی زاهدی گل</category>
                <author>علی زاهدی گل</author>
                <pubDate>Wed, 13 Jan 2021 01:24:13 +0330</pubDate>
            </item>
            </channel>
</rss>