متفرق پائتھون کے ذریعے واٹس ایپ ویب کو آٹو میٹ کرنا۔

پچھلے دنوں مجھے محسوس ہو کہ میرے کاروبار (پرنٹنگ کا کاروبار ہے میرا) میں سست روی ہے۔ چنانچہ کیوں ناں اپنے کاروبار کی تشہیر کی جائے مگر مفت میں :)۔ سو یہ سوچ کر میں نے اپنی پراڈکٹس کو واٹس ایپ گروپ میں بھیجنا شروع کردیا۔ مگر یہ کیا؟ میں تو صرف چند گروپس میں ہی ایڈ تھا۔ جس پر پوسٹنگ کا کچھ خاص ردعمل بھی نہیں آیا۔

پھر دماغ لڑایا تو ذہن میں ایک بات آئی، کیوں نہ اپنے کسٹمرز کو ہی واٹس ایپ پر میسج بھیجا جائے؟ میں اپنے کسٹمرز کا ریکارڈ رکھتا ہوں، میرے پاس تقریبا 1200 ایسے نمبرز موجود ہیں جو کہ واٹس ایپ پر متحرک ہیں۔ مگرانھیں پیغام بھیجے کیسے؟ واٹس ایپ نے کچھ عرصہ قبل انڈیا میں واٹس ایپ کے ذریعے افواہیں پھیلنے کی بنا پر میسج آگے بھیجنے کی حد 256 سے کم کرکے صرف 5 کردی تھی۔ اگر میں پانچ پانچ کرکے میسج بھیجتا تو اس میں اچھا خاصا وقت لگ جاتا۔ اور پیغام بھیجتے وقت، جن کو پیغام نہیں بھیجا ہے، انھیں ڈھونڈنا اور منتخب کرنا، اچھا خاصا مغز ماری کا کام تھا۔

چنانچہ کافی سوچ بچار کے بعد میرے ذہن میں یہ خیال آیا کہ کیوں نہ پائتھون کے ذریعے سے واٹس ایپ ویب کو خودکار کردیا جائے۔ اور میں نے اس خیال کو عملی جامہ پہنانے کا فیصلہ کیا۔ دودن کی محنت کے بعد میں میرا پروگرام اس قابل تھا کہ وہ واٹس ایپ ویب پر نمبر کو ڈھونڈھے، انھیں منتخب کرے اور ایک پرسنالائز میسج لکھے اور بھیج دے۔ ساتھ میں پراڈکٹ کی تصاویر بھی بھیجیے۔

اس طرح میرا کافی سارا وقت بھی بچ گیا، اور کچھ دوسری خصوصیات کے حامل پیغام بھی ارصال ہونے لیے۔ مطلب پرسنلائز میسجز، ملٹی میڈیا میسج وغیرہ۔۔۔۔

تو آپ میں سے کوئی اس اسکرپٹ کو بہتر بنانے میں دلچسپی رکھتا ہے؟ محب علوی بھائی، اگر آپ تعاون کا ارادہ بنائے تو میں بے حد مشکور ہونگا۔


کوڈ:
import os, pyautogui, openpyxl, pyperclip, time, winsound, sys

# Ask user for directory that contain referance images

#work_dir = str(input('Absolute path of directory that contain images: '))
work_dir = r'C:\Users\Tossot\Desktop\whatsapp_message_forwarder'
os.chdir(work_dir)

# Check for required image files

msg_forward_icon = 'msg_forward_icon.png'
search_box = 'search_box.png'
search_box_back_icon = 'search_box_back_icon.png'
contact_selection_unselect = 'contact_selection_unselect.png'
contact_selection_selected = 'contact_selection_selected.png'
send_button = 'send_button.png'
msg_box = 'msg_box.png'
check_if_contact_exist = 'check_if_contact_exist.png'

if not os.path.isfile(msg_forward_icon):
    print('Image "' + msg_forward_icon + '" missing')
    
if not os.path.isfile(search_box):
    print('Image "' + search_box + '" missing')

if not os.path.isfile(search_box_back_icon):
    print('Image "' + search_box_back_icon + '" missing')

if not os.path.isfile(contact_selection_unselect):
    print('Image "' + contact_selection_unselect + '" missing')

if not os.path.isfile(contact_selection_selected):
    print('Image "' + contact_selection_selected + '" missing')

if not os.path.isfile(send_button):
    print('Image "' + send_button + '" missing')

if not os.path.isfile(msg_box):
    print('Image "' + msg_box + '" missing')

if not os.path.isfile(check_if_contact_exist):
    print('Image "' + check_if_contact_exist + '" missing')

def click_on_msg_forward_icon():
    msg_forward_icon_trace = pyautogui.locateOnScreen(msg_forward_icon, confidence=0.5)
    if msg_forward_icon_trace == None:
        # Try to close opened message forward dialog
        pyautogui.press('Esc', presses=2)
        time.sleep(1)
        msg_forward_icon_trace = pyautogui.locateOnScreen(msg_forward_icon, confidence=0.5)

        if msg_forward_icon_trace == None:
            #Search for source message, then forward it.
            pyautogui.click(pyautogui.locateOnScreen('main_window_search_box.png', confidence=0.8))
            pyautogui.write('+92 21 32290223')
            time.sleep(1)
            pyautogui.click(pyautogui.locateOnScreen('source_message_sender.png', confidence=0.8))
            time.sleep(0.5)
            msg_forward_icon_trace = pyautogui.locateOnScreen(msg_forward_icon, confidence=0.5)
            


    pyautogui.click(msg_forward_icon_trace)
            
def click_on_search_box(c):
    step_two = pyautogui.locateOnScreen(search_box, confidence=c)
    pyautogui.click(step_two)

def click_on_search_box_back_icon(c):
    step_three = pyautogui.locateOnScreen(search_box_back_icon, confidence=c)
    pyautogui.click(step_three)

def click_on_contact_selection_unselect():
    not_select = pyautogui.locateOnScreen(contact_selection_unselect, confidence=0.9)
    pyautogui.click(not_select)

def check_if_contact_selected(c):
    selected = pyautogui.locateOnScreen(contact_selection_selected, confidence=c)
    return selected == None

def click_on_send_button(c):
    send_msg = pyautogui.locateOnScreen(send_button, confidence=c)
    pyautogui.click(send_msg, interval=0.5)

def click_on_msg_box(c):
    click_to_write = pyautogui.locateOnScreen(msg_box, confidence=c)
    pyautogui.click(click_to_write)

# TODO:
# Add feature that check if message already sent
# by checking excel cell style.

def check_if_message_already_sent(cell_i):
    sheet.cell(cell_i, 1).style = 'Good'
    return True

def open_chrome():
    pyautogui.click(pyautogui.locateOnScreen('chrome_icon.png', confidence=0.9))


# Open excel list of contacts
wb = openpyxl.load_workbook('contact_list.xlsx')
sheet = wb.worksheets[0]

i = sheet.max_row

open_chrome()

while i != 1:
    
    click_on_msg_forward_icon()
    time.sleep(1)

    pyperclip.copy(sheet.cell(i, 4).value)
    pyautogui.write(pyperclip.paste())
    
    #Compose Message:

    business_name = sheet.cell(i, 1).value
    if sheet.cell(i, 1).value != None:
        business_name = '*' + sheet.cell(i, 1).value + '*'
        business_name = business_name.replace('\n', '')
    else:
        business_name = ''
        
    product_url = 'https://bharosa.solutions/product/self-destructive-egg-shell-warranty-stickers-25mm-x-8mm/'
    unsub_msg = '_Reply UNSUB to opt-out from promotional msgs. UNSUB ALL to opt-out from all types of msgs_'

    message = 'Hi ' + business_name + ' \nComputers, Laptops, Mobiles aur Electronics kay liyeh High Quality Tamper Evident, *Warranty VOID Sticker* Labels banwaiyeh. Multicolor Digital Priting, Fast Service, Competitive Price. \n Order Online:' + product_url



    #Compose Message: End
    click_on_contact_selection_unselect()
    time.sleep(1)
    
    click_on_send_button(0.8)
    time.sleep(2)

    pyautogui.write(message, interval=0.01)
    pyautogui.press('Enter')
    time.sleep(0.2)
    
    pyautogui.write(unsub_msg, interval=0.01)
    pyautogui.press('Enter')
    time.sleep(1)
    
    sheet.cell(i, 4).style = 'Good'
    i = i - 1

    wb.save('contact_list.xlsx')   


# TODO:
# Add feature that multiple forward icons found,
# Click on forward button from 'First Message Forwarded'
 

محمداحمد

لائبریرین
یہ کوڈ موبائل پر چلتا ہے یا ونڈوز پر۔

اور یہ کوڈ کس طرح کام کرتا ہے۔؟ کچھ تفصیل اگر آپ بتا سکیں۔
 
یہ کوڈ موبائل پر چلتا ہے یا ونڈوز پر۔

اور یہ کوڈ کس طرح کام کرتا ہے۔؟ کچھ تفصیل اگر آپ بتا سکیں۔

یہ کوڈ وینڈوز کے لیے ہے، اور بنیادی طور پر یہ پائی آٹو گوئی ماڈیول کے ذریعے کی بورڈ، ماؤس کو کنٹرول کررہا ہے۔ اور اسکرین پر موجود چیزوں کو دی گئی تصاویر کے نمونوں سے میچ کرکے ان پر کل کرتا ہے۔

مثال کے طور پر یہ کوڈ:
کوڈ:
def click_on_send_button(c):
    send_msg = pyautogui.locateOnScreen(send_button, confidence=c)
    pyautogui.click(send_msg, interval=0.5)
یہ کوڈ دراصل اس
send-button.png
تصویر کو اسکرین پر ڈھونڈ پر اس پر کلک کرے گا۔

امید ہے کہ آپ کو کچھ کچھ سمجھ آرہا ہوگا کہ یہ پروگرام کیسے کام کرتا ہے۔
 
دیکھنے میں تو ونڈوز پر چلنے والا پروگرام لگ رہا ہے لیکن کیسے چلے گا یہ تو صاحب لڑی ہی بتا سکتے ہیں

اس کو چلانے کے لیے اسے تصویری نمونوں کے پتے دینے پڑیں گے۔ پھر یہ چلے گا۔ جیسا کہ آپ مندرجہ ذیل تصویر میں دیکھ سکتے ہیں یہ میں نے ورک ڈائریکٹری میں تصاویر کے نمونے رکھے ہوئے ہیں:
image.png
 
مشکل الفاظ تو نہیں ہے لیکن سمجھ نہیں آیا۔ مجھے سمجھ نا آنے کی وجہ تو یہ ہو سکتی ہے کہ کمپیوٹر چلا لیتے ہیں پروگرامنگ کے بارے میں کچھ نہیں جانتے
 
مشکل الفاظ تو نہیں ہے لیکن سمجھ نہیں آیا۔ مجھے سمجھ نا آنے کی وجہ تو یہ ہو سکتی ہے کہ کمپیوٹر چلا لیتے ہیں پروگرامنگ کے بارے میں کچھ نہیں جانتے

بجا فرمایا آپ نے۔ عام لوگ شاید جی یو آئی کے استعمال کو ترجیح دیےہیں۔ پہلے میرا بھی یہی حال تھا۔ مگر جب سی ایل آئی کی طاقت کا مجھے اندازہ ہوا تو میں اب سی ایل آئی کو ہی ترجیح دیتا ہوں۔
 

محمد سعد

محفلین
اچھی کاوش ہے۔ کچھ سوالات:
ونڈوز پر پائتھن انسٹالیشن کے لیے آپ کیا طریقہ تجویز کرتے ہوتے ہیں؟
پائتھن 2 استعمال کر رہے ہیں یا پائتھن 3؟
اس پروگرام کو pyautogui کے کس ورژن کے ساتھ چلا رہے ہیں؟
ایکسل شیٹ کی ساخت اور فارمیٹنگ کیسی ہو گی؟
یہاں آپ کو openpyxl اور pyautogui کے بیچ pyperclip کو لانے کی ضرورت کیوں محسوس ہوئی؟
جب کوئی انسبسکرائیب کرے تو اس کو پراسیس کرنے کا آپ کا طریقہ کیا ہے؟
ساتھ میں پراڈکٹ کی تصاویر بھی بھیجیے۔
پراڈکٹ کی تصویر بھیجنا کوڈ کے کس حصے میں ہینڈل کر رہے ہیں؟
 

محمد سعد

محفلین
اور ہاں۔ pyautogui کے علاوہ کس کس لائبریری کو دیکھا تھا اس مقصد کے لیے؟ کن وجوہات کی بنا پر ان کو چھوڑ کر اس کا انتخاب کیا؟
 

محمداحمد

لائبریرین
بجا فرمایا آپ نے۔ عام لوگ شاید جی یو آئی کے استعمال کو ترجیح دیےہیں۔ پہلے میرا بھی یہی حال تھا۔ مگر جب سی ایل آئی کی طاقت کا مجھے اندازہ ہوا تو میں اب سی ایل آئی کو ہی ترجیح دیتا ہوں۔

حیرت ہے۔ ہمیں تو سی ایل آئی سے صرف یہی پتہ چلتا تھا کہ کال کرنے والا کون ہے اور یہ کہ فون اُٹھانا ہے یا سوتے بن جائیں۔ :)
 

سید رافع

محفلین
ایسے کاموں کے لیے سلینیم بہتر نہیں۔ بلاوجہ اتنا کوڈ لکھنا پڑا۔ Selenium (software) - Wikipedia

ویسے خالص پروگرامنگ سے متعلق جوابات حاصل کرنے کے لیے Stack Overflow - Where Developers Learn, Share, & Build Careers پر سوال اگر آپ پوسٹ کرتے تو منٹوں میں جواب ملتا۔

یہاں اردو محفل پر اس کے مقصد کے لحاظ سے بحر عروض قافیہ ردیف ادب و شعر سے متعلق جید علماء موجود ہیں۔ :)
 
آخری تدوین:
یہاں آپ کو openpyxl اور pyautogui کے بیچ pyperclip کو لانے کی ضرورت کیوں محسوس ہوئی؟

ایکسل سے ڈیٹا (موبائل نمبر، نام وغیرہ) کو کلپ بورڈ پر کاپی کرنے کے لیے، بناء ایکسل کھولے۔ پائتھن میں کسی ٹیکس کو کلپ بورڈ پر کاپی کرنے کے لیے برائے راست (بلٹ ان) کوئی طریقہ نہیں ہے (میری محدود معلومات کے مطابق)۔
 
جب کوئی انسبسکرائیب کرے تو اس کو پراسیس کرنے کا آپ کا طریقہ کیا ہے؟

اس نمبر کو میں مینوئلی جا کر اپنی ایکسل میں بنی ہوئی مارکیٹنگ لسٹ سے ڈیلیٹ کردیتا ہوں تاکہ انھیں دوبارہ کوئی اور میسج ناں جائے۔ پروگرام میں کوئی خودکار طریقہ نہیں بنایا ہے۔
 
پراڈکٹ کی تصویر بھیجنا کوڈ کے کس حصے میں ہینڈل کر رہے ہیں؟

کوڈ:
def click_on_msg_forward_icon():
    msg_forward_icon_trace = pyautogui.locateOnScreen(msg_forward_icon, confidence=0.5)
    if msg_forward_icon_trace == None:
        # Try to close opened message forward dialog
        pyautogui.press('Esc', presses=2)
        time.sleep(1)
        msg_forward_icon_trace = pyautogui.locateOnScreen(msg_forward_icon, confidence=0.5)

        if msg_forward_icon_trace == None:
            #Search for source message, then forward it.
            pyautogui.click(pyautogui.locateOnScreen('main_window_search_box.png', confidence=0.8))
            pyautogui.write('+92 345 0000000')
            time.sleep(1)
            pyautogui.click(pyautogui.locateOnScreen('source_message_sender.png', confidence=0.8))
            time.sleep(0.5)
            msg_forward_icon_trace = pyautogui.locateOnScreen(msg_forward_icon, confidence=0.5)
            


    pyautogui.click(msg_forward_icon_trace)

دراصل اس میں پہلے مینوئلی آپ کو ایک تصویر (یا کوئی بھی ملٹی میڈیا میسج) کسی کو بھیجنا پڑتا ہے۔ پھر بار بار اس ہی میسج کو فورورڈ کیا جا رہا ہے۔ یہ طریقہ وقت بجانےکے لیے کیا ہے۔ ورنہ ہم تصویر کو کلپ بورڈ پر کاپی کرکے واٹس ایپ ویب کے جی یو آئی پر پیسٹ بھی کر سکتے ہیں۔ مگر اس سے ایک تو اپلوڈ ہونے میں وقت لگتا ہے، دوسرا ہمارا انٹرنیٹ ڈیٹا (اگر کسی کا محدود ہو) بھی زیادہ استعمال ہوتا ہے۔

کوڈ کو دیکھ کر شاید آپ کو اندازہ ہوجائے کہ میسج کس طرح میں فارورڈ کررہا ہو۔ اگر نہیں سمجھ پا رہے تو میں وضاحت کر سکتا ہوں۔

+923450000000 یہ نمبر دراصل میں نے اپنے حقیقی نمبر سے تبدیل کیا ہے(اپنی پرائیوسی کی بنا پر)۔
 
Top