├── MANIFEST.in ├── .github ├── icons │ ├── SS.png │ ├── buddy.svg │ ├── flatpak.svg │ ├── flathub.svg │ ├── freedesktop.svg │ ├── python.svg │ ├── pypi.svg │ └── iterm2.svg ├── FUNDING.yml └── workflows │ ├── test_ve_pypi.yml │ └── flatpakYukle.yml ├── eFatura ├── Assets │ └── logo.png ├── __init__.py ├── arayuz.py ├── Libs │ ├── __init__.py │ └── Oturum.py ├── konsol.py ├── Core │ └── __init__.py └── GUI │ └── __init__.py ├── Shared ├── SRC │ ├── requirements.txt │ ├── tesseract.yaml │ └── python3-requirements.yaml ├── org.KekikAkademi.eFatura.desktop ├── org.KekikAkademi.eFatura.yml ├── org.KekikAkademi.eFatura.appdata.xml └── org.KekikAkademi.eFatura.svg ├── _config.yml ├── pytest.ini ├── Test └── tum_testler.py ├── setup.py ├── .gitignore └── README.md /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include eFatura * -------------------------------------------------------------------------------- /.github/icons/SS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyiflerolsun/eFatura/HEAD/.github/icons/SS.png -------------------------------------------------------------------------------- /eFatura/Assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/keyiflerolsun/eFatura/HEAD/eFatura/Assets/logo.png -------------------------------------------------------------------------------- /Shared/SRC/requirements.txt: -------------------------------------------------------------------------------- 1 | install-freedesktop 2 | rich 3 | requests 4 | urllib3 5 | Pillow 6 | pytesseract -------------------------------------------------------------------------------- /eFatura/__init__.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from eFatura.Core import e_fatura -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | theme : jekyll-theme-cayman 4 | show_downloads : false -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | github: keyiflerolsun 4 | custom: ["https://keyiflerolsun.me/Kahve"] -------------------------------------------------------------------------------- /eFatura/arayuz.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from .GUI import KekikGUI 4 | 5 | def basla(): 6 | arayuz = KekikGUI() 7 | arayuz.goster() -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | [pytest] 4 | testpaths = Test 5 | python_files = *.py 6 | addopts = --ignore-glob=*_.py 7 | python_classes = Test* 8 | python_functions = test_* -------------------------------------------------------------------------------- /Test/tum_testler.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from eFatura import e_fatura 4 | 5 | def test_false(): 6 | assert e_fatura("7430531392") == False 7 | 8 | def test_true(): 9 | assert e_fatura("0080067509") == True -------------------------------------------------------------------------------- /eFatura/Libs/__init__.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from rich.console import Console 4 | konsol = Console(log_path=False) 5 | 6 | import os 7 | 8 | ust_dizin_ver = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n]) 9 | 10 | def dosya_ver(dosya_yolu:str, ust_dizin:int): 11 | return os.path.join(ust_dizin_ver(__file__, ust_dizin), dosya_yolu) -------------------------------------------------------------------------------- /Shared/org.KekikAkademi.eFatura.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=eFatura 3 | GenericName=eFatura Mükellefiyet Sorgu Aracı 4 | Comment=Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu 5 | Version=1.1.1 6 | Keywords=eFatura;KekikAkademi;keyiflerolsun 7 | Exec=eFaturaGUI 8 | Icon=org.KekikAkademi.eFatura 9 | Terminal=false 10 | Type=Application 11 | StartupNotify=true 12 | Categories=Education; -------------------------------------------------------------------------------- /.github/icons/buddy.svg: -------------------------------------------------------------------------------- 1 | Buddy -------------------------------------------------------------------------------- /.github/icons/flatpak.svg: -------------------------------------------------------------------------------- 1 | Flatpak -------------------------------------------------------------------------------- /.github/icons/flathub.svg: -------------------------------------------------------------------------------- 1 | Flathub -------------------------------------------------------------------------------- /eFatura/konsol.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from .Libs import konsol 4 | from eFatura import e_fatura 5 | from sys import argv 6 | 7 | def basla(): 8 | print() 9 | 10 | if len(argv) != 2: 11 | konsol.print("[bold yellow2][!] Lütfen Vergi Numarası veya TC Kimlik Numarası Belirtin..") 12 | konsol.print("\n[turquoise2]Örn.: [pale_green1]eFatura 11111111111\n") 13 | return 14 | 15 | if e_fatura(argv[1]): 16 | konsol.print(f"[green][+] [light_coral]{argv[1]}[/] Numarası E-Fatura Mükellefidir..\n") 17 | else: 18 | konsol.print(f"[red][~] [light_coral]{argv[1]}[/] Numarası E-Fatura Mükellefi Değildir..\n") 19 | 20 | if __name__ == "__main__": 21 | basla() -------------------------------------------------------------------------------- /eFatura/Libs/Oturum.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | import requests, urllib3, ssl 4 | 5 | class CustomHttpAdapter(requests.adapters.HTTPAdapter): 6 | def __init__(self, ssl_context=None, **kwargs): 7 | self.ssl_context = ssl_context 8 | super().__init__(**kwargs) 9 | 10 | def init_poolmanager(self, connections, maxsize, block=False): 11 | self.poolmanager = urllib3.poolmanager.PoolManager( 12 | num_pools=connections, maxsize=maxsize, 13 | block=block, ssl_context=self.ssl_context 14 | ) 15 | 16 | def legacy_session(): 17 | ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) 18 | ctx.options |= 0x4 # OP_LEGACY_SERVER_CONNECT 19 | 20 | session = requests.session() 21 | session.mount("https://", CustomHttpAdapter(ctx)) 22 | return session -------------------------------------------------------------------------------- /Shared/SRC/tesseract.yaml: -------------------------------------------------------------------------------- 1 | # ! https://github.com/flathub/com.github.dynobo.normcap/blob/master/com.github.dynobo.normcap.yml 2 | name: tesseract 3 | buildsystem: simple 4 | build-commands: [] 5 | modules: 6 | - name: leptonica 7 | buildsystem: cmake-ninja 8 | builddir: true 9 | sources: 10 | - type: archive 11 | url: https://github.com/DanBloomberg/leptonica/releases/download/1.82.0/leptonica-1.82.0.tar.gz 12 | sha256: 155302ee914668c27b6fe3ca9ff2da63b245f6d62f3061c8f27563774b8ae2d6 13 | 14 | - name: tesseract 15 | buildsystem: cmake-ninja 16 | builddir: true 17 | sources: 18 | - type: archive 19 | url: https://github.com/tesseract-ocr/tesseract/archive/refs/tags/5.2.0.zip 20 | sha256: f30e343cb93ca77f1fad013aeb87edb9191dcd1c7d4ee55d425f70c2af7817a1 21 | 22 | - name: tessdata-fast 23 | buildsystem: simple 24 | build-commands: 25 | - cp * /app/share/tessdata 26 | sources: 27 | - type: file 28 | url: https://github.com/tesseract-ocr/tessdata_fast/raw/4.1.0/eng.traineddata 29 | sha256: 7d4322bd2a7749724879683fc3912cb542f19906c83bcc1a52132556427170b2 -------------------------------------------------------------------------------- /.github/icons/freedesktop.svg: -------------------------------------------------------------------------------- 1 | freedesktop.org -------------------------------------------------------------------------------- /eFatura/Core/__init__.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from ..Libs.Oturum import legacy_session 4 | from shutil import copyfileobj 5 | from uuid import uuid4 6 | from os import remove 7 | from PIL import Image 8 | from pytesseract import image_to_string 9 | 10 | def e_fatura(vergi_numarasi:str) -> bool: 11 | """Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu""" 12 | captcha_resmi = f"captcha_{uuid4()}.jpg" 13 | 14 | while True: 15 | oturum = legacy_session() 16 | oturum.headers.update({ 17 | "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36" 18 | }) 19 | 20 | captcha_istek = oturum.get("https://sorgu.efatura.gov.tr/kullanicilar/img.php", stream=True) 21 | with open(captcha_resmi, "wb") as dosya: 22 | copyfileobj(captcha_istek.raw, dosya) 23 | 24 | captcha_metni = image_to_string(Image.open(captcha_resmi)).strip() 25 | remove(captcha_resmi) 26 | 27 | e_fatura_istek = oturum.post( 28 | url = "https://sorgu.efatura.gov.tr/kullanicilar/xliste.php", 29 | data = {"search_string": f"{vergi_numarasi}", "captcha_code": f"{captcha_metni}", "submit": "Ara"} 30 | ) 31 | if "Güvenlik kodu hatalı" in e_fatura_istek.text: 32 | continue 33 | 34 | return "Mükellef kayıtlıdır" in e_fatura_istek.text -------------------------------------------------------------------------------- /.github/icons/python.svg: -------------------------------------------------------------------------------- 1 | Python -------------------------------------------------------------------------------- /.github/icons/pypi.svg: -------------------------------------------------------------------------------- 1 | PyPI -------------------------------------------------------------------------------- /.github/icons/iterm2.svg: -------------------------------------------------------------------------------- 1 | iTerm2 -------------------------------------------------------------------------------- /Shared/org.KekikAkademi.eFatura.yml: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | app-id: org.KekikAkademi.eFatura 4 | runtime: org.gnome.Platform 5 | runtime-version: "44" 6 | sdk: org.gnome.Sdk 7 | command: eFaturaGUI 8 | 9 | finish-args: 10 | # ? X11 + XShm Erişimi 11 | - --share=ipc 12 | # - --socket=x11 13 | # ? Wayland Erişimi 14 | - --socket=wayland 15 | # ? Wayland mevcut olmadığında X11 Erişimi Ver 16 | - --socket=fallback-x11 17 | # ? Ağ Erişimi 18 | - --share=network 19 | # ? PulseAudio Kullanarak Sesleri Çal 20 | - --socket=pulseaudio 21 | # ? Bildirim Erişim İzni 22 | # - --talk-name=org.freedesktop.Notifications 23 | # ! tesseract Erişim 24 | - --env=TESSDATA_PREFIX=/app/share/tessdata 25 | 26 | # ! tesseract Çöpü Temizle 27 | cleanup: 28 | - /sbin 29 | - /include 30 | - /lib/cmake 31 | - /lib/pkgconfig 32 | - /bin/protoc 33 | - /share/doc 34 | - /share/pkgconfig 35 | - /share/man 36 | - /share/cmake* 37 | - "*.a" 38 | - "*.la" 39 | 40 | modules: 41 | - SRC/tesseract.yaml 42 | # * Kurulumda İnternet Olduğu için Gereksiz 43 | # - SRC/python3-requirements.yaml 44 | 45 | - name: eFatura-yukleyici 46 | buildsystem: simple 47 | build-commands: 48 | - install -Dm644 Shared/org.KekikAkademi.eFatura.desktop /app/share/applications/org.KekikAkademi.eFatura.desktop 49 | - install -Dm644 Shared/org.KekikAkademi.eFatura.appdata.xml /app/share/appdata/org.KekikAkademi.eFatura.appdata.xml 50 | - install -Dm644 Shared/org.KekikAkademi.eFatura.svg /app/share/icons/hicolor/scalable/apps/org.KekikAkademi.eFatura.svg 51 | - python3 -m pip install . --prefix=${FLATPAK_DEST} 52 | 53 | # * Lokal Kurulum (İnternet Erişimi Var) 54 | build-options: 55 | build-args: 56 | - "--share=network" 57 | sources: 58 | - type: dir 59 | path: "." 60 | 61 | # ! FlatHub Kurulum (İnternet Erişimi Yok) 62 | # sources: 63 | # - type: git 64 | # url: https://github.com/keyiflerolsun/eFatura.git 65 | # commit: 48dec866986d3b5304d3dd07ad61dd16bb98dc4c -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from setuptools import setup 4 | from io import open 5 | 6 | setup( 7 | # ? Genel Bilgiler 8 | name = "eFatura", 9 | version = "1.1.1", 10 | url = "https://github.com/keyiflerolsun/eFatura", 11 | description = "Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu", 12 | keywords = ["eFatura", "KekikAkademi", "keyiflerolsun"], 13 | 14 | author = "keyiflerolsun", 15 | author_email = "keyiflerolsun@gmail.com", 16 | 17 | license = "GPLv3+", 18 | classifiers = [ 19 | "Development Status :: 5 - Production/Stable", 20 | "License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)", 21 | "Programming Language :: Python :: 3" 22 | ], 23 | 24 | # ? Paket Bilgileri 25 | packages = ["eFatura"], 26 | python_requires = ">=3.10", 27 | install_requires = [ 28 | "setuptools", 29 | "wheel", 30 | "install_freedesktop", 31 | "rich", 32 | "requests", 33 | "urllib3", 34 | "Pillow", 35 | "pytesseract" 36 | ], 37 | 38 | # ? Konsoldan Çalıştırılabilir 39 | entry_points = { 40 | "console_scripts": [ 41 | "eFatura = eFatura.konsol:basla", 42 | "eFaturaGUI = eFatura.arayuz:basla" 43 | ] 44 | }, 45 | 46 | # ? Masaüstü Paketi 47 | setup_requires = ["install_freedesktop"], 48 | data_files = [ 49 | ("share/appdata", ["Shared/org.KekikAkademi.eFatura.appdata.xml"]), 50 | ("share/applications", ["Shared/org.KekikAkademi.eFatura.desktop"]), 51 | ("share/icons/hicolor/scalable/apps", ["Shared/org.KekikAkademi.eFatura.svg"]) 52 | ], 53 | 54 | # ? PyPI Bilgileri 55 | long_description_content_type = "text/markdown", 56 | long_description = "".join(open("README.md", encoding="utf-8").readlines()), 57 | include_package_data = True 58 | ) -------------------------------------------------------------------------------- /Shared/org.KekikAkademi.eFatura.appdata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CC0-1.0 6 | GPL-3.0 7 | 8 | org.KekikAkademi.eFatura.desktop 9 | org.KekikAkademi.eFatura.desktop 10 | 11 | eFatura 12 | E-Invoice Usage Inquiry from Tax or TR Identity Number 13 | Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu 14 | 15 | keyiflerolsun 16 | https://KekikAkademi.org 17 | https://keyiflerolsun.me/Kahve 18 | https://t.me/KekikKahve 19 | https://github.com/keyiflerolsun/eFatura 20 | https://github.com/keyiflerolsun/eFatura/issues 21 | https://blog.keyiflerolsun.dev 22 | 23 | 24 |

E-Invoice Usage Inquiry from Tax or TR Identity Number

25 |

An example application prepared with Python language and GTK Library.

26 |
27 | 28 | 29 |

Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu

30 |

https://t.me/KekikAkademi için hazırlanmıştır..

31 |
32 | 33 | 34 | 35 | https://raw.githubusercontent.com/keyiflerolsun/eFatura/main/.github/icons/SS.png 36 | 37 | 38 | 39 | 40 | Education 41 | 42 | 43 | 44 | 45 | 46 |

47 | Çeşitli iyileştirmeler yapıldı.. 48 |

49 |
50 |
51 | 52 | 53 |
54 | 55 | 56 |
-------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | # Flatpak 132 | .flatpak-builder/ 133 | flatpak/ 134 | flatpak-pip-generator -------------------------------------------------------------------------------- /.github/workflows/test_ve_pypi.yml: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | name: Fonksiyon Testleri ve PyPI Yükle 4 | 5 | on: [push, pull_request] 6 | 7 | jobs: 8 | KekikTest: 9 | name: Fonksiyon Testleri 10 | 11 | strategy: 12 | matrix: 13 | python-version: ["3.10.8"] 14 | os: ["ubuntu-latest"] 15 | 16 | runs-on: ${{ matrix.os }} 17 | steps: 18 | - name: Depo Kontrolü 19 | uses: actions/checkout@v3 20 | 21 | - name: Python ${{ matrix.python-version }} Sürümü Yükleniyor 22 | uses: actions/setup-python@v4 23 | with: 24 | python-version: ${{ matrix.python-version }} 25 | 26 | - name: Python Sürümünü Göster 27 | run : python -c "import sys; print(sys.version)" 28 | 29 | - name: Tesseract OCR Yükle 30 | run : | 31 | sudo apt-get update && sudo apt-get install tesseract-ocr 32 | 33 | - name: Pytest'i Yükle 34 | run : | 35 | python -m pip install --upgrade pip 36 | pip install pytest 37 | 38 | - name: Kütüphaneyi Yükle 39 | run : pip install . 40 | 41 | - name: Test Dosyalarını Çalıştır 42 | run : pytest 43 | 44 | # - name: Test Dosyalarını Windows Ortamda Çalıştır 45 | # if: matrix.os == 'windows-latest' 46 | # shell: cmd 47 | # run: | 48 | # cd ${{ github.workspace }}/Testler 49 | # FOR %%i in (*.py) DO python -m pytest %%i 50 | 51 | # - name: Test Dosyalarını Posix Ortamda Çalıştır 52 | # if: matrix.os != 'windows-latest' 53 | # run: pytest Testler/* 54 | 55 | 56 | 57 | PyPIYukleyici: 58 | name : PyPI Yükleyici 59 | runs-on : ubuntu-latest 60 | needs : KekikTest 61 | 62 | steps: 63 | - name: Depo Kontrolü 64 | uses: actions/checkout@v3 65 | 66 | - name: Python 3.10.8 Yükle 67 | uses: actions/setup-python@v4 68 | with: 69 | python-version: "3.10.8" 70 | 71 | - name: Python Sürümünü Göster 72 | run : python -c "import sys; print(sys.version)" 73 | 74 | - name: Gereksinimleri Yükle 75 | run : | 76 | python -m pip install --upgrade pip 77 | pip install -U setuptools wheel build twine 78 | 79 | - name: Kütüphaneyi PyPI'ye Yükle 80 | env : 81 | TWINE_USERNAME: __token__ 82 | TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} 83 | run : | 84 | python -m build --sdist --wheel 85 | twine check dist/* 86 | python -m twine upload dist/* 87 | rm -rf build/ dist/ *.egg-info/ -------------------------------------------------------------------------------- /.github/workflows/flatpakYukle.yml: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | name: Flatpak Yükleyici 4 | 5 | on: [push, pull_request] 6 | 7 | jobs: 8 | FlatpakYukleyici: 9 | name : Flatpak Yükleyici 10 | runs-on : ubuntu-latest 11 | 12 | steps: 13 | - name: Depo Kontrolü 14 | uses: actions/checkout@v3 15 | with: 16 | fetch-depth: 2 17 | 18 | - name: Python 3.10.8 Yükle 19 | uses: actions/setup-python@v4 20 | with: 21 | python-version: "3.10.8" 22 | 23 | - name: Değişkenleri Ayarla 24 | run : | 25 | PAKET_V=$(cat setup.py | grep -oP "(?<=version = \").*?(?=\")") 26 | PAKET_ADI=$(cat setup.py | sed -n 's/.*"\(Shared\/\([^"]*\)\.desktop\)".*/\2/p') 27 | 28 | echo "PAKET_V=$PAKET_V" >> $GITHUB_ENV 29 | echo "PAKET_ADI=$PAKET_ADI" >> $GITHUB_ENV 30 | 31 | echo "Paket Adı: $PAKET_ADI" 32 | echo "Paket Sürümü: $PAKET_V" 33 | 34 | - name: Gereksinimleri Yükle 35 | run : | 36 | python -m pip install --upgrade pip 37 | pip install setuptools wheel pyyaml 38 | sudo apt update -qq 39 | sudo apt install -y flatpak flatpak-builder --fix-missing 40 | flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo --user 41 | flatpak remote-add --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo --user 42 | flatpak update && flatpak upgrade 43 | flatpak install flathub org.gnome.{Platform,Sdk}//44 -y --noninteractive --user 44 | 45 | - name: Paketle 46 | run : | 47 | mv Shared/*.yml . && mv Shared/SRC . 48 | flatpak-builder --repo=github --force-clean build-dir $PAKET_ADI.yml 49 | flatpak build-bundle github $PAKET_ADI.flatpak $PAKET_ADI 50 | 51 | - name: Artıkları Temizle 52 | run : | 53 | rm -rf .flatpak* .vscode build-dir && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf 54 | 55 | - name: Paketi GitHub'a Yükle 56 | uses: actions/upload-artifact@v3 57 | with: 58 | name: ${{ env.PAKET_ADI }} 59 | path: ./${{ env.PAKET_ADI }}.flatpak 60 | 61 | - name: Güncelleme Kontrol Et 62 | id : guncelleme_var_mi 63 | run : | 64 | if git diff --name-only HEAD^ | grep -q "setup.py"; then echo "degisiklik=true"; else echo "degisiklik=false"; fi >> $GITHUB_OUTPUT 65 | 66 | - name: GitHub Release Oluştur 67 | if : steps.guncelleme_var_mi.outputs.degisiklik == 'true' 68 | uses: softprops/action-gh-release@v1 69 | env : 70 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 71 | with: 72 | tag_name : ${{ env.PAKET_V }} 73 | body : 🕊 **${{ env.PAKET_ADI }}** _GitHub tarafından_ `${{ env.PAKET_V }}`'e _Otomatik olarak paketlendi.._ 74 | draft : false 75 | prerelease : false 76 | files : | 77 | ./${{ env.PAKET_ADI }}.flatpak -------------------------------------------------------------------------------- /Shared/org.KekikAkademi.eFatura.svg: -------------------------------------------------------------------------------- 1 | invoice_fabicon -------------------------------------------------------------------------------- /eFatura/GUI/__init__.py: -------------------------------------------------------------------------------- 1 | # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır. 2 | 3 | from gi import require_version 4 | require_version("Gtk", "3.0") 5 | 6 | from gi.repository import Gtk, GLib 7 | from eFatura import e_fatura 8 | from ..Libs import dosya_ver 9 | 10 | class KekikGUI(Gtk.Window): 11 | def __init__(self): 12 | super().__init__( 13 | title = "eFatura", 14 | default_width = 300, 15 | default_height = 200, 16 | resizable = False 17 | ) 18 | self.set_position(Gtk.WindowPosition.CENTER) 19 | self.connect("delete-event", self.pencereyi_kapat) 20 | self.set_icon_from_file(dosya_ver("Assets/logo.png", ust_dizin=2)) 21 | 22 | ayarlar = Gtk.Settings.get_default() 23 | ayarlar.set_property("gtk-application-prefer-dark-theme", True) 24 | 25 | self.header = Gtk.HeaderBar( 26 | title = "eFatura", 27 | subtitle = "Mükellefiyet Sorgu Aracı", 28 | show_close_button = True 29 | ) 30 | self.hakkinda_butonu = Gtk.Button.new_from_icon_name("help-about", Gtk.IconSize.SMALL_TOOLBAR) 31 | self.hakkinda_butonu.connect("clicked", self.hakkinda_ac) 32 | self.header.pack_end(self.hakkinda_butonu) 33 | self.set_titlebar(self.header) 34 | 35 | self.pencere = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10, margin=20) 36 | self.add(self.pencere) 37 | 38 | # ! 39 | Program(self) 40 | # ! 41 | 42 | def pencereyi_kapat(self, widget, event): 43 | dialog = Gtk.MessageDialog( 44 | parent = self, 45 | modal = True, 46 | destroy_with_parent = True, 47 | message_type = Gtk.MessageType.QUESTION, 48 | buttons = Gtk.ButtonsType.OK_CANCEL, 49 | text = "Program Kapanıyor", 50 | ) 51 | dialog.format_secondary_text("Bunu yapmak istediğinize emin misiniz?") 52 | response = dialog.run() 53 | dialog.destroy() 54 | 55 | if response == Gtk.ResponseType.OK: 56 | Gtk.main_quit() 57 | else: 58 | return True 59 | 60 | def goster(self): 61 | self.show_all() 62 | Gtk.main() 63 | 64 | def hakkinda_ac(self, widget): 65 | self.hakkinda = Gtk.AboutDialog( 66 | transient_for = self, 67 | modal = True, 68 | logo_icon_name = "org.KekikAkademi.eFatura", 69 | program_name = "eFatura Sorgu", 70 | version = "1.0.8", 71 | comments = "Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu", 72 | website_label = "Bağış Yap", 73 | website = "https://keyiflerolsun.dev/Kahve", 74 | copyright = "Copyright (C) 2023 by keyiflerolsun", 75 | license_type = Gtk.License.GPL_3_0, 76 | authors = ["keyiflerolsun"] 77 | ) 78 | self.hakkinda.add_credit_section(("Özel Teşekkürler"), ("@KekikAkademi", "@KekikKahve")) 79 | self.hakkinda.connect("response", self.__hakkinda_takip) 80 | self.hakkinda.show() 81 | 82 | def __hakkinda_takip(self, dialog, response_id): 83 | if response_id in [Gtk.ResponseType.CLOSE, Gtk.ResponseType.DELETE_EVENT]: 84 | dialog.hide() 85 | 86 | class Program(): 87 | def __init__(self, parent:Gtk.Window): 88 | self.parent = parent 89 | 90 | sorgu_alani = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) 91 | parent.pencere.pack_start(sorgu_alani, False, False, 0) 92 | 93 | self.arama_metni = Gtk.Entry(placeholder_text="Vergi / TC Kimlik Numarası") 94 | self.arama_metni.connect("activate", self.ara_butonuna_tiklandiginda) 95 | sorgu_alani.pack_start(self.arama_metni, False, False, 0) 96 | 97 | self.ara_butonu = Gtk.Button(label="Ara") 98 | self.ara_butonu.connect("clicked", self.ara_butonuna_tiklandiginda) 99 | sorgu_alani.pack_start(self.ara_butonu, False, False, 0) 100 | self.ara_butonu.grab_focus() 101 | 102 | self.cikti_alani = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) 103 | parent.pencere.pack_start(self.cikti_alani, True, True, 0) 104 | 105 | def ara_butonuna_tiklandiginda(self, widget): 106 | self.ara_butonu.grab_focus() 107 | arama_sorgusu = self.arama_metni.get_text() 108 | self.arama_metni.set_text("") 109 | 110 | self.cikti_alani.foreach(Gtk.Widget.destroy) 111 | 112 | bekleme_etiketi = Gtk.Label() 113 | bekleme_etiketi.set_markup("Lütfen Bekleyiniz...") 114 | bekleme_etiketi.set_margin_top(10) 115 | bekleme_etiketi.set_halign(Gtk.Align.CENTER) 116 | bekleme_etiketi.set_justify(Gtk.Justification.CENTER) 117 | bekleme_etiketi.set_line_wrap(True) 118 | bekleme_etiketi.set_max_width_chars(30) 119 | self.cikti_alani.pack_start(bekleme_etiketi, False, False, 0) 120 | self.parent.show_all() 121 | 122 | def arama_tamamlandi(): 123 | sonuc = e_fatura(arama_sorgusu) 124 | if sonuc: 125 | bekleme_etiketi.set_markup(f"{arama_sorgusu} Numarası\nE-Fatura Mükellefidir..") 126 | else: 127 | bekleme_etiketi.set_markup(f"{arama_sorgusu} Numarası\nE-Fatura Mükellefi Değildir..") 128 | self.parent.show_all() 129 | 130 | GLib.timeout_add(100, arama_tamamlandi) -------------------------------------------------------------------------------- /Shared/SRC/python3-requirements.yaml: -------------------------------------------------------------------------------- 1 | # Generated with flatpak-pip-generator --checker-data --yaml --requirements-file=SRC/requirements.txt --runtime=org.gnome.Sdk//44 2 | name: python3-requirements 3 | build-commands: [] 4 | buildsystem: simple 5 | modules: 6 | - name: python3-install-freedesktop 7 | buildsystem: simple 8 | build-commands: 9 | - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}" 10 | --prefix=${FLATPAK_DEST} "install-freedesktop" --no-build-isolation 11 | sources: 12 | - type: file 13 | url: https://files.pythonhosted.org/packages/99/33/5dfcb7d0c1bd0fe47e20fd6a0edde86ab15b7bbfba95c192af08c2e448c1/install_freedesktop-0.1.2-py2.py3-none-any.whl 14 | sha256: 10b8a91f9493f20e9b57d8130701b6e30595adcf3df62416e90a48404bf59676 15 | x-checker-data: 16 | name: install_freedesktop 17 | packagetype: bdist_wheel 18 | type: pypi 19 | - name: python3-rich 20 | buildsystem: simple 21 | build-commands: 22 | - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}" 23 | --prefix=${FLATPAK_DEST} "rich" --no-build-isolation 24 | sources: 25 | - type: file 26 | url: https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl 27 | sha256: 355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1 28 | x-checker-data: 29 | name: markdown_it_py 30 | packagetype: bdist_wheel 31 | type: pypi 32 | - type: file 33 | url: https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl 34 | sha256: 84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 35 | x-checker-data: 36 | name: mdurl 37 | packagetype: bdist_wheel 38 | type: pypi 39 | - type: file 40 | url: https://files.pythonhosted.org/packages/fc/1e/482e5eec0b89b593e81d78f819a9412849814e22225842b598908e7ac560/rich-13.4.2-py3-none-any.whl 41 | sha256: 8f87bc7ee54675732fa66a05ebfe489e27264caeeff3728c945d25971b6485ec 42 | x-checker-data: 43 | name: rich 44 | packagetype: bdist_wheel 45 | type: pypi 46 | - name: python3-requests 47 | buildsystem: simple 48 | build-commands: 49 | - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}" 50 | --prefix=${FLATPAK_DEST} "requests" --no-build-isolation 51 | sources: 52 | - type: file 53 | url: https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl 54 | sha256: c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716 55 | x-checker-data: 56 | name: certifi 57 | packagetype: bdist_wheel 58 | type: pypi 59 | - type: file 60 | url: https://files.pythonhosted.org/packages/ff/d7/8d757f8bd45be079d76309248845a04f09619a7b17d6dfc8c9ff6433cac2/charset-normalizer-3.1.0.tar.gz 61 | sha256: 34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5 62 | x-checker-data: 63 | name: charset-normalizer 64 | type: pypi 65 | - type: file 66 | url: https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl 67 | sha256: 90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 68 | x-checker-data: 69 | name: idna 70 | packagetype: bdist_wheel 71 | type: pypi 72 | - type: file 73 | url: https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl 74 | sha256: 58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f 75 | x-checker-data: 76 | name: requests 77 | packagetype: bdist_wheel 78 | type: pypi 79 | - &id001 80 | type: file 81 | url: https://files.pythonhosted.org/packages/8a/03/ad9306a50d05c166e3456fe810f33cee2b8b2a7a6818ec5d4908c4ec6b36/urllib3-2.0.3-py3-none-any.whl 82 | sha256: 48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 83 | x-checker-data: 84 | name: urllib3 85 | packagetype: bdist_wheel 86 | type: pypi 87 | - name: python3-urllib3 88 | buildsystem: simple 89 | build-commands: 90 | - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}" 91 | --prefix=${FLATPAK_DEST} "urllib3" --no-build-isolation 92 | sources: 93 | - *id001 94 | - name: python3-Pillow 95 | buildsystem: simple 96 | build-commands: 97 | - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}" 98 | --prefix=${FLATPAK_DEST} "Pillow" --no-build-isolation 99 | sources: 100 | - &id002 101 | type: file 102 | url: https://files.pythonhosted.org/packages/00/d5/4903f310765e0ff2b8e91ffe55031ac6af77d982f0156061e20a4d1a8b2d/Pillow-9.5.0.tar.gz 103 | sha256: bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1 104 | x-checker-data: 105 | name: Pillow 106 | type: pypi 107 | - name: python3-pytesseract 108 | buildsystem: simple 109 | build-commands: 110 | - pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}" 111 | --prefix=${FLATPAK_DEST} "pytesseract" --no-build-isolation 112 | sources: 113 | - *id002 114 | - type: file 115 | url: https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl 116 | sha256: 994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 117 | x-checker-data: 118 | name: packaging 119 | packagetype: bdist_wheel 120 | type: pypi 121 | - type: file 122 | url: https://files.pythonhosted.org/packages/c5/54/ec007336f38d2d4ce61f3544af3e6855dacbf04a1ac8294f10cabe81146f/pytesseract-0.3.10-py3-none-any.whl 123 | sha256: 8f22cc98f765bf13517ead0c70effedb46c153540d25783e04014f28b55a5fc6 124 | x-checker-data: 125 | name: pytesseract 126 | packagetype: bdist_wheel 127 | type: pypi -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # eFatura 2 | 3 | [![Boyut](https://img.shields.io/github/repo-size/keyiflerolsun/eFatura?logo=git&logoColor=white&label=Boyut)](#) 4 | [![Görüntülenme](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https://github.com/keyiflerolsun/eFatura&title=Görüntülenme)](#) 5 | 6 | 7 | [![GitHub](https://img.shields.io/github/v/release/keyiflerolsun/eFatura?logo=github&label=GitHub)](https://github.com/keyiflerolsun/eFatura/releases) 8 | [![Fonksiyon Testleri ve PyPI Yükle](https://img.shields.io/github/actions/workflow/status/keyiflerolsun/eFatura/test_ve_pypi.yml?label=PyPI%20Y%C3%BCkleyici&logo=github)](https://github.com/keyiflerolsun/eFatura/actions/workflows/test_ve_pypi.yml) 9 | [![Flatpak Yükleyici](https://img.shields.io/github/actions/workflow/status/keyiflerolsun/eFatura/flatpakYukle.yml?label=Flatpak%20Y%C3%BCkleyici&logo=github)](https://github.com/keyiflerolsun/eFatura/actions/workflows/flatpakYukle.yml) 10 | 11 | [![FlatHub](https://img.shields.io/flathub/v/org.KekikAkademi.eFatura?logo=flathub&logoColor=white&label=FlatHub)](https://flathub.org/tr/apps/org.KekikAkademi.eFatura) 12 | [![FlatHub - Yüklenme](https://img.shields.io/flathub/downloads/org.KekikAkademi.eFatura?logo=flathub&logoColor=white&label=Yüklenme)](https://flathub.org/tr/apps/org.KekikAkademi.eFatura) 13 | 14 | [![PyPI](https://img.shields.io/pypi/v/eFatura?logo=pypi&logoColor=white&label=PyPI)](https://pypi.org/project/eFatura) 15 | [![PyPI - Yüklenme](https://img.shields.io/pypi/dm/eFatura?logo=pypi&logoColor=white&label=Yüklenme)](https://pypi.org/project/eFatura) 16 | [![PyPI - Wheel](https://img.shields.io/pypi/wheel/eFatura?logo=pypi&logoColor=white&label=Wheel)](https://pypi.org/project/eFatura) 17 | 18 | [![Python Version](https://img.shields.io/pypi/pyversions/eFatura?logo=python&logoColor=white&label=Python)](#) 19 | [![Lisans](https://img.shields.io/pypi/l/eFatura?logo=gnu&logoColor=white&label=Lisans)](#) 20 | [![Durum](https://img.shields.io/pypi/status/eFatura?logo=windowsterminal&logoColor=white&label=Durum)](#) 21 | 22 | *Vergi veya TC Kimlik Numarasından E-Fatura Mükellefiyet Sorgusu* 23 | 24 | [![eFatura](https://raw.githubusercontent.com/keyiflerolsun/eFatura/main/.github/icons/SS.png)](#) 25 | 26 | [![ForTheBadge made-with-python](https://ForTheBadge.com/images/badges/made-with-python.svg)](https://www.python.org/) 27 | [![ForTheBadge built-with-love](https://ForTheBadge.com/images/badges/built-with-love.svg)](https://GitHub.com/keyiflerolsun/) 28 | 29 | ## 🚀 Kurulum 30 | 31 | ### PyPI (Lib - CLI - UI) 32 | 33 | ```bash 34 | # Yüklemek 35 | pip install eFatura 36 | 37 | # Güncellemek 38 | pip install -U eFatura 39 | ``` 40 | 41 | ### FlatHub (UI) 42 | 43 | ```bash 44 | # Yüklemek 45 | flatpak install flathub org.KekikAkademi.eFatura 46 | 47 | # Çalıştırmak 48 | flatpak run org.KekikAkademi.eFatura 49 | ``` 50 | 51 | ## 📝 Kullanım 52 | 53 | ### Lib 54 | 55 | ```python 56 | from eFatura import e_fatura 57 | 58 | print(e_fatura("11111111111")) # Vergi Numarası veya TC Kimlik Numarası 59 | 60 | >> True | False 61 | ``` 62 | 63 | ### CLI 64 | 65 | ```bash 66 | eFatura 11111111111 67 | 68 | # » [~] 11111111111 Numarası E-Fatura Mükellefi Değildir.. 69 | ``` 70 | 71 | ### UI 72 | 73 | ```bash 74 | eFaturaGUI 75 | 76 | # veya 77 | 78 | flatpak run org.KekikAkademi.eFatura 79 | ``` 80 | 81 | --- 82 | 83 |
84 | 85 | Kendiniz Paketlemek İsterseniz 86 | (genişletmek için tıklayın!) 87 | 88 |
89 | 90 | ### Python 91 | 92 | ```bash 93 | # Depoyu Çek 94 | https://github.com/keyiflerolsun/eFatura.git 95 | cd eFatura 96 | 97 | # Gerekli Ortamları Kur 98 | pip install -U pip setuptools wheel 99 | 100 | # Paketi Yükle 101 | pip install . 102 | 103 | # Artıkları Temizle 104 | rm -rf build *.egg-info 105 | 106 | # Çalıştır 107 | eFatura # CLI 108 | eFaturaGUI # GUI 109 | 110 | # Paketi Kaldır 111 | pip uninstall eFatura 112 | ``` 113 | 114 | ### FlatPak 115 | 116 | ```bash 117 | # Depoyu Çek 118 | git clone https://github.com/keyiflerolsun/eFatura.git 119 | cd eFatura 120 | 121 | # Gerekli Dosyaları Al 122 | mv Shared/*.yml . && mv Shared/SRC . 123 | 124 | # Gerekli Ortamları Kur 125 | flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo 126 | flatpak remote-add --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo 127 | flatpak update && flatpak upgrade 128 | flatpak install flathub org.gnome.{Platform,Sdk}//44 129 | 130 | # Paketle 131 | flatpak-builder --user --install --force-clean build-dir org.KekikAkademi.eFatura.yml 132 | 133 | # Artıkları Temizle 134 | rm -rf .flatpak* .vscode build-dir && find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf 135 | 136 | # Çalıştır 137 | flatpak run org.KekikAkademi.eFatura 138 | 139 | # Paketi Kaldır 140 | flatpak uninstall org.KekikAkademi.eFatura 141 | ``` 142 | 143 |
144 | 145 | --- 146 | 147 | ## 📝 Proje Sahibi 148 | 149 | - ✅ **[kmprens/CheckEinvoice](https://github.com/kmprens/CheckEinvoice)** 150 | 151 | ## 🌐 Telif Hakkı ve Lisans 152 | 153 | * *Copyright (C) 2023 by* [keyiflerolsun](https://github.com/keyiflerolsun) ❤️️ 154 | * [GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007](https://github.com/keyiflerolsun/eFatura/blob/master/LICENSE) *Koşullarına göre lisanslanmıştır..* 155 | 156 | ## ♻️ İletişim 157 | 158 | *Benimle iletişime geçmek isterseniz, **Telegram**'dan mesaj göndermekten çekinmeyin;* [@keyiflerolsun](https://t.me/KekikKahve) 159 | 160 | ## 💸 Bağış Yap 161 | 162 | **[☕️ Kahve Ismarla](https://KekikAkademi.org/Kahve)** 163 | 164 | *** 165 | 166 | > **[@KekikAkademi](https://t.me/KekikAkademi)** *için yazılmıştır..* --------------------------------------------------------------------------------