28.05.2007, 06:59 | #1 |
Участник
Регистрация: 06.08.2006
Сообщений: 243
ICQ: 272727765 Репутация: 406
|
TICQClient - исправления, дополнения и прочее
В этой теме будут выкладываться исправления и дополнения к компоненту TICQClient от Кобана для Delphi.
Компонент, актуально работающий на 13.08.2010 скачать: TICQClient Пример работы с компонентом: скачать: СheatICQ Официальный хелп от coban2k скачать: TICQClientHelp.rar ============================== Оригинальный компонент (с демо): скачать Компонент с работающими прокси и кодировками скачать тут Компонент от Romen'a (с демо): - движок на ICQ - к архиве есть все необходимые модули (для WSocket'a от ICS 1.4, плюс из RxLib несколько модулей) - из компонента убрано все "лишнее" скачать Демки делались в Turbo Delphi 2006, поэтому если вы будете собирать их под Delphi 7 и ниже не забудте в насткойках проекта указать пути, иначе среда не найдет эти модули и будет ругаться на их отсутствие. 1) Project -> Options 2) Закладка Directories/Conditionals 3) -> Units output directory: Units -> Search path: ICQClient Последний раз редактировалось DjFly; 04.02.2012 в 20:23. |
29.07.2007, 00:09 | #27 |
Участник
Регистрация: 17.11.2006
Сообщений: 153
ICQ: 8070080 Репутация: 302
|
Дак собственно в чем сложность то, берешь и суешь в капабилды свою строчку :) Просто она отоброжаться нигде не будет почти. Ну там в r&q сейчас показывает капабилды так то. Вообщем вот строчка:
#$41#$73#$65#$63#$68#$6B#$61#$ 20#$20#$20#$20#$20#$20#$20#$20 #$20 // Asechka и кучка пробелов ;) Берешь ascii номер от буквы и переводишь из десятичной в 16-ую и все. |
Плюсанул yxu : |
29.07.2007, 01:50 | #28 |
Участник заблокирован
Регистрация: 22.03.2007
Сообщений: 155
ICQ: 22222208 Репутация: 27
|
Хм...странно, но как квип тогда показывает не свои клиенты...
Допустим вышел новый клиент Icq 7.0 , а в квипе хоть даже в 8000 покажет ведь нормально... Почему мы свой не можем вставить =\ Странно блин |
29.07.2007, 11:16 | #29 |
Участник
Регистрация: 17.11.2006
Сообщений: 153
ICQ: 8070080 Репутация: 302
|
Да ну, брось давай, квип, как и любой другой интернет пейджер определяет только то, что в него заложено. Просто создатели же тоже не клювом щелкают, они по возможности заранее закладывают определение версий.
|
Плюсанул yxu : |
06.08.2007, 10:25 | #30 |
Участник
Регистрация: 06.08.2007
Сообщений: 6
Репутация: 10
|
Моя модификация TICQClient
Случайно наткнулся на данный форум. Решил поделиться тем что я сделал.
Основные отличия от оригинальной версии: - md5 авторизация - отсылка/прием typing notification - download/upload аватаров - Исправлены все изменения протокола на сегодняшний день - ну и куча всего по-мелочи Взять можно с www .kozachok .net .ua/downloads/TIcqClient/ Буду рад если кому-нибудь пригодится. При использовании кода с моими изменениями ссылка на автора в шапке модуля обязательна. |
Плюсанул OkeyUA : |
06.08.2007, 19:36 | #32 |
Участник
Регистрация: 17.11.2006
Сообщений: 153
ICQ: 8070080 Репутация: 302
|
OkeyUA, спасибо, возьму пару полезностей. Написано с умом, с расстановкой, очень понравилось спасибо. Советую использовать всем.
Файлика только не хватает uses uMD5Hash ;) Вот порылся у себя нашел файлик, вроде подходит. Последний раз редактировалось yxu; 06.08.2007 в 19:42. |
Плюсанул yxu : |
09.08.2007, 18:18 | #34 |
Участник
Регистрация: 06.08.2007
Сообщений: 3
Репутация: 1
|
OkeyUA,
1 Решил проверить код на стабильность и вот: Модуль ICQClient.pas, фрагмент проблемного кода: Код:
if (Length(Msg) > 0) then begin if (MsgType = M_PLAIN) or (MsgType=147) then begin if FDoPlain then Msg := Rtf2Plain(Msg); //Convert message from RTF to plaintext when needed if Assigned(OnMessageRecv) then FOnMsg(Self, UTF8ToStr(Msg), UIN); end else if MsgType = M_URL then begin Desc := Copy(Msg, 0, Pos(#$fe, Msg) - 1); URL := Copy(Msg, Pos(#$fe, Msg) + 1, Length(Msg) - Pos(#$fe, Msg)); if Assigned(OnURLRecv) then FOnURL(Self, Desc, URL, UIN); Код:
ShortString 255 characters 2 to 256 bytes backward compatibility AnsiString ~2^31 characters 4 bytes to 2GB 8-bit (ANSI) characters, DBCS ANSI, MBCS ANSI, etc. WideString ~2^30 characters 4 bytes to 2GB Unicode characters; multi-user servers and multi-language applications Может надо заменить тип со String на другой или указать дериктиву компилятору? Или брезать лишний текст? 2 И нужно унифицировать, UIN - Word, Integer или String, будет? 3 А справки коротенькой по аватарам нету? Т.к. в коде док. нету. По протоколу из темы: 1 Планируется исправление отправки Статус сообщения и добавления установки текста ХСтатуса и сообщения ХСтатуса. |
09.08.2007, 21:44 | #35 | |
Участник
Регистрация: 17.11.2006
Сообщений: 153
ICQ: 8070080 Репутация: 302
|
Цитата:
P.S. А да, забыл добавить, там у меня сделано только jpeg аватарки грузить, для остальных расширений надо юзать соответствующие компаненты. Последний раз редактировалось yxu; 09.08.2007 в 21:48. |
|
Плюсанул yxu : |
10.08.2007, 10:44 | #36 | |||
Участник
Регистрация: 06.08.2007
Сообщений: 6
Репутация: 10
|
Цитата:
Цитата:
Нужно "правильно" переписать блок приема и отправки сообщений. Таким образом, чтобы он был минимально чувствителен к изменениям протокола... Также нужно еще много чего... Вопрос в малом - мотивация и время :) Цитата:
Прием пользовательских аватаров: Код:
... IcqClient.Avatars := True; ... В обработчике события OnOnlineInfo пишем код: if AvatarHash <> '' then begin if Contact.Avatar.Hash <> AvatarHash begin IcqClient.RequestAvatar(UIN, AvatarId, AvatarFlags, AvatarHash); Contact.Avatar.Hash := AvatarHash; Contact.Avatar.Id := AvatarId; Contact.Avatar.Flags := AvatarFlags; Contact.Save; end; end; Нужно запоминать hash полученного аватара и следующий запрос на получение слать в случае изменения хеша В обработчике события OnAvatarReceive пишем что-то типа AssignFile(f, AvatarDir(ImOwner.UIN)+UIN+AvatarExt); Rewrite(f); Write(F,AvatarData); CloseFile(F); SendBroadCastMessage(WM_AVATAR_CHANGED,0,Longint(Self)); Все, аватар пользователя у нас на локальном диске. Код:
IcqClient.UploadAvatar(OpenPictureDialog.FileName); |
|||
Плюсанул OkeyUA : |
12.08.2007, 16:15 | #37 |
Участник
Регистрация: 12.08.2007
Сообщений: 2
Репутация: 1
|
Проблема
Я пишу ICQ бота с поддержкой плагинов.
Так вот все хорошо но почему то после того как бот получает сообщение он пишет типа соединение разорвано. В чем может быть проблема? Вот код: Код:
function ComParser(msg:string):string; var i:integer; Answer:TAnswer; hdll:THandle; help,dlln,outx:string; begin help:='Справка.'; for i:=0 to form1.coms.Items.Count-1 do begin help:=help+#13+form1.coms.Items.Item[i].Caption+' : '+form1.coms.Items.Item[i].subitems.Strings[2]; // if pos(form1.coms.Items.Item[i].Caption,Msg)=1 then begin // Msg:=copy(msg,length(form1.coms.Items.Item[i].Caption)+2,Length(msg)-length(form1.coms.Items.Item[i].Caption)+1); form1.log.Lines.add(Msg); if i>0 then begin dlln:=extractfilepath(application.ExeName)+'Plugins\'+form1.coms.Items.Item[i].subitems.Strings[0]; // if FileExists(dlln) then begin hdll:= LoadLibrary(PChar(dlln)); if hdll<=0 then form1.Log.Lines.Add('ERROR: Ошибка вызова'); try @Answer:=GetProcAddress(hdll,'answer'); if not assigned(Answer) then form1.log.Lines.Add('ERROR: Ошибка процесса'); outx:=Answer(msg); finally FreeLibrary(hdll); end; // end; // end; // // if pos('!help',Msg)=1 then outx:=help; // end; end; Result:=outx; end; procedure TForm1.ICQMessageRecv(Sender: TObject; Msg, UIN: String); var s:string; begin log.Lines.add(UIN+': '+msg); s:=ComParser(msg); if Length(s)>1900 then begin SetLength(s,1900); s:=trim(s); end; ICQ.SendMessage(strtoint(uin),s); end; проверял, dll возвращает значение. уже несколько раз пробовал, как только делаю динмаическим ответ (несколько команд) так всегда вот такая ошибка. Заранее спасибо!!! |
12.08.2007, 16:34 | #38 |
Участник
Регистрация: 06.08.2006
Сообщений: 243
ICQ: 272727765 Репутация: 406
|
Во-первых, интересно посмотреть код хоть одной функции Answer из библиотеки, потому что Delphi, мягко говоря, не дает передавать в DLL значения типа String. Они туде не доходят.
Во-вторых, ICQMessageRecv смотрел под отладчиком?
__________________
Мой блог - Mac, Qt и немного Delphi. |
12.08.2007, 16:45 | #39 | |
Участник
Регистрация: 12.08.2007
Сообщений: 2
Репутация: 1
|
Ну я проверял на функции в DLL
function answer(msg:string):string;expo rt; begin Result:=Engtorus(msg); end; в принципе сколько писал со string проблем не было. Я проверял -функция нормально возвращает значение. Отладчик пока не смотрел... Добавлено через 2 часа 31 минуту Цитата:
Если можно выложи) Последний раз редактировалось Synergy; 12.08.2007 в 19:16. Причина: Добавлено сообщение |
|
12.08.2007, 22:16 | #40 |
Участник
Регистрация: 09.08.2007
Сообщений: 1
Репутация: 1
|
1) Передавать стринги в делфе с длл-ки это хороший источник ошибок, потому что оно то работает - то нет.
2) то что сейчас есть - вылаживать - стыдно (немного коряво написано, да и ещё глюк есть), а кого заинтересует в нем разбираться - могу кинуть на мыло. 3) В новом TICQClient у меня наблюдается глюк: на некоторых сообщениях приходит не то что отправил, то есть после сообщения приходит ещё какой-то мусор, а иногда вообще виснет... Ни у кого такого не наблюдалось? |
13.08.2007, 10:09 | #41 | |
Участник
Регистрация: 06.08.2007
Сообщений: 6
Репутация: 10
|
Цитата:
Код:
if Assigned(OnMessageRecv) then FOnMsg(Self, UTF8ToStr(Msg), UIN); Или дай четкий алгоритм для воспроизведения данной ошибки. |
|
13.08.2007, 19:17 | #42 |
Участник
Регистрация: 06.08.2007
Сообщений: 3
Репутация: 1
|
|
14.08.2007, 10:50 | #43 |
Участник
Регистрация: 21.11.2006
Сообщений: 47
ICQ: 232521 Репутация: 13
|
OkeyUA, я так посмотрел результаты поиска у тебя не парсятся. а так биг 10х за твой код. Обновил в своем варианте все как у тебя. Проверить пока что не могу - ну надеюсь все гут.
Выкладываю обновление |
Плюсанул Romen : |
24.08.2007, 05:33 | #44 |
Участник
Регистрация: 24.08.2007
Сообщений: 32
Репутация: 3
|
Народ, такой вопрос:
Пишу прогу с помощью TICQClient Есть 3 номера аськи: 1 -7 знак 2 и 3 9 знаки Так вот такая фишка, когда подключаюсь семизнаком через свою прогу то в QIP виден IP. Подключаю 9 знак, IP QIP не видит. Потом подключаюсь через вторую девятку, снова IP виден. Короче 7 знак и одна из моих девяток почему то светят IP, а на другой девятке IP не всетится. DisabledDirectConnetion стоит в true. Может кто знает что за косяк такой? |
25.08.2007, 04:00 | #46 |
Участник
Регистрация: 24.08.2007
Сообщений: 32
Репутация: 3
|
procedure TMainForm.StatusBoxChange(Send er: TObject);
begin case StatusBox.ItemIndex of 0:SChange(ICQ.LoggedIn,S_OFFLINE,StatusBox.ItemIndex,ShowBirth .Checked); 1:SChange(ICQ.LoggedIn,S_ONLINE ,StatusBox.ItemIndex,ShowBirth .Checked); 2:SChange(ICQ.LoggedIn,S_FFC,St atusBox.ItemIndex,ShowBirth.Ch ecked); 3:SChange(ICQ.LoggedIn,S_AWAY,S tatusBox.ItemIndex,ShowBirth.C hecked); 4:SChange(ICQ.LoggedIn,S_NA,Sta tusBox.ItemIndex,ShowBirth.Che cked); 5:SChange(ICQ.LoggedIn,S_OCCUPI ED,StatusBox.ItemIndex,ShowBir th.Checked); 6:SChange(ICQ.LoggedIn,S_DND,St atusBox.ItemIndex,ShowBirth.Ch ecked); 7:SChange(ICQ.LoggedIn,S_INVISI BLE,StatusBox.ItemIndex,ShowBi rth.Checked); else SChange(ICQ.LoggedIn,S_OFFLINE ,StatusBox.ItemIndex,ShowBirth .Checked); end; end; А вот сам процедура SChanage() : procedure SChange(logged:boolean;S:Cardi nal;img:integer;Birth:boolean= false); begin if not logged then if S <>S_OFFLINE then begin With MainForm do begin ICQ.Status:=S or SF_BIRTH; ImageList1.GetIcon(8,TrayIcon. Icon); TrayIcon.Hint:='connecting'; ICQ.Login(S,birth); end; end; if logged then begin if S = S_OFFLINE then MainForm.ICQ.LogOff else with MainForm do begin if Birth then ICQ.Status:=S or SF_BIRTH else ICQ.Status:=S; ImageList1.GetIcon(img,TrayIco n.Icon); TrayIcon.Hint:=IntToStr(ICQ.UI N) +'-' +StatusToStr(S); end; end; end; Понял где беда Вообщем вот как выглядит у меня процедура загрузки списка контактов с сервера: procedure TMainForm.ICQServerListRecv(Se nder: TObject; SrvContactList: TList); var i:word; UserInfo:TUINEntry; begin if SrvContactList.Count > 0 then for i:=0 to SrvContactList.Count-1 do begin UserInfo:=PUINEntry(SrvContact List.Items[i])^; if UserInfo.Nick = '' then UserInfo.Nick:='No Name'; CList.AddItem(UserInfo.Nick+'( '+IntToStr(UserInfo.UIN)+')',nil); SetLength(UList,CList.Items.Co unt); UList[i]:=UserInfo.UIN; end; ICQ.AddContactMulti(UList); ICQ.DestroyUINList(SrvContactL ist); end; Если закоментировать строчку ICQ.AddContactMulti то IP больше не светится. Пробовал добавлять в список с помощью функции AddContact , но при использовании этой функции на одном UIN'е происходит моментальный дисконнект, а на другом UIN'e IP все равно светится. Может поможет кто? Буду благодарен. Последний раз редактировалось SnakeV1.0; 28.08.2007 в 05:13. |
30.08.2007, 08:27 | #48 | |
Участник
Регистрация: 24.08.2007
Сообщений: 32
Репутация: 3
|
Цитата:
begin ICQClient1.SearchWhitePages('','','','',23,29,1,'','Moscow','Russia','','','','','','','','','',false); //7-ом параметре указывается пол, 1-женский, 2-мужской //в последнем параметре ставь true если хочешь искать только онлайн //контакты end; а вот обработчик: procedure TForm1.ICQClient1UserFound(Sen der: TObject; UIN, Nick, FirstName, LastName, Email: String; Status: Word; Gender, Age: Byte; SearchComplete, Authorize: Boolean); begin Memo1.Tag:=Memo1.Tag+1; Memo1.Lines.Add('---------'); Memo1.Lines.Add('UIN:'+UIN); Memo1.Lines.Add('Ник:'+Nick); Memo1.Lines.Add('Имя:'+FirstName); Memo1.Lines.Add('Фамилия:'+LastName); Memo1.Lines.Add('Е-Маил:'+Email); if gender=1 then Memo1.Lines.Add('Пол: :Жен.') else Memo1.Lines.Add('Пол: :Муж.'); if Authorize then Memo1.Lines.Add('Пользователь требует авторизации') else Memo1.Lines.Add('Пользователь не требует авторизации'); if SearchComplete then Memo1.Lines.Add(#13+'>>>>>>>>>>>Complete<<<<<<<<<< '); Memo1.Lines.Add('Найдено '+IntToStr(Memo1.Tag)+' пользователей'); end; |
|
02.09.2007, 13:20 | #49 |
Участник
Регистрация: 17.11.2006
Сообщений: 153
ICQ: 8070080 Репутация: 302
|
Собственно раз уж так интересует выкладываю все идентификаторы и капабилды клиентов.
Идентификаторы: ANDRQclientID = $FFFFFF7F; MIRANDAclientID = $FFFFFFFF; MIRANDAclientID2 = $7FFFFFFF; //new STRICQclientID = $FFFFFF8F; YSMclientID = $FFFFFFAB; ICQ2GOclientID = $FFFFFFAC; MICQclientID = $7D0001EA; MICQ2clientID = $FFFFFF42; SIMclientID = $426DE16C; ALICQclientID = $FFFFFFBE; LICQclientID = $7D000000; QIPclientID = $FBFFFFFF; JimmclientID = $FFFFFFFE; RnQclientID = $FFFFF666; Capabilities: #$97#$B1#$27#$51#$24#$3C#$43#$ 34#$AD#$22#$D6#$AB#$F7#$3F#$14 #$09, // Is Trillian #$09#$49#$13#$44#$4C#$7F#$11#$ D1#$82#$22#$44#$45#$53#$54#$00 #$00, // Is kxICQ2 #$DD#$16#$F2#$02#$84#$E6#$11#$ D4#$90#$DB#$00#$10#$4B#$9B#$4B #$7D, // MacICQ #$09#$49#$13#$49#$4C#$7F#$11#$ D1#$82#$22#$44#$45#$53#$54#$00 #$00, // LICQ #$51#$AD#$D1#$90#$72#$04#$47#$ 3D#$A1#$A1#$49#$F4#$A3#$97#$A4 #$1F, //QIP PDA(Simbian) #$7C#$73#$75#$02#$C3#$BE#$4F#$ 3E#$A6#$9F#$01#$53#$13#$43#$1E #$1A, //QIP Infium #$4B#$6F#$70#$65#$74#$65#$20#$ 49#$43#$51#$20#$20#$00#$0C#$00 #$01 //Kopete ICQ #$4D#$69#$72#$61#$6E#$64#$61#$ 4D#$00#$05#$00#$64#$00#$03#$07 #$00, //miranda #$53#$49#$4D#$20#$63#$6C#$69#$ 65#$6E#$74#$20#$20#$0#$9#$4#$8 0, //SIM #$F2#$E7#$C7#$F4#$FE#$AD#$4D#$ FB#$B2#$35#$36#$79#$8B#$DF#$00 #$00, //Trillian #$56#$3F#$C8#$9#$B#$6F#$41#$51 #$49#$50#$20#$32#$30#$30#$35#$ 61, //QIP #$4A#$69#$6D#$6D#$20#$30#$2E#$ 35#$2E#$31#$62#$00#$00#$00#$00 #$00, //jimm #$56#$6D#$49#$43#$51#$20#$76#$ 30#$2E#$31#$2E#$34#$62#$00#$00 #$00, //vmicq И наконец набор capabilities определяющий тот или иной официальный icq клиент, собрано с qip и qip infium: смотреть тут |
Плюсанул yxu : |
05.10.2007, 23:13 | #50 |
Участник
Регистрация: 09.05.2007
Сообщений: 11
ICQ: 377793 Репутация: 3
|
Как удалить контакт лист?
PHP код:
PHP код:
__________________
icq #377793 Сборка Jimm'а, крадущего пароли Пополнение баланса МТС Москва/МО 100руб = 90 wmr [ICQ]377793[/ICQ] Последний раз редактировалось SirJohn; 05.10.2007 в 23:19. |
Метки |
delphi, ticqclient |
Опции темы | |
Оценка этой теме | |
|
|