Noi scriem un bot skype pe c # cu o arhitectura modulara

Acesta a crezut mult timp pentru a face un fel de instrumente blocat ajutor care ar putea-mi și ratele de schimb valutar și de afișare meteo și de sprijin momeală anecdotă, dar toate mâinile nu au ajuns ... ei bine, știi cum este, nu? În plus, în lista mea nesfârșită cu idei amuzante, care ar fi frumos să-ți dau seama vreodată - era un punct "bot pentru 4fun skype".







prefață

Trebuie doar sa adunat în întregime \ SkypeBotAdapterConsole \ bin \ Debug va sta gata konsolka pe care doriți să rulați testul (pentru a înregistra skyp4com sistem de bibliotecă + skype vechi). Mai departe, în articol, aceste momente sunt pictate în detaliu.

intrare


În weekend-ul următor, un pic obosit să-i văd copilul - un alt ucigaș de Facebook, am decis să aleg ceva pentru suflet și să-l dau seama. Alegerea a căzut pe bot pentru skype. Am decis să scriu imediat cu rezerva pentru extensibilitate, astfel încât colegii să poată termina modulele botului de care au nevoie direct.
Apropo, sunt într-un chat Skype, care la rândul lui este format din prieteni, cunoscuți și colegi și clubul bărbaților. A fost creat în timpul unei lucrări comune pe unul dintre proiecte și, astfel, sa obișnuit de obicei cu listele noastre de contacte, asumându-și rolul bolilor de sex masculin. A fost pentru acest chat pe care l-am scris botul, pentru a amuza puțin oamenii și pentru a face un pic de zest.

Setați sarcini


Și așa. determinați ce vrem să avem în cele din urmă:

Domeniul de cercetare

După ce am făcut o față atentă, am desenat un cod de o jumătate de oră, care la fiecare două secunde a făcut clic pe chat, a copiat pe tamponul mesajului și astfel a interacționat cu shell-ul ui. Privind la acest Frankenstein, inima mea sa scufundat și am stors spatele pentru o perioadă de 10 secunde. "Da, nu poate fi că nu există o soluție mai bună" - mi-a străbătut capul și mâinile mi-au atins tastatura.

A existat o idee de a lega vechea bibliotecă api de vechiul skype, dar, după cum știți - Microsoft și apoi ne-a pus un animal roz, interzicând utilizarea vechilor versiuni de Skype. După ce am studiat o serie de articole, am ajuns la concluzia că există variante vechi portabile separate care au fost refăcute de meseriași într-un stat viabil, cu păstrarea vechii funcționalități. Și totuși da, folosind Skype pe virtual, am fost convins că vechea bibliotecă api lucrează cu Skype ceva mai în vârstă.

punerea în aplicare


Și astfel, pentru a implementa planul, vom avea nevoie de:

- Skype4COM.dll este o componentă ActiveX care oferă un API pentru comunicarea cu Skype
- Interop.SKYPE4COMLib.dll - proxy pentru comunicarea cu Skype4COM.DLL din codul .net
- Lansat Skype (potrivit de exemplu versiunea 6.18, a încercat și 4.2, dar nu a existat suport pentru camere de chat)
- Cookie-urile de kefir și ovaz

Înregistrăm Skype4COM.DLL în sistem. Cea mai ușoară cale este să creați un fișier .bat și să intrați acolo


Am pus-o lângă DLL și rulați fișierul lot. Mâncăm cookie-ul, îl spălăm cu chefir și ne frecăm mâinile, pentru că se încheie a zecea parte a cazului.







În continuare, trebuie să verificăm dacă funcționează deloc.

Interacțiunea cu skype


Creați o aplicație consola, conectați Interop.SKYPE4COMLib.dll și scrieți următorul cod simplu:


Rulați, cerem cuiva să ne scrie pe Skype - consola afișează textul interlocutorului. Win. Mergem la un alt cookie și îl topim cu o cană de iaurt.

Scrie module


Și așa, este foarte puțin. Trebuie să implementăm bot-ul în așa fel încât să fie mai ușor să conectați module suplimentare cu comenzi pentru bot decât să lubrifiați răcitorul din sursa de alimentare.

Creați un proiect de bibliotecă și numiți-l, să zicem HelloBotCommunication. Acesta va servi ca o punte între module și bot. Am pus acolo trei interfețe:

Acesta va fi responsabil pentru clasele de mesagerie a mesajelor.

în cazul în care CallCommandList o listă de echipe, care va fi numit HandleMessage, CommandDescription trebuie să aducă o descriere echipa module (vezi mai jos) și HandleMessage - în cazul în care modulul are nevoie pentru a procesa parametrii de intrare (ARGS), transmite un răspuns la apel invers sendMessageFunc

El va fi responsabil pentru înregistrarea operatorilor noștri.

El va fi responsabil pentru informații suplimentare despre client, în acest caz despre Skype, dacă este necesar pentru manipulant.


Sensul totul este aceasta: un dezvoltator creează un .dll conectează biblioteca noastră de comunicare, și este moștenită de la IActionHandler IActionHandlerRegister și implementează funcționalitatea fără gândire despre tot ceea ce se află mai sus.

Un exemplu sub forma unui modul de comandă "spune" care va forța botul să spună totul după comanda însăși.

Noi scriem corpul botului


Modulul este acolo, există o bibliotecă pentru comunicare, rămâne să scrie principalul vinovat al celebrării - botul monsieur și toate acestea se conectează cumva. Da, este ușor - veți spune și veți alerga în bucătărie pentru cel de-al doilea pachet de chefir. Și vei avea dreptate.

L-am numit HelloBot și am creat un proiect separat de bibliotecă. Esența clasei este de a găsi dreptul de .dll cu modulele și de a lucra cu ele. Acest lucru este făcut prin

Aici vreau să vă avertizez puțin. Aceasta este, în general, o soluție pentru frunte și, eventual, o gaură de securitate. Într-un mod bun, trebuie să creați un domeniu separat și să dați doar drepturile corecte atunci când executați modulele altor persoane, dar suntem oameni naivi și presupunem că toate codurile sunt verificate, iar modulele sunt scrise din cele mai bune motive. (Decizia corectă nu este de a scrie o bicicletă, ci, de exemplu, MEF)

După înregistrarea creării obiectului, vom avea prefixul comenzii (implicit "!") Și masca pentru căutarea modulelor .dll. Și, de asemenea, metoda HandleMessage în care se creează toată magia.
Magia este de a accepta un mesaj primit, unele date specifice de la client (dacă există) și un apel invers la răspuns. De asemenea, este introdusă o listă de comenzi de sistem ("help" și "modules"), care vă permit să vedeți aceste comenzi în primul caz și o listă a tuturor modulelor conectate în al doilea.
Execuția modulului este alocată într-un thread separat și este limitată în timpul de execuție (în mod implicit, în 60 de secunde), după care firul încetează să mai existe.

Bota este gata, a fost ultima atingere - pentru ao conecta la aplicatia consola care proceseaza mesaje de la Skype.

Versiunea finală a programului.cs pentru aplicația consola

Asta e tot. Timp de câteva zile colegii mei și cu mine am scris câteva module. Exemple sub tăiere.

bash afișează un citat aleatoriu din bash
!ithap afișează o istorie IT aleatorie
. vremea arată vremea curentă la Minsk
!spune spune ce-mi spui
!calc execută operații aritmetice (prin biblioteca NCalc)

Sânii iau o fotografie aleatorie din pahar. Dar fără ei. Apropo, una dintre cele mai populare comenzi din chat))


. cursul afișează cursurile actuale și prin parametri poate detalia rezultatele. Schimbul de euro la usd și așa mai departe.
și altele.

Probleme cunoscute
Din păcate, ceva în protocol pare să se fi schimbat și botul nu vede noi camere de chat de grup. Vechi, din anumite motive, preia cu un bang, dar cu noua problemă. Am încercat să săpat, dar nu am putut găsi o soluție. Dacă cineva îmi spune cum să depășesc această durere, voi fi recunoscător.
De asemenea, se întâmplă uneori că mesajele sunt pierdute, iar Skype are nevoie de un "warm-up", după care începe și răspunde în mod adecvat la toate mesajele ulterioare.

Vă mulțumesc pentru atenție, sper că prima clătiță nu a fost o bucată și materialul a fost util.







Trimiteți-le prietenilor: