PDA

View Full Version : حرفه ای: ارسال پیام با وایبر



mjdeveloper
دوشنبه 21 اردیبهشت 1394, 13:21 عصر
سلام خدمت دوستان بزرگوار و اساتید محترم

چندی است که دوستان در بخش های مختلف این وب سایت و تاپیکهای گوناگون و وب درباره ارسال پیام با وایبر سوالاتی رو مطرح کردند.
بنده با اجازه اساتید محترم این تاپیک رو ساختم تا نمونه کدی رو که برای ارسال پیام با وایبر نیاز دارن رو بذارم. البته شاید این یکی از راهکار ها باشه

البته این کد خیلی خیلی داغه تازه از تنور در اومده و نیاز به همکاری شما دوستان داره تا ارتقا داده بشه. به شرطی که برای مقاصد تبلیغاتی و ارسال انبوه استفاده نشه!

بنده خودم برای مصرف آموزشگاهی ازش می خوام استفاده کنم و قصد ارسال فله ای هم ندارم.
ارسال فله ای کار خیلی بدیه. بازخورد معکوس داره.

131112

در این کد از Viber Desktop 5.0.1 برای ارسال استفاده میشه.

procedure TFrmMain.btnOpenViberClick(Sender: TObject);var
ProcessHandle : THandle;
filename : String;
ret : integer;
begin
filename := Edit3.Text;
ret := ShellExecute(ProcessHandle,'open',PChar(filename), '','',SW_NORMAL);
if ret = 2 then
begin
ShowMessage('Viber 5.0.1 not installed!');
end;
end;

در تیکه کد بالا وایبر اجرا خواهد شد در صورت نصب بودن البته

در تیکه کد پایین به علت عدم Unicode Support بودن دلفی برای کپی شماره و متن پیام به صورت فارسی در Clipboard ازش استفاده کردم
procedure TFrmMain.SetClipboardText(const Text: WideString);var
Count: Integer;
Handle: HGLOBAL;
Ptr: Pointer;
begin
Count := (Length(Text)+1)*SizeOf(WideChar);
Handle := GlobalAlloc(GMEM_MOVEABLE, Count);
Try
Win32Check(Handle<>0);
Ptr := GlobalLock(Handle);
Win32Check(Assigned(Ptr));
Move(PWideChar(Text)^, Ptr^, Count);
GlobalUnlock(Handle);
Clipboard.SetAsHandle(CF_UNICODETEXT, Handle);
Except
GlobalFree(Handle);
raise;
End;
end;

این هم کد دکمه ارسال

procedure TFrmMain.btnSendMsgClick(Sender: TObject);var
ProcessHandle : THandle;
PosX, PosY : Integer;
Pt: TPoint;
Pl : TWindowPlacement;
R: TRect;
msg : WideString;
begin
PosX := StrToInt(Edit1.Text);
PosY := StrToInt(Edit2.Text);
ProcessHandle:= FindWindow('Qt5QWindowIcon', nil);
if ProcessHandle > 0 then
try
Clipboard.AsText := edtNumber.Text;
BringWindowToTop(ProcessHandle);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0),0,0) ;
Sleep(500);
SendMessage(ProcessHandle, WM_KEYDOWN, Ord('D'), 0);
SendMessage(ProcessHandle, WM_KEYUP, Ord('D'), 0);
Sleep(500);
SendMessage(ProcessHandle, WM_KEYDOWN, 8, 0);
SendMessage(ProcessHandle, WM_KEYUP, 8, 0);
Sleep(500);
SendMessage(ProcessHandle, WM_KEYDOWN, Ord('V'), 0);
SendMessage(ProcessHandle, WM_KEYUP, Ord('V'), 0);
sleep(500);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0) ,KEYEVENTF_KEYUP,0);
sleep(500);
Pl.Length := SizeOf(TWindowPlacement);
GetWindowPlacement(ProcessHandle, @Pl);
R := Pl.rcNormalPosition;
PosX := Round(((r.TopLeft.X + StrToInt(edit1.Text)) * 65535) / Screen.Width);
PosY := Round(((r.TopLeft.Y + StrToInt(edit2.Text)) * 65535) / Screen.Height);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTDOWN,
PosX, PosY, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTUP,
PosX, PosY, 0, 0);
sleep(1000);
msg := edtMessage.Text;
SetClipboardText(edtMessage.Text);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0),0,0) ;
Sleep(500);
SendMessage(ProcessHandle, WM_KEYDOWN, Ord('V'), 0);
SendMessage(ProcessHandle, WM_KEYUP, Ord('V'), 0);
sleep(500);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0) ,KEYEVENTF_KEYUP,0);
sleep(500);
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0) ,0,0);
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0) ,KEYEVENTF_KEYUP,0);
finally
end
else
ShowMessage('Viber is not Running!');
end;

در بخش های بعدی به تفسیر کد می پردازیم. البته کد کاملا گویاست و جسارت خدمت اساتید نباشه
بررسی روند کار:
ابتدا وایبر باز میشه
var ProcessHandle : THandle;
filename : String;
ret : integer;
begin
filename := Edit3.Text;
ret := ShellExecute(ProcessHandle,'open',PChar(filename), '','',SW_NORMAL);
if ret = 2 then
begin
ShowMessage('Viber 5.0.1 not installed!');
end;
end;

حالا پنجره وایبر رو هندل می کنیم
ProcessHandle:= FindWindow('Qt5QWindowIcon', nil); if ProcessHandle > 0 then
try
Clipboard.AsText := edtNumber.Text;


با فرستادن کلید ترکیبی Ctrl+D به وایبر Dialer وایبر باز میشه
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0),0,0) ; Sleep(500);
SendMessage(ProcessHandle, WM_KEYDOWN, Ord('D'), 0);
SendMessage(ProcessHandle, WM_KEYUP, Ord('D'), 0);
Sleep(500);

هنوز دکمه کنترل توسط برنامه ما ول نشده با فرستادن کد دکمه Back Space شماره قبلی داخل dialer پاک میشه
SendMessage(ProcessHandle, WM_KEYDOWN, 8, 0); SendMessage(ProcessHandle, WM_KEYUP, 8, 0);
Sleep(500);

سپس دکمه "V" رو جهت Paste شماره ارسال می کنیم
SendMessage(ProcessHandle, WM_KEYDOWN, Ord('V'), 0); SendMessage(ProcessHandle, WM_KEYUP, Ord('V'), 0);
sleep(500);

حالا دکمه کنترل رو برنامه ما ول می کنه
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0) ,KEYEVENTF_KEYUP,0);
sleep(500);

نکته: این Delay ها رو که با استفاده از Sleep بین کد ها می ذاریم برای اینه که بعد از هر عملیات وایبر به خودش بیاد و عملیات رو انجام داده باشه.

تیکه کد پایین مختصات وایبر رو تو صفحه نمایش میگیره تا ما بتونیم با استفاده از این مختصات موس رو روی دکمه ارسال پیام وایبر کلیک کنیم. من تو این تیکه کد کرسر موس رو هم می برم روی دکمه
Pl.Length := SizeOf(TWindowPlacement); GetWindowPlacement(ProcessHandle, @Pl);
R := Pl.rcNormalPosition;
PosX := Round(((r.TopLeft.X + StrToInt(edit1.Text)) * 65535) / Screen.Width);
PosY := Round(((r.TopLeft.Y + StrToInt(edit2.Text)) * 65535) / Screen.Height);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTDOWN,
PosX, PosY, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE or MOUSEEVENTF_LEFTUP,
PosX, PosY, 0, 0);
sleep(1000);

این تیکه کد هم پیام رو از برنامه ما کپی می کنه و با استفاده از فرستادن Ctrl+V داخل بخش پیام وایبر Paste می کنه
msg := edtMessage.Text; SetClipboardText(edtMessage.Text);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0),0,0) ;
Sleep(500);
SendMessage(ProcessHandle, WM_KEYDOWN, Ord('V'), 0);
SendMessage(ProcessHandle, WM_KEYUP, Ord('V'), 0);
sleep(500);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0) ,KEYEVENTF_KEYUP,0);
sleep(500);
این تیکه کد هم اینتر رو روی وایبر میزنه و پیام ارسال میشه

keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0) ,0,0);
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0) ,KEYEVENTF_KEYUP,0);

من برای راحتی دوستان کد برنامه رو هم میذارم.
امیدوارم بتونه گره گشای کار دوستان باشه

شماره بنده هم تو باکس تست هست همین نرم افزار است. دوستانی که استفاده می کنند خوشحال میشم شماره شما رو داشته باشم.

ارادتمند جعفری
ارسال انبوه و فله ای کار بدی است!!!!!!!

Mask
دوشنبه 21 اردیبهشت 1394, 17:33 عصر
برای کار راه بندازی بد نیست و خوبه.ممنون.
اما چند وقت پیش که داشتم تولزهای تولید شده برای وایبر رو بررسی میکردم، به یه برنامه رسیدم که خیلی جالب ،بدون استفاده از کلیدهای ترکیبی و با استفاده از مدیریت کنترلهای وایبر این عملیات رو انجام میداد.
متاصفانه چون کنترلهای وایبر هندل نداره(شاید به این خاطره که یه صفحه وب در اپلیکیشن داره کار میکنه) کار باهاش دردسر زیادی داره. اما اون برنامه از چه متدی برای دسترسی مستقیم به کنترلها استفاده کرده بود برام خیلی جالب بود.
موفق باشید.

BORHAN TEC
دوشنبه 21 اردیبهشت 1394, 17:57 عصر
برای کار راه بندازی بد نیست و خوبه.ممنون.
اما چند وقت پیش که داشتم تولزهای تولید شده برای وایبر رو بررسی میکردم، به یه برنامه رسیدم که خیلی جالب ،بدون استفاده از کلیدهای ترکیبی و با استفاده از مدیریت کنترلهای وایبر این عملیات رو انجام میداد.
متاصفانه چون کنترلهای وایبر هندل نداره(شاید به این خاطره که یه صفحه وب در اپلیکیشن داره کار میکنه) کار باهاش دردسر زیادی داره. اما اون برنامه از چه متدی برای دسترسی مستقیم به کنترلها استفاده کرده بود برام خیلی جالب بود.
موفق باشید.
با سلام،
میتونی لینکش رو بفرستی؟

mjdeveloper
دوشنبه 21 اردیبهشت 1394, 18:06 عصر
برای کار راه بندازی بد نیست و خوبه.ممنون.
اما چند وقت پیش که داشتم تولزهای تولید شده برای وایبر رو بررسی میکردم، به یه برنامه رسیدم که خیلی جالب ،بدون استفاده از کلیدهای ترکیبی و با استفاده از مدیریت کنترلهای وایبر این عملیات رو انجام میداد.
متاصفانه چون کنترلهای وایبر هندل نداره(شاید به این خاطره که یه صفحه وب در اپلیکیشن داره کار میکنه) کار باهاش دردسر زیادی داره. اما اون برنامه از چه متدی برای دسترسی مستقیم به کنترلها استفاده کرده بود برام خیلی جالب بود.
موفق باشید.

من با برنامه های زیادی روی وایبر رفتم تا چیزی از توش در بیارم با برنامه های api , spy و چند تای دیگه ولی متاسفانه چیزی دستگیرم نشد گفتم از این راه بیفتم به جونش دیگه. همینطور که می فرمایید هندل نداره متاسفانه فقط فرمش داره. خیلی ها هم فکر کنم بیشتر با جابجایی موس و کلیک این کار رو انجام دادن.

یوسف زالی
دوشنبه 21 اردیبهشت 1394, 18:44 عصر
در صورتی که browser درونی داره، شاید بشه با DOM باهاش یه کارایی کرد. از این بابت مطمئنی؟

amin1softco
دوشنبه 21 اردیبهشت 1394, 21:45 عصر
وایبردسکتاپ با qt نوشته شده و qt هم دو حالت رایج داره تا جایی که من می دونم یکی qtwidget و دیگری QML است که در نسخه 5 به نظرم از QML استفاده شده برای همین هندلی یافت نمی شه به غیر از روش معمول گرفتن مختصات و اینا روش دیگه ایی که وجود داره استفاده از وب سرویس اصلی است که خود وایبر داره باهاش کار می کنه آدرس زیر
http://wa.viber.com/viber/viber.php?function=ActivateUser
در کل اکثرا با همین روش ماوس و ارسال پیام بین پنجره ها کار می کنند

mjdeveloper
سه شنبه 22 اردیبهشت 1394, 07:34 صبح
دوست عزیز amin1softco درست می فرمایند وایبر با C++‎‎‎ و Qt framework و QML نوشته شده

بیتا حکمت
سه شنبه 22 اردیبهشت 1394, 20:17 عصر
سلام . مطلب جالبی بود ، از mjdeveloper (http://barnamenevis.org/member.php?34285-mjdeveloper) و دیگر دوستان بابت اشتراک اطلاعاتشون ممنونم . اما چیزی که ملتفت نشدم اینکه
وایبر حتما" اگر شماره ای ارسال گروهی داشته باشه بلاکش می کنه ، این شرکت ها چطوری جلوی این کارو می گیرن ؟!
و با این سورسی که در تاپیک هست ، ارسال فله ای ممکنه یا نه ؟!:لبخند:

Mask
چهارشنبه 23 اردیبهشت 1394, 00:50 صبح
با سلام،
میتونی لینکش رو بفرستی؟
شاهین جان از نت گرفتم.نمیدونم کجا ذخیرش کردم. اگه تو نت سرچ کنی 3-5 تا بیشتر نیست.

mjdeveloper
چهارشنبه 23 اردیبهشت 1394, 07:49 صبح
بعیده وایبر بتونه تشخیص بده شاید بتونه از نظر زمانی و تعداد ارسال شما پی به ارسال انبوه ببره. خدا عالمه. با این سورس هم می تونی اون کد دکمه ارسال رو و بخش ارسالش رو توی لوپ بذاری روی لیست شماره ها حرکت کنی و انبوه ارسال کنی :اشتباه::گیج::شیطان:

hrkhrkhrk
سه شنبه 20 مرداد 1394, 12:59 عصر
خب چرا برای فرستادن از اینتر استفاده نکردید و مختصات دکمه ارسال رو کرفتید

mjdeveloper
سه شنبه 21 مهر 1394, 11:00 صبح
خب چرا برای فرستادن از اینتر استفاده نکردید و مختصات دکمه ارسال رو کرفتید


این تیکه کد هم اینتر رو روی وایبر میزنه و پیام ارسال میشه




1
2

keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0) ,0,0);
keybd_event(VK_RETURN, MapVirtualKey(VK_RETURN,0) ,KEYEVENTF_KEYUP,0);

ابوالفضل عباسی
چهارشنبه 22 مهر 1394, 08:36 صبح
به نظرم تا الانش هم خوبه
ولی اگر خوب پیش بره میتونی خودت یک شبکه اجتماعی تحت کامپیوتر مثل تلگرام بسازی و به عنوان یه نرم افزار ایرانی بفروشی