## SmartFaker
A powerful Asynchronous Python library for generating fake addresses, supporting up to 181 countries. Ideal for bots, MTProto API frameworks, and Python scripts.
### Installation
```bash
pip install smartfaker
```
### Usage
#### Basic Asyncio Example
```python
import asyncio
from smartfaker import Faker
fake = Faker()
async def main():
print("Enter country code (e.g., BD):")
country_code = input().strip().upper()
if not country_code:
print("Country code is required.")
return
print("Enter amount (default 1):")
amount_input = input().strip()
amount = 1 if not amount_input else int(amount_input)
try:
addresses = await fake.address(country_code, amount)
if amount == 1:
print(addresses)
else:
for addr in addresses:
print(addr)
except ValueError as e:
print(f"Error: {e}")
if __name__ == "__main__":
asyncio.run(main())
```
#### Basic Pyrofork Example
```python
import asyncio
import logging
from pyrogram import Client, filters
from pyrogram.types import Message, InlineKeyboardButton, InlineKeyboardMarkup
from pyrogram.enums import ParseMode
from smartfaker import Faker
import pycountry
LOGGER = logging.getLogger(__name__)
LOGGER.setLevel(logging.INFO)
COMMAND_PREFIX = ["/", ",", ".", "!", "#"]
app = Client(
"my_bot",
api_id=YOUR_API_ID,
api_hash="YOUR_API_HASH",
bot_token="YOUR_BOT_TOKEN"
)
fake = Faker()
page_data = {}
def get_flag(country_code):
try:
return ''.join(chr(0x1F1E6 + ord(c) - ord('A')) for c in country_code.upper())
except Exception:
return "🏚"
@app.on_message(filters.command("start", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))
async def start_handler(client: Client, message: Message):
welcome_text = (
"**Welcome to SmartFaker Bot! 🚀**\n"
"**━━━━━━━━━━━━━**\n"
"Generate fake addresses easily!\n"
"Use **/fake <code>** for an address (e.g., /fake BD).\n"
"Use **/countries** to list available countries.\n"
"**━━━━━━━━━━━━━**\n"
"Powered by @ISmartCoder | Updates: t.me/TheSmartDev"
)
await client.send_message(message.chat.id, welcome_text, parse_mode=ParseMode.MARKDOWN)
@app.on_message(filters.command(["fake", "rnd"], prefixes=COMMAND_PREFIX) & (filters.private | filters.group))
async def fake_handler(client: Client, message: Message):
if len(message.command) <= 1:
await client.send_message(message.chat.id, "**❌ Please Provide A Country Code**", parse_mode=ParseMode.MARKDOWN)
LOGGER.warning(f"Invalid command format: {message.text}")
return
country_code = message.command[1].upper()
if country_code == "UK":
country_code = "GB"
generating_message = await client.send_message(message.chat.id, "**Generating Fake Address...**", parse_mode=ParseMode.MARKDOWN)
try:
data = await fake.address(country_code)
flag_emoji = data['country_flag']
keyboard = InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton("Copy Postal Code", callback_data=f"copy:{data['postal_code']}")]
])
await generating_message.edit_text(
f"**Address for {data['country']} {flag_emoji}**\n"
f"**━━━━━━━━━━━━━**\n"
f"**- Street :** `{data['street_address']}`\n"
f"**- Full Name :** `{data['person_name']}`\n"
f"**- City/Town/Village :** `{data['city']}`\n"
f"**- Gender :** `{data['gender']}`\n"
f"**- Postal Code :** `{data['postal_code']}`\n"
f"**- Phone Number :** `{data['phone_number']}`\n"
f"**- Country :** `{data['country']}`\n"
f"**━━━━━━━━━━━━━**\n"
f"**Click Below Button For Code 👇**",
parse_mode=ParseMode.MARKDOWN,
reply_markup=keyboard
)
LOGGER.info(f"Sent fake address for {country_code} in chat {message.chat.id}")
except ValueError as e:
LOGGER.error(f"Fake address error for country '{country_code}': {e}")
await generating_message.edit_text("**❌ Sorry, Fake Address Generator Failed**", parse_mode=ParseMode.MARKDOWN)
except Exception as e:
LOGGER.error(f"Fake address error for country '{country_code}': {e}")
await generating_message.edit_text("**❌ Sorry, Fake Address Generator Failed**", parse_mode=ParseMode.MARKDOWN)
@app.on_message(filters.command("countries", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))
async def countries_handler(client: Client, message: Message):
chat_id = message.chat.id
page_data[chat_id] = page_data.get(chat_id, 0)
countries = fake.countries()
total_pages = (len(countries) + 9) // 10
if not countries or total_pages == 0:
await client.send_message(message.chat.id, "No countries available.")
return
await send_countries_page(client, chat_id, 0, page_data[chat_id]) # Use 0 for initial message_id
async def send_countries_page(client: Client, chat_id: int, message_id: int, page: int):
countries = fake.countries()
total_pages = (len(countries) + 9) // 10
start_idx = page * 10
end_idx = min(start_idx + 10, len(countries))
current_countries = countries[start_idx:end_idx]
response = "**Available Countries (Page {}/{}):**\n\n".format(page + 1, total_pages)
for i, country in enumerate(current_countries, start=start_idx + 1):
flag = get_flag(country['country_code'])
response += f"**{i}. {country['country_name']}**\n"
response += f" - Code: {country['country_code']}\n"
response += f" - Flag: {flag}\n\n"
markup = InlineKeyboardMarkup(inline_keyboard=[])
row = []
if page > 0:
row.append(InlineKeyboardButton("Previous", callback_data=f"prev:{page}:{chat_id}"))
if page < total_pages - 1:
row.append(InlineKeyboardButton("Next", callback_data=f"next:{page}:{chat_id}"))
if row:
markup.inline_keyboard.append(row)
if message_id == 0:
sent_msg = await client.send_message(chat_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)
return # No edit for initial send
await client.edit_message_text(chat_id, message_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)
@app.on_callback_query(filters.regex(r"^(prev|next):(\d+):(\d+)$"))
async def pagination_handler(client: Client, callback_query):
action, page_str, chat_id_str = callback_query.data.split(':')
page = int(page_str)
chat_id = int(chat_id_str)
total_pages = (len(fake.countries()) + 9) // 10
if action == "prev" and page > 0:
page -= 1
elif action == "next" and page < total_pages - 1:
page += 1
await send_countries_page(client, chat_id, callback_query.message.id, page)
await callback_query.answer()
if __name__ == "__main__":
app.run()
```
Raw data
{
"_id": null,
"home_page": null,
"name": "smartfaker",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "ISmartCoder <abrixdhackz.info.me@gmail.com>",
"keywords": "address-generator, fake-data, faker, mtproto, python-library, telegram-bot",
"author": null,
"author_email": "ISmartCoder <abrixdhackz.info.me@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/49/cb/e033e9012ab2416de956116c846e33115db05f98d79d00998b7fad4379be/smartfaker-3.20.0.tar.gz",
"platform": null,
"description": "## SmartFaker\n\nA powerful Asynchronous Python library for generating fake addresses, supporting up to 181 countries. Ideal for bots, MTProto API frameworks, and Python scripts.\n\n### Installation\n```bash\npip install smartfaker\n```\n\n### Usage\n\n#### Basic Asyncio Example\n```python\nimport asyncio\nfrom smartfaker import Faker\n\nfake = Faker()\n\nasync def main():\n print(\"Enter country code (e.g., BD):\")\n country_code = input().strip().upper()\n if not country_code:\n print(\"Country code is required.\")\n return\n\n print(\"Enter amount (default 1):\")\n amount_input = input().strip()\n amount = 1 if not amount_input else int(amount_input)\n\n try:\n addresses = await fake.address(country_code, amount)\n if amount == 1:\n print(addresses)\n else:\n for addr in addresses:\n print(addr)\n except ValueError as e:\n print(f\"Error: {e}\")\n\nif __name__ == \"__main__\":\n asyncio.run(main())\n\t\n```\n\n\t\n#### Basic Pyrofork Example\t\n\n```python\nimport asyncio\nimport logging\nfrom pyrogram import Client, filters\nfrom pyrogram.types import Message, InlineKeyboardButton, InlineKeyboardMarkup\nfrom pyrogram.enums import ParseMode\nfrom smartfaker import Faker\nimport pycountry\n\nLOGGER = logging.getLogger(__name__)\nLOGGER.setLevel(logging.INFO)\n\nCOMMAND_PREFIX = [\"/\", \",\", \".\", \"!\", \"#\"]\n\napp = Client(\n \"my_bot\",\n api_id=YOUR_API_ID,\n api_hash=\"YOUR_API_HASH\",\n bot_token=\"YOUR_BOT_TOKEN\"\n)\n\nfake = Faker()\n\npage_data = {}\n\ndef get_flag(country_code):\n try:\n return ''.join(chr(0x1F1E6 + ord(c) - ord('A')) for c in country_code.upper())\n except Exception:\n return \"\ud83c\udfda\"\n\n@app.on_message(filters.command(\"start\", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))\nasync def start_handler(client: Client, message: Message):\n welcome_text = (\n \"**Welcome to SmartFaker Bot! \ud83d\ude80**\\n\"\n \"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n \"Generate fake addresses easily!\\n\"\n \"Use **/fake <code>** for an address (e.g., /fake BD).\\n\"\n \"Use **/countries** to list available countries.\\n\"\n \"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n \"Powered by @ISmartCoder | Updates: t.me/TheSmartDev\"\n )\n await client.send_message(message.chat.id, welcome_text, parse_mode=ParseMode.MARKDOWN)\n\n@app.on_message(filters.command([\"fake\", \"rnd\"], prefixes=COMMAND_PREFIX) & (filters.private | filters.group))\nasync def fake_handler(client: Client, message: Message):\n if len(message.command) <= 1:\n await client.send_message(message.chat.id, \"**\u274c Please Provide A Country Code**\", parse_mode=ParseMode.MARKDOWN)\n LOGGER.warning(f\"Invalid command format: {message.text}\")\n return\n \n country_code = message.command[1].upper()\n if country_code == \"UK\":\n country_code = \"GB\"\n \n generating_message = await client.send_message(message.chat.id, \"**Generating Fake Address...**\", parse_mode=ParseMode.MARKDOWN)\n \n try:\n data = await fake.address(country_code)\n flag_emoji = data['country_flag']\n keyboard = InlineKeyboardMarkup(inline_keyboard=[\n [InlineKeyboardButton(\"Copy Postal Code\", callback_data=f\"copy:{data['postal_code']}\")]\n ])\n await generating_message.edit_text(\n f\"**Address for {data['country']} {flag_emoji}**\\n\"\n f\"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n f\"**- Street :** `{data['street_address']}`\\n\"\n f\"**- Full Name :** `{data['person_name']}`\\n\"\n f\"**- City/Town/Village :** `{data['city']}`\\n\"\n f\"**- Gender :** `{data['gender']}`\\n\"\n f\"**- Postal Code :** `{data['postal_code']}`\\n\"\n f\"**- Phone Number :** `{data['phone_number']}`\\n\"\n f\"**- Country :** `{data['country']}`\\n\"\n f\"**\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501**\\n\"\n f\"**Click Below Button For Code \ud83d\udc47**\",\n parse_mode=ParseMode.MARKDOWN,\n reply_markup=keyboard\n )\n LOGGER.info(f\"Sent fake address for {country_code} in chat {message.chat.id}\")\n except ValueError as e:\n LOGGER.error(f\"Fake address error for country '{country_code}': {e}\")\n await generating_message.edit_text(\"**\u274c Sorry, Fake Address Generator Failed**\", parse_mode=ParseMode.MARKDOWN)\n except Exception as e:\n LOGGER.error(f\"Fake address error for country '{country_code}': {e}\")\n await generating_message.edit_text(\"**\u274c Sorry, Fake Address Generator Failed**\", parse_mode=ParseMode.MARKDOWN)\n\n@app.on_message(filters.command(\"countries\", prefixes=COMMAND_PREFIX) & (filters.private | filters.group))\nasync def countries_handler(client: Client, message: Message):\n chat_id = message.chat.id\n page_data[chat_id] = page_data.get(chat_id, 0)\n \n countries = fake.countries()\n total_pages = (len(countries) + 9) // 10\n if not countries or total_pages == 0:\n await client.send_message(message.chat.id, \"No countries available.\")\n return\n \n await send_countries_page(client, chat_id, 0, page_data[chat_id]) # Use 0 for initial message_id\n\nasync def send_countries_page(client: Client, chat_id: int, message_id: int, page: int):\n countries = fake.countries()\n total_pages = (len(countries) + 9) // 10\n start_idx = page * 10\n end_idx = min(start_idx + 10, len(countries))\n current_countries = countries[start_idx:end_idx]\n \n response = \"**Available Countries (Page {}/{}):**\\n\\n\".format(page + 1, total_pages)\n for i, country in enumerate(current_countries, start=start_idx + 1):\n flag = get_flag(country['country_code'])\n response += f\"**{i}. {country['country_name']}**\\n\"\n response += f\" - Code: {country['country_code']}\\n\"\n response += f\" - Flag: {flag}\\n\\n\"\n \n markup = InlineKeyboardMarkup(inline_keyboard=[])\n row = []\n if page > 0:\n row.append(InlineKeyboardButton(\"Previous\", callback_data=f\"prev:{page}:{chat_id}\"))\n if page < total_pages - 1:\n row.append(InlineKeyboardButton(\"Next\", callback_data=f\"next:{page}:{chat_id}\"))\n if row:\n markup.inline_keyboard.append(row)\n \n if message_id == 0:\n sent_msg = await client.send_message(chat_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)\n return # No edit for initial send\n \n await client.edit_message_text(chat_id, message_id, response, parse_mode=ParseMode.MARKDOWN, reply_markup=markup)\n\n@app.on_callback_query(filters.regex(r\"^(prev|next):(\\d+):(\\d+)$\"))\nasync def pagination_handler(client: Client, callback_query):\n action, page_str, chat_id_str = callback_query.data.split(':')\n page = int(page_str)\n chat_id = int(chat_id_str)\n \n total_pages = (len(fake.countries()) + 9) // 10\n if action == \"prev\" and page > 0:\n page -= 1\n elif action == \"next\" and page < total_pages - 1:\n page += 1\n \n await send_countries_page(client, chat_id, callback_query.message.id, page)\n await callback_query.answer()\n\nif __name__ == \"__main__\":\n app.run()\n\t\n```\n\t",
"bugtrack_url": null,
"license": "MIT",
"summary": "A powerful Asyncrhonous Python library for generating fake addresses, supporting bots, MTProto API frameworks, and Python scripts",
"version": "3.20.0",
"project_urls": {
"Changelog": "https://github.com/abirxdhack/TheSmartFaker/releases",
"Documentation": "https://abirxdhack.github.io/SmartFakerDocs",
"Homepage": "https://github.com/abirxdhack/TheSmartFaker",
"Source": "https://github.com/abirxdhack/TheSmartFaker",
"Tracker": "https://github.com/abirxdhack/TheSmartFaker/issues"
},
"split_keywords": [
"address-generator",
" fake-data",
" faker",
" mtproto",
" python-library",
" telegram-bot"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "62027ef9af8f40aeef9f8eefc1b153edb7516a0581873553dfc18b730989aafa",
"md5": "8bca20a156b34c9f536bdc7b767d7bba",
"sha256": "cb0ee384125ed228a88ae688d67606a6807d7d4c4b02443c33764dd119b7edbe"
},
"downloads": -1,
"filename": "smartfaker-3.20.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "8bca20a156b34c9f536bdc7b767d7bba",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 228052,
"upload_time": "2025-08-13T04:29:37",
"upload_time_iso_8601": "2025-08-13T04:29:37.024771Z",
"url": "https://files.pythonhosted.org/packages/62/02/7ef9af8f40aeef9f8eefc1b153edb7516a0581873553dfc18b730989aafa/smartfaker-3.20.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "49cbe033e9012ab2416de956116c846e33115db05f98d79d00998b7fad4379be",
"md5": "ce0e6afed8d1316dd495bfbeb5c0de33",
"sha256": "c80755332048c3cce6033314e7cc7b76e030014e4405428915e21d0a7ef0cb26"
},
"downloads": -1,
"filename": "smartfaker-3.20.0.tar.gz",
"has_sig": false,
"md5_digest": "ce0e6afed8d1316dd495bfbeb5c0de33",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 161337,
"upload_time": "2025-08-13T04:29:40",
"upload_time_iso_8601": "2025-08-13T04:29:40.132675Z",
"url": "https://files.pythonhosted.org/packages/49/cb/e033e9012ab2416de956116c846e33115db05f98d79d00998b7fad4379be/smartfaker-3.20.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-13 04:29:40",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "abirxdhack",
"github_project": "TheSmartFaker",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "pycountry",
"specs": []
}
],
"lcname": "smartfaker"
}