Γράφοντας ένα bot. Καταλαβαίνει το ρομπότ λέξεις όπως ένας συνηθισμένος άνθρωπος; Έφτιαξα ένα bot, αλλά μπερδεύτηκα. Τι πρέπει να κάνω

Προσοχή, το υλικό είναι μόνο για ενημερωτικούς σκοπούς και ο συγγραφέας δεν είναι υπεύθυνος για το κλείσιμο λογαριασμών από τις αίθουσες πόκερ. Σύμφωνα με τους νόμους των χωρών, η δημιουργία και χρήση bots δεν απαγορεύεται, αλλά σύμφωνα με τους κανόνες των αιθουσών πόκερ απαγορεύονται.

Αυτό το άρθρο δεν θα περιέχει πλήρεις πηγαίους κώδικες, μόνο θεωρητικά τι και πώς μπορεί να χρησιμοποιηθεί, καθώς και ορισμένες λειτουργίες. Εάν σας ενδιαφέρει αυτό, δεν θα σας είναι δύσκολο να συγκεντρώσετε τα πάντα σε μια ενιαία εικόνα και να γράψετε τη δική σας. Επίσης, δεν θα διδάξω στρατηγικές παιχνιδιών, μπορείτε να βρείτε πολλές πληροφορίες σχετικά με όρους ή στρατηγικές, καθώς και κανόνες στο Διαδίκτυο.

Λίγη ιστορία.

Ξεκίνησα να παίζω πριν από περίπου 5 χρόνια, κατά τη διάρκεια των οποίων έχω παίξει περισσότερα από 1 εκατομμύριο χέρια. Αυτό είναι κυρίως No Limit Holdem σε μικρά τραπέζια (από 2 έως 6 άτομα στο τραπέζι), υπάρχει εμπειρία στο παιχνίδι Omaha, HU NL Holdem. Το παιχνίδι μοιάζει με χόμπι και χαλάρωση. Και τότε κάπως οι φίλοι μου και εγώ είχαμε την ιδέα να γράψουμε ένα bot, η πρώτη ιδέα ήταν να γράψουμε για limit hold'em, και όταν γράφτηκε το μισό ρομπότ, ψήφισαν έναν νόμο που απαγόρευε στους Αμερικανούς να παίζουν πόκερ, και σε το τέλος εγκατέλειψαν το bot με ένα όριο. Η πρώτη έκδοση γράφτηκε σε ένα νευρωνικό δίκτυο με αναγνώριση εικόνας, πράγμα που σημαίνει ότι το bot εκπαιδεύτηκε να αναγνωρίζει χάρτες από στιγμιότυπα οθόνης, αλλά εσείς οι ίδιοι καταλαβαίνετε ότι αυτή είναι μια ανακριβής μέθοδος, αλλά με αρκετά καλή εκπαίδευση αναγνώρισε με ακρίβεια 98- 99% άλλες εκδόσεις των bots έχουν ήδη εργαστεί απευθείας με τα παράθυρα των δωματίων, χρησιμοποιώντας τους πόρους τους, και επίσης σε συνδυασμό με προγράμματα για την ανάλυση και τη συλλογή στατιστικών στοιχείων παιχνιδιού.

Οι αίθουσες πόκερ δεν κοιμούνται.

Σχεδόν όλες οι αίθουσες πόκερ διαθέτουν κάποια μορφή προστασίας και σύστημα ανίχνευσης bot πόκερ. Ας εξετάσουμε μερικά από αυτά. Παιχνίδι μεγάλης διάρκειας - όταν ένα άτομο παίζει για πολύ καιρό, γίνεται καχύποπτος, γι' αυτό σε ορισμένα δωμάτια μπορεί να εμφανιστούν πλαίσια ερωτήσεων. Ως άμυνα, μην κάνετε μεγάλες περιόδους παιχνιδιού. Ενέργειες στο τραπέζι - πάτημα κουμπιών, επιλογή παραθύρων, ενέργειες δεν πρέπει να πραγματοποιούνται χωρίς κίνηση του ποντικιού, σε ένα ελαχιστοποιημένο παράθυρο. Είναι καλύτερο να ρυθμίσετε τις τροχιές του ποντικιού λίγο μη γραμμικά, πατώντας κουμπιά σε διαφορετικά σημεία, η ταχύτητα κίνησης δεν είναι επίσης στιγμιαία. Σαρώσεις διεργασιών που εκτελούνται και στιγμιότυπα οθόνης - προστασία όπως αναφέρθηκε παραπάνω, μην παίζετε σε ελαχιστοποιημένα παράθυρα, καλέστε τη διαδικασία bot όχι bot πόκερ κ.λπ., μην αφήνετε το παράθυρο του bot μεγιστοποιημένο στην οθόνη, αλλάξτε το όνομα της διαδικασίας μετά κάποιο χρονικό διάστημα (για παράδειγμα, μετά από x λεπτά επανεκκινήστε το bot με ένα νέο όνομα διαδικασίας).

Σχέδιο bot πόκερ.

Το σχήμα μπορεί να χωριστεί σε 3 μέρη:

Μπλοκ 1 - μπλοκ αλληλεπίδρασης με τον πελάτη για παιχνίδι πόκερ.
Μπλοκ 2 - μπλοκ λήψης αποφάσεων.
Το Block 3 είναι ένα μπλοκ συλλογής στατιστικών στοιχείων, κατά τη γνώμη μου, είναι καλύτερο να χρησιμοποιείτε λογισμικό τρίτων, για παράδειγμα PokerTracker3, ενώ απενεργοποιείτε την εμφάνιση στατιστικών στοιχείων στην οθόνη.
Στη συνέχεια, ας δούμε κάθε μπλοκ με περισσότερες λεπτομέρειες.

Μπλοκ 1 - μπλοκ αλληλεπίδρασης με τον πελάτη για παιχνίδι πόκερ.

Αυτό το μπλοκ χρησιμεύει για τη συλλογή πληροφοριών στο τραπέζι τυχερών παιχνιδιών και τη μεταφορά τους στο μπλοκ λήψης αποφάσεων, καθώς και για τη λήψη απάντησης με απόφαση να εκτελέσετε μία ή την άλλη ενέργεια όπως Fold, Raise, Call ή All-In. Τώρα ας δούμε αυτό το μπλοκ. Μέρος αυτού του μέρους είναι η αλληλεπίδραση με το κύριο παράθυρο του προγράμματος, αυτές είναι ενέργειες όπως η επιλογή ενός ορίου, η επιλογή ενός τραπεζιού στο οποίο θα παίξουμε, αυτό είναι επίσης ένα μεγάλο μέρος, αλλά δεν θα σταθούμε σε αυτό. Ας ρίξουμε μια πιο προσεκτική ματιά στο μέρος με τον πίνακα. Πρώτα πρέπει να βρούμε τις λαβές όλων των ανοιχτών τραπεζιών παιχνιδιών (παράθυρα), μπορούμε να το κάνουμε χρησιμοποιώντας τη συνάρτηση EnumWindows.
Η συνάρτηση EnumWindows απαριθμεί όλα τα παράθυρα ανώτατου επιπέδου στην οθόνη, περνώντας μια λαβή σε κάθε παράθυρο με τη σειρά της σε μια συνάρτηση επανάκλησης που καθορίζεται από το πρόγραμμα. Το EnumWindows παραμένει σε ισχύ μέχρι να απαριθμηθεί το τελευταίο παράθυρο ανώτατου επιπέδου ή έως ότου η συνάρτηση επανάκλησης επιστρέψει FALSE.

Σύνταξη:
BOOL EnumWindows (WNDENUMPROC lpEnumFunc, // δείκτης στη συνάρτηση επανάκλησης LPARAM lParam // τιμή που ορίζεται από το πρόγραμμα);
Επιλογές:
lpEnumFunc - Υποδεικνύει μια λειτουργία επανάκλησης που καθορίζεται από το πρόγραμμα. Για περισσότερες πληροφορίες, ανατρέξτε στη συνάρτηση επανάκλησης EnumWindowsProc.

Εάν η συνάρτηση λειτούργησε με επιτυχία, μπορούμε να πάρουμε το όνομα του παραθύρου GetWindowText και αφού το αναλύσουμε, μπορούμε να καταλάβουμε αν το παράθυρο χρειάζεται ή όχι συνήθως ο τίτλος του παραθύρου περιέχει το ψευδώνυμό σας, το όνομα της αίθουσας πόκερ και το όριο. Επιπλέον, δεν θα ήταν κακό να αποθηκεύσετε τις λαβές όλων των παραθύρων που βρέθηκαν για μελλοντική χρήση, χωρίς να επαναληφθεί η αναζήτηση θα χρειαστεί να γίνει μόνο εάν ανοίξει ένα νέο παράθυρο.

Τώρα που έχουμε μια λαβή παραθύρου παιχνιδιού, μπορούμε να ανακτήσουμε πληροφορίες για τον πίνακα. Οι περισσότερες πληροφορίες αποθηκεύονται στο παράθυρο του αντιπροσώπου. Από αυτό μπορούμε να μάθουμε όλους τους συμμετέχοντες στο τραπέζι, ποιος μπήκε, ποιος βγήκε από το τραπέζι, ποιος έκανε τι δράση, τα χαρτιά στο τραπέζι και τα χαρτιά μας. Για να γίνει αυτό, χρειαζόμαστε έναν αναλυτή κειμένου, δεν θα σας πω πώς να το γράψετε, αυτό είναι ένα ξεχωριστό θέμα, το κύριο πράγμα είναι ότι η ιδέα είναι σαφής J. Αλλά πριν από τον αναλυτή, πρέπει πρώτα να βρούμε το παράθυρο στοιχεία, και ανάμεσά τους βρείτε το παράθυρο του αντιπροσώπου. Πολύ συχνά, το παράθυρο του dealer είναι μια κλάση που προέρχεται από τον Internet Explorer_Server για να το βρούμε, θα χρησιμοποιήσουμε τη συνάρτηση EnumChildWindows και, στη συνέχεια, το GetClassName.

Το EnumChildWindows απαριθμεί τα θυγατρικά παράθυρα που ανήκουν σε ένα συγκεκριμένο γονικό παράθυρο, μεταβιβάζοντας με τη σειρά του μια λαβή σε κάθε θυγατρικό παράθυρο σε μια συνάρτηση επανάκλησης που καθορίζεται από το πρόγραμμα. Η συνάρτηση EnumChildWindows εκτελείται έως ότου απαριθμηθεί το τελευταίο θυγατρικό παράθυρο ή η συνάρτηση επανάκλησης επιστρέψει FALSE.

Σύνταξη

BOOL EnumChildWindows (HWND hWndParent, // χειρισμός στο γονικό παράθυρο WNDENUMPROC lpEnumFunc, // δείκτης στη συνάρτηση επανάκλησης LPARAM lParam // τιμή που ορίζεται από το πρόγραμμα).

Επιλογές:
hWndParent - Προσδιορίζει το γονικό παράθυρο του οποίου τα θυγατρικά παράθυρα πρέπει να απαριθμούνται.
lpEnumFunc - Υποδεικνύει μια λειτουργία επανάκλησης που καθορίζεται από το πρόγραμμα. Για περισσότερες πληροφορίες σχετικά με τη λειτουργία επανάκλησης, ανατρέξτε στη συνάρτηση επανάκλησης EnumChildProc.
lParam - Ορίζει μια τιμή 32-bit που ορίζεται από το πρόγραμμα που θα μεταβιβαστεί στη συνάρτηση επανάκλησης.
Επιστρεφόμενες τιμές: Εάν η συνάρτηση πετύχει, επιστρέφεται μια μη μηδενική τιμή. Εάν η συνάρτηση αποτύχει, η τιμή επιστροφής είναι μηδέν.

Τώρα μπορείτε να ξεκινήσετε την ανάλυση του κειμένου. Η μετακίνησή μας ή όχι μπορεί να αναλυθεί με βάση τα κουμπιά που είναι διαθέσιμα αυτήν τη στιγμή. Αυτό μπορεί να γίνει είτε μέσω πόρων είτε απλά με σημεία στην οθόνη σε αυτό το παράθυρο. Στη συνέχεια, εάν είναι η κίνησή μας, τότε μεταφέρουμε τα γνωστά δεδομένα στο μπλοκ λήψης αποφάσεων. Όταν λάβουμε απάντηση, κάνουμε τις κατάλληλες ενέργειες. Αυτό το μέρος δεν έχει καλύψει ακόμη πώς να πατήσετε τα κουμπιά, αλλά νομίζω ότι μπορείτε να το κατακτήσετε μόνοι σας.

Μπλοκ 2 - μπλοκ λήψης αποφάσεων

Αυτό το μπλοκ είναι η καρδιά ολόκληρου του bot, γιατί... Από αυτόν εξαρτάται πόσο πετυχημένος θα είναι στο παιχνίδι, πόσο σωστά παίρνει αποφάσεις. Στο περιοδικό Hacker 137 της 06.2010, εξετάστηκε ένα παράδειγμα που βασίστηκε πλήρως στη θεωρία των πιθανοτήτων και αυτό είναι καλό, αλλά για να ληφθεί ένα αρκετά αξιόπιστο αποτέλεσμα, είναι απαραίτητο να πραγματοποιηθούν πολλές επαναλήψεις. Για να παίξουμε με αρκετή σιγουριά εναντίον ενός αντιπάλου, πρέπει να γνωρίζουμε το εύρος του και τον τρόπο παιχνιδιού του (αυτό το κομμάτι συνδέεται με τα στατιστικά), υπάρχουν επίσης ορισμένες στρατηγικές παιχνιδιού που εξαρτώνται από το ποσό των χρημάτων που έχετε, τον αριθμό των παικτών στο τραπέζι και η ίδια η στρατηγική του παιχνιδιού. Το αρχικό εύρος των χεριών εξαρτάται από όλα αυτά και οι ενέργειες στους επόμενους δρόμους, για παράδειγμα, ένα άτομο που παίζει σύμφωνα με τη στρατηγική short stack (SSS) σπάνια κάνει κινήσεις στο river (όταν το 5ο φύλλο είναι απλωμένο στο τραπέζι ), επειδή Σε αυτό το σημείο είναι συχνά ήδη στο Allina (πήγε all-in). Η αξιολόγηση των καταστάσεων περιλαμβάνει επίσης μέτρηση άουτ, τα άουτ είναι ο αριθμός των φύλλων που θα βελτιώσουν τη θέση μας στους επόμενους δρόμους, επομένως συνδυασμοί όπως straight draw, hole straight, flush draw κ.λπ. Η ισοπαλία είναι επίσης ένας συνδυασμός και, ανάλογα με τον αριθμό των άουτ, έχει και ένα τίμημα. Χάρη σε αυτά τα πρόσθετα δεδομένα, μπορούμε ήδη να λάβουμε αποφάσεις ανάλογα με την επιλεγμένη στρατηγική, εάν προσθέσουμε τα στατιστικά στοιχεία του παίκτη στην κορυφή, θα είναι ακόμη πιο ακριβή και εάν προσθέσουμε έναν πλήρη λάθος υπολογισμό, αυτό το δείγμα μπορεί να συμπληρωθεί. Ελπίζω να μετέφερα την ιδέα μου για τη μείωση των δειγμάτων και τη λήψη αποφάσεων, όλα αυτά προέρχονται από προσωπική εμπειρία του παιχνιδιού και τη λήψη αποφάσεων, επειδή με λίγες προτάσεις δεν μπορείς να πεις τη θεωρία του παιχνιδιού πόκερ, που κυκλοφορεί σε πολλούς τόμους, για διαφορετικές καταστάσεις, που είναι αμέτρητες, αν και μπορούν να χωριστούν σε κύριες ομάδες...

Πρώτα πρέπει να γνωρίζουμε την κατάσταση στο τραπέζι και να μάθουμε τι συνδυασμό έχουμε. Ακολουθεί ένα παράδειγμα του κώδικα ορισμού συνδυασμού (ξαναγραμμένος πιο καθαρά, αλλά ίσως όχι βέλτιστα):

// συνάρτηση για το γέμισμα μιας σειράς καρτών, επιστρέφει τον σειριακό αριθμό της κάρτας int CardToNumber(char Card) ( if ((Card>"1")&&(Card<="9"))return (Card-48); if (Card=="T")return 10; if (Card=="J")return 11; if (Card=="Q")return 12; if (Card=="K")return 13; if (Card=="A")return 14; return -1; } // функция для получения бита, соотвествующего масти карты int MastToNumber(char mast) { if (mast=="h")return 1; if (mast=="d")return 2; if (mast=="c")return 4; if (mast=="s")return 8; return 0; } // функции расчета комбинации int Hand(char *MyHand_,char *CardsTable_) { int flush_,flush; //0-ничего 1-флэшь 2-флэшь дро 3-бэедорфлэшьдро 4-флэшь на столе(nothing cards) int cards; //i-карты j1-кол-во карт j2-масти bits 1,2,3,4-h,d,c,s j3-0/1 - 1-наша карта 0-не наша(на столе) int straight; //0-ничего, 1-стрит, 2-открытый стрит(2-х сторонний) 3-гатшот 4-натс стрит на столе 5-стрит на столе int readyhand; //0-не готовая, 1-готовая комбинация int i,j, maxi,flag_,flag,flmax,top,pair_,pair,three,four,over,set_,treeps,quad,num,kicker; // заполнение массива с картами исходя из входящих данных for(i=1;i<=14;i++) for(j=1;j<=3;j++)cards[i][j]=0; cards++; cards=cards| 2*MastToNumber(MyHand_)); cards=cards|(32*MastToNumber(MyHand_)); cards=1; cards++; cards=cards|(2*MastToNumber(MyHand_)); cards=cards|(32*MastToNumber(MyHand_)); cards=cards+1; i=0; while(i0)&&(i>1)) ( num++; if (cards[i]==1)flag=i; ) other ( if (maxi 0) ( num++; if (cards[i]==1)flag=i; ) other ( if (maxi =maxi) (ενώ(i 0)&&(flmax-i!=1))flag++; if((κάρτες>0)&&((flmax-i)==1))flag++; i++; ) ) ευθεία=0; if((maxi>=5)&&(flmax==14)&&(flag==0)) straight=4; if((maxi>=5)&&(flmax<14)&&(flag==0)) straight=5; if((maxi>=5)&&(flag>0)) straight=1; if((maxi==4)&&(flag>0)&&(flmax<14)) straight=2; if((maxi==4)&&(flag>0)&&(flmax==14)) ευθεία=3; if((maxi==4)&&(flag>0)&&(flmax==4)) straight=3; // υπολογισμός αναβοσβήνει flush_=0; j=2; ενώ (j<=16) { flush=0; flag=0; i=2; num=0; flmax=0; flag_=0; while(i<15){ if ((cards[i]& j)==j) { flmax=i;num++;} if ((cards[i]& (j*16))==j*16) { flag_++;flag=i;} i++; } if((num==5)&&(flag==0)) flush=4; if((num>=5)&&(flmax==14)&&(flag>=13)) flush=1; if((αριθμός>=5)&&(flmax==14)&&((κάρτες& j)==j)&&(flag==12)) flush=1; if((αριθμός>=5)&&(flmax==14)&&((κάρτες& j)==j)&&((κάρτες& j)==j)&&(σημαία==11)) flush=1; if((αριθμός>=5)&&(flmax==14)&&((κάρτες& j)==j)&&((κάρτες& j)==j)&&((κάρτες& ι)==j)&&(σημαία== 10)) flush=1; if((αριθμός>=5)&&(flmax==14)&&((κάρτες& j)==j)&&((κάρτες& j)==j)&&((κάρτες& ι)==j)&&((κάρτες& j) )==j)) flush=1; if((num==5)&&(flag_==2)) flush=1; if((num==4)&&(flag>0)) flush=2; if((num==3)&&(flag==2)) flush=3; if((flush>flush_)&&(flush!=0))flush_=flush; j*=2; ) flush=flush_; // υπολογισμός ζεύγους, πάνω από ζεύγος, σετ, ταξίδια, τετραπλό, kicker pair=0;tree=0;four=0; top=0;over=0;set_=0;treeps=0;quad=0;pair_=0; i=2; καθώς εγώ<15) { if ((cards[i]>=1)&&(κάρτες[i]==0))( top=0;πάνω από 0;) εάν ((κάρτες[i]==1)&&(κάρτες[i]==0))( top=0 ;over=0;) if ((κάρτες[i]==2)&&(κάρτες[i]==0))( ζευγάρι++;) αν ((κάρτες[i]==2)&&(κάρτες[i]= =1))( pair_++;pair++;top=1;) if ((κάρτες[i]==2)&&(κάρτες[i]==2))( pair_++;pair++;over=1;) if (κάρτες[i]==3)( τρία++;) αν (κάρτες[i]==4)( τέσσερα++;) αν ((κάρτες[i]==3)&&(κάρτες[i]==1) δέντρα=1; αν ((κάρτες[i]==3)&&(κάρτες[i]==2)) set_=1; εάν ((κάρτες[i]==4)&&(κάρτες[i]>0)) τετραπλό=1; αν ((κάρτες[i]==4)&&(κάρτες>0)) τετραπλό=1; i++; ) kicker=0; if (top>0) for(i=2;i<=14;i++){ if ((cards[i]==1)&&(cards[i]==1)) kicker=i; } // "Стрит:и тип стрита "- straight // "Флеш:и тип флэша "- flush // "К-во пар: "- pair // "К-во пар у нас: "- pair_ // "Топ пара: "- top // "Кикер" - kicker // "Овер пара: "- over // "3 карты: "- three // "Трипс:(2 карты на столе 1 у нас) "- treeps // "Сет: (2 у нас 1 на столе)"- Set_ // "4 карты: "- four // "Каре: "- quad ……… }

Ως αποτέλεσμα, στις αντίστοιχες μεταβλητές έχουμε στοιχεία για την τρέχουσα κατάσταση πραγμάτων. Λάβετε υπόψη ότι δεν υπάρχει η έννοια του full house, είναι παράγωγο ζευγαριού και ταξιδιών ή σετ. Εδώ χρειάζεστε και ένα κομμάτι που καθορίζει την ετοιμότητα του χεριού, δηλ. έτοιμο, όχι έτοιμο, μισοέτοιμο. Για παράδειγμα αυτός ο κωδικός:

// ετοιμότητα χεριών
έτοιμο=0; αν ((ζεύγος==1)&&((κορυφή==1)||(πάνω==1))) έτοιμο=1; εάν ((ζεύγος==1)&&(κορυφή==1)&&(kicker<11)&&(over==0)) readyhand=0; if ((pair>=2)&&((top==1)||(πάνω==1))) έτοιμο=1; αν ((ζεύγος==2)&&(κορυφή==1)&&(kicker<11)&&(over==0)) readyhand=0; if ((pair==2)&&((top==0)||(over==0))&&(pair_==2)) readyhand=1; if ((pair>2)&&((top==0)||(πάνω==0))) έτοιμο=0; εάν ((τρεις==1)&&(κορυφή==0)&&(πάνω==0)&&(ζεύγος_==0)) έτοιμο=0; αν (treeps==1) έτοιμος=1; αν (σύνολο_==1) έτοιμο=1; αν (ευθεία==5) έτοιμο=0; αν (ευθεία==4) έτοιμος=1; εάν ((ευθεία==2)&&(readyhand==0)) έτοιμο=2; αν (ευθεία==1) έτοιμο=1; if (flush==4) readyhand=0; εάν ((flush==2)&&(readyhand==0)) readyhand=2; if (flush==1) readyhand=1; αν ((τρεις==1)&&((κορυφή==1)||(πάνω==1))) έτοιμο=1; εάν ((τρεις==1)&&(κορυφή==0)&&(πάνω==0)&&(ζεύγος_>0)) έτοιμο=1; εάν ((τρεις==1)&&(κορυφή==0)&&(πάνω==0)&&(ζεύγος_==0)&&(ζεύγος>0)) έτοιμο=0; //γεμάτο στο τραπέζι εάν ((treeps==1)&&(pair>0)) readyhand=1; εάν ((set_==1)&&(pair>0)) readyhand=1; εάν (τετράγωνο==1) έτοιμο=1;

Με βάση αυτά τα δεδομένα, πηγαίνουμε στο τμήμα που λαμβάνει στατιστικά στοιχεία για τους αντιπάλους, υπολογισμούς για τις πιθανότητες του ποτ και άλλα απαραίτητα, αποφασίζουμε για τη δράση και προχωράμε στο πρώτο μπλοκ - εκτελέστε τη δράση.

Πεδίο 3 - μπλοκ συλλογής στατιστικών στοιχείων

Αυτό είναι ένα σημαντικό μπλοκ που βοηθά στη λήψη αποφάσεων, μπορείτε είτε να συλλέξετε μόνοι σας στατιστικά στοιχεία είτε να χρησιμοποιήσετε προγράμματα τρίτων. Θα περιγράψω ένα παράδειγμα ενός αιτήματος προς το PokerTracker3, ένα πρόγραμμα συλλογής και ανάλυσης στατιστικών στοιχείων παιχνιδιού, υπάρχουν περισσότερες από 100 παράμετροι στο πρόγραμμα, αλλά τουλάχιστον για παράδειγμα, μερικές βασικές είναι αρκετές. Στο PokerTracker3 η βάση δεδομένων αποθηκεύεται στη βάση δεδομένων Postges. Παράδειγμα αιτήματος:

SELECT sites.site_abbrev, p.player_name, COUNT(hhps.id_player) AS hands, AVG (CASE WHEN flg_vpip THEN 1 ELSE 0 END)*100 AS vpip, AVG (CASE WHEN cnt_p_raise >= 1 ELSE0 END1) AS pfr, AVG (ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ flg_steal_att ΤΟΤΕ 1 ΟΤΑΝ flg_steal_opp ΤΟΤΕ 0 ΤΕΛΟΣ)*100 AS ats, AVG (ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ flg_sb_steal_fold ΤΟΤΕ 1 ΟΤΑΝ flg_blind_def_opp END_s, END_0s) AVG (ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ flg_bb_steal_fold ΤΟΤΕ 1 ΟΤΑΝ flg_blind_def_opp και flg_blind_b ΤΟΤΕ 0 ΤΕΛΟΣ)*100 AS fbbtos, AVG (ΠΕΡΙΠΤΩΣΗ ΟΤΑΝ enum_f_cbet_action="F" ΤΟΤΕ 1 ΟΤΑΝ flg_f_cbet_def_opp ΤΟΤΕ 0 ΤΕΛΟΣ)*100 AS fcbetf ΑΠΟ ΤΟΠΟΘΕΤΗΣΕΙΣ ΑΝΑΠΑΡΑΓΩΓΗΣ_ΠΛΕΙΣΙΩΜΕΝΟΥ_INNEROS er_statistics AS hps ON (σελ .player_name = "ψευδώνυμο χρήστη")και(p.id_player = hhps.id_player)) ON p.id_site = sites.id_site ΟΜΑΔΑ ΚΑΤΑ sites.site_abbrev,p.player_name ORDER BY sites.site_abbrev DESC;

Ως αποτέλεσμα, θα λάβουμε ένα δείγμα για έναν συγκεκριμένο παίκτη, ιστότοπους στους οποίους υπάρχει ένα τέτοιο ψευδώνυμο στη βάση δεδομένων, μπορούμε μόνο να μειώσουμε στον ιστότοπό μας, τον αριθμό των χεριών του αντιπάλου (απαιτούνται για την ακρίβεια των αναγνώσεων), VPIP (% των χεριών με τα οποία μπαίνει στο παιχνίδι), PFR (raise preflop - preflop raise), ATS (προσπάθεια για ατσάλι - πόσα blinds κλέβουν preflop), CBET (c-bet στο flop - continuation bet στο flop), BBS (big blind steel - κλέβοντας το big blind), SBS (small blind steel - stealing the small blind). Αυτές οι παράμετροι χρησιμοποιούνται κυρίως για την εκτεταμένη στρατηγική των σύντομων στοίβων για πλήρεις στοίβες αυτές οι παράμετροι είναι λίγες, αλλά ως παράδειγμα για το πώς να τις αποκτήσετε, αρκεί. Γιατί χρειάζονται όλες αυτές οι παράμετροι και πώς να τις χρησιμοποιήσετε, σας συμβουλεύω να διαβάσετε τους σχετικούς πόρους.

Αφού λάβουμε επιπλέον στατιστικά στοιχεία, προχωράμε στο δεύτερο μπλοκ και προσαρμόζουμε την απόφασή μας για το παιχνίδι.

Τελικά.
Ακολουθούν μερικά στιγμιότυπα οθόνης του τι μπορεί να λάβετε:







Δυστυχώς, αυτή τη στιγμή δεν υπάρχουν καλές βιβλιοθήκες Python2 για να δημιουργήσετε γρήγορα ένα chatbot. Παρακάτω θα δείξω πόσο εύκολο είναι να γράψετε ένα πρωτόγονο ρομπότ συνομιλίας για VK χρησιμοποιώντας το VK API.


Το άρθρο γράφτηκε για αρχάριους για να δείξει ότι δεν υπάρχει τίποτα δύσκολο στη σύνταξη bots στην Python.

Εξουσιοδότηση

Θα χρειαστούμε τη βιβλιοθήκη vk_api. Μπορείτε να συνδεθείτε στο VK με δύο τρόπους:
- Ως χρήστης
- Ως κοινότητα


Στην πρώτη περίπτωση, θα χρειαστεί να εισαγάγετε το όνομα χρήστη και τον κωδικό πρόσβασής σας. Στη δεύτερη περίπτωση, πρέπει να ενεργοποιήσετε τα "Μηνύματα κοινότητας" στην ομάδα και να δημιουργήσετε ένα κλειδί πρόσβασης API:





χρόνος εισαγωγής εισαγωγή vk_api vk = vk_api.VkApi(login = "login", password = "password") #vk_api.VkApi(token = "a02d...e83fd") #Σύνδεση ως κοινότητα vk.auth()

Αποστολή μηνυμάτων

Τώρα ας γράψουμε μια σύντομη συνάρτηση που στέλνει ένα μήνυμα στο επιλεγμένο άτομο.


ΥΣΤΕΡΟΓΡΑΦΟ.Η κοινότητα μπορεί να στείλει μηνύματα μόνο σε χρήστες που έχουν αναρτηθεί στο παρελθόν.


def write_msg(user_id, s): vk.method("messages.send", ("user_id":user_id,"message":s))

Στο vk.method μπορούμε να καλέσουμε οποιαδήποτε μέθοδο από VK APIκαι περάστε τις παραμέτρους ως λεξικό.


Σε αυτή την περίπτωση καλούμε τη μέθοδο μηνύματα.αποστολήκαι περάστε το αναγνωριστικό χρήστη και το κείμενο του μηνύματος ως παραμέτρους.

Λήψη μηνυμάτων

Εξαιρετική! Έχουμε μάθει να στέλνουμε μηνύματα, απλά πρέπει να μάθουμε πώς να τα λαμβάνουμε. Για αυτό χρειαζόμαστε μια μέθοδο messages.get.


Μερικές παράμετροι που πρέπει να προσέξετε:


1) out - εάν αυτή η παράμετρος είναι ίση με 1, ο διακομιστής θα επιστρέψει τα εξερχόμενα μηνύματα.
2) count - ο αριθμός των μηνυμάτων που πρέπει να ληφθούν.
3) time_offset - ο μέγιστος χρόνος που έχει περάσει από τη στιγμή που στάλθηκε το μήνυμα έως την τρέχουσα στιγμή σε δευτερόλεπτα.
4) last_message_id - το αναγνωριστικό του μηνύματος που ελήφθη πριν από αυτό που πρέπει να επιστραφεί τελευταίο (υπό την προϋπόθεση ότι δεν ελήφθησαν περισσότερα από πλήθος μηνυμάτων μετά από αυτό)


values‎ = ("out": 0,"count": 100,"time_offset": 60) vk.method("messages.get", τιμές)

Στην περίπτωσή μας, αυτή η μέθοδος θα επιστρέψει όλα τα μηνύματα που ελήφθησαν τα τελευταία 60 δευτερόλεπτα, αν φυσικά ήταν λιγότερα από 100 και αν περισσότερα, τότε τα τελευταία 100.


Ως αποτέλεσμα, λαμβάνουμε μια λίστα με στοιχεία:


(u"count": 3441, u"στοιχεία": [(u"body": u"\u041f\u0438\u0448\u0435\u043c \u0431\u043e\u0442\u0430 \u0434\u043\u043f\u044 !", u"date": 1491934484, u"id": 7387, u"out": 0, u"read_state": 0, u"title": u" ... ", u"user_id": 23107592) , (u"body": u"\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!", u"ημερομηνία": 1491934479, u"8"out": 7 : 0, u"read_state": 0, u"title": u" ... ", u"user_id": 23107592)])

Για να εξηγήσουμε με απλά λόγια, τα στοιχεία είναι αυτά που μπορούν να επισημανθούν στο διάλογο.



Η τελευταία συγχορδία, κάνουμε έναν αιώνιο κύκλο, όπου θα απαντάμε σε κάθε μήνυμα με το "Γεια σου, Χαμπρ!"


while True: answer = vk.method("messages.get", values) if answer["items"]: values["last_message_id"] = answer["items"]["id"] for item in answer["items" "]: write_msg(item,u"Hello, Habr!") time.sleep(1)

Το chatbot είναι έτοιμο.


ΥΣΤΕΡΟΓΡΑΦΟ.Θυμόμαστε την παράμετρο last_message_id έτσι ώστε την επόμενη φορά να επεξεργαζόμαστε μόνο νέα μηνύματα.


Πλήρης κωδικός

# -*- κωδικοποίηση: utf-8 -*- χρόνος εισαγωγής εισαγωγή vk_api vk = vk_api.VkApi(login = "login", password = "password") #vk_api.VkApi(token = "a02d...e83fd") # Συνδεθείτε ως κοινότητα vk.auth() values‎ = ("out": 0,"count": 100,"time_offset": 60) def write_msg(user_id, s): vk.method("messages.send" , ("user_id ":user_id,"message":s)) ενώ True: answer = vk.method("messages.get", values) if answer["items"]: values["last_message_id"] = απάντηση[" αντικείμενα"][ "αναγνωριστικό"] για το αντικείμενο σε απόκριση["αντικείμενα"]: write_msg(item,u"Hello, Habr!") time.sleep(1)


Αποδείχθηκε ότι ήταν 17 γραμμές κώδικα. Καλή τύχη!


UPD 17/09/18:
Δυστυχώς, στη νέα έκδοση (5.80) του VK API, η μέθοδος "messages.get" καταργήθηκε και αυτό το άρθρο έχει χάσει τη συνάφειά του. Τώρα χρησιμοποιήστε το σύστημα longpoll για να δημιουργήσετε bots. Μπορείτε να βρείτε ένα παράδειγμα στη λειτουργική μονάδα vk_api για Python.

Αυτό το άρθρο θα σας οδηγήσει σε μια εκδρομή στον κόσμο των chatbots. Καθώς διαβάζετε, θα μάθετε πώς λειτουργούν τα chatbot και πώς δημιουργούνται.

Τα chatbots είναι ένα δημοφιλές θέμα εδώ και καιρό και πολλοί άνθρωποι είναι γοητευμένοι από αυτά σήμερα. Κάποιοι μάλιστα πιστεύουν ότι τέτοια bots είναι το μέλλον και αργά ή γρήγορα θα αντικαταστήσουν τις εφαρμογές. Ωστόσο, υπάρχουν και εκείνοι οι άνθρωποι που πιστεύουν ότι τα bots ως ιδέα είναι καταδικασμένα σε αποτυχία.

Σε αυτό το άρθρο, αντί να μιλάμε για το μέλλον των chatbots, θα σας κάνουμε μια σύντομη περιήγηση στο θέμα των chatbot, πώς λειτουργούν, σε τι μπορούν να χρησιμοποιηθούν και αν είναι δύσκολο να δημιουργήσετε ένα μόνοι σας.

Τι είναι αυτό?

Το chatbot είναι ένα είδος βοηθού που επικοινωνεί μαζί μας μέσω μηνυμάτων κειμένου. Το chatbot καταλαβαίνει τι προσπαθείτε να πείτε και σας απαντά ή ακόμα και εκτελεί αμέσως την ενέργεια που απαιτείται από αυτό.

Αν θυμάστε τα CleverBot, πιθανότατα γνωρίζετε ότι δεν είναι καινούργια. Πολλά πράγματα τα καθιστούν σχετικά:

  1. Ο τεράστιος χρόνος που αφιερώνουν οι άνθρωποι πληκτρολογώντας κείμενο σε διάφορους άμεσους αγγελιοφόρους (είτε Σε επαφή με, Facebook, Slack, κ.λπ.) καθιστούν αυτούς τους άμεσους αγγελιοφόρους ένα ταχέως αναπτυσσόμενο τμήμα στην αγορά εφαρμογών. Οι άνθρωποι τα χρησιμοποιούν όχι μόνο για φιλική αλληλογραφία, αλλά και για επιχειρηματική ανάπτυξη.
  2. Η ταχεία ανάπτυξη της τεχνητής νοημοσύνης και των τεχνολογιών μηχανικής μάθησης επιτρέπει στα σύγχρονα chatbots να συμπεριφέρονται όσο το δυνατόν πιο κοντά στον τρόπο που συμπεριφέρονται οι άνθρωποι.

Τα σύγχρονα chatbot δεν βασίζονται αποκλειστικά σε κείμενο, αλλά είναι επίσης σε θέση να εμφανίζουν κάθε είδους χρήσιμες κάρτες, εικόνες, συνδέσμους, φόρμες, δημιουργώντας μια ατμόσφαιρα για τη χρήση της εφαρμογής.

Όλα αυτά σας επιτρέπουν να τα χρησιμοποιείτε για εντελώς διαφορετικούς σκοπούς, όπως βοήθεια για την πραγματοποίηση αγορών, υπηρεσία σχολίων, ειδήσεις, παιχνίδια και πολλά άλλα. Ένα καλό chatbot δεν χρειάζεται να μπορεί να κάνει τα πάντα: αν σας δείχνει απλώς τα τελευταία νέα, δεν χρειάζεται να μπορεί να παραγγείλει φαγητό από ένα εστιατόριο. Κάνει ένα πράγμα και το κάνει συνειδητά.

Πώς λειτουργούν;

Οι περισσότεροι άνθρωποι δεν θα δημιουργήσουν τα δικά τους chatbots από την αρχή, αφού σήμερα υπάρχει μια αρκετά μεγάλη ποικιλία από διάφορα πλαίσια και υπηρεσίες που μπορούν να βοηθήσουν στη δημιουργία ενός chatbot. Ωστόσο, για να καταλάβετε πώς λειτουργούν πρέπει να βουτήξετε λίγο πιο βαθιά.

Backend: Τα Chatbots μπορούν να αναπτυχθούν σε οποιαδήποτε γλώσσα προγραμματισμού που μπορεί να χρησιμοποιηθεί για τη δημιουργία ενός web API. Για τους περισσότερους αυτό θα είναι είτε Node.js είτε PHP, ωστόσο υπάρχουν πολλές βιβλιοθήκες για τη δημιουργία chatbots γραμμένων σε Java ή Python. Το backend λαμβάνει το μήνυμα, σκέφτεται τι να απαντήσει και επιστρέφει μια απάντηση στον χρήστη.

Frontend: Αυτός μπορεί να είναι οποιοσδήποτε αγγελιοφόρος: από δημοφιλείς όπως το Facebook Messenger, το Slack, το Telegram έως την απλή συνομιλία σε πραγματικό χρόνο με το Node.js. Δεν περιορίζεστε σε μία πλατφόρμα: το ίδιο bot μπορεί ουσιαστικά να λειτουργεί παντού.

Σύνδεση του πρώτου και του δεύτερου μεταξύ τους: Ο διακομιστής ιστού σας θα ρυθμίσει αυτά που ονομάζονται webhook - συνδέσεις που βασίζονται σε URL μεταξύ του bot σας και της πλατφόρμας συνομιλίας. Τα Webhook σάς επιτρέπουν να στέλνετε και να λαμβάνετε μηνύματα με ασφάλεια μέσω απλών αιτημάτων HTTP. Όλα τα γνωστά instant messenger παρέχουν στους προγραμματιστές λεπτομερείς οδηγούς για το πώς να συνδέσουν το bot τους στην πλατφόρμα τους.

Χαζά και έξυπνα bots

Ανάλογα με το πώς προγραμματίστηκαν συγκεκριμένα bots, μπορούμε να τα χωρίσουμε σε δύο μεγάλες ομάδες: εκείνες που εργάζονται σύμφωνα με προπαρασκευασμένες εντολές (χαζό) και εκμάθηση (έξυπνο).

Τα bot που βασίζονται σε εντολές λειτουργούν με βάση προκαθορισμένες λέξεις-κλειδιά που κατανοούν. Κάθε μία από αυτές τις εντολές πρέπει να γραφτεί ξεχωριστά από τον προγραμματιστή χρησιμοποιώντας κανονικές εκφράσεις ή άλλες μορφές ανάλυσης συμβολοσειρών. Εάν ο χρήστης κάνει μια ερώτηση χωρίς τη χρήση λέξεων-κλειδιών, το ρομπότ δεν μπορεί να την καταλάβει και, κατά κανόνα, απαντά με μηνύματα όπως «Συγγνώμη, δεν κατάλαβα».

Αν και η λειτουργικότητα τέτοιων bots είναι περιορισμένη, μπορεί να είναι πολύ αποτελεσματικά σε ορισμένες περιπτώσεις. Για παράδειγμα, όταν ο χρήστης χρειάζεται να επιλέξει ένα ή δύο στοιχεία από πολλά.

Τα εκπαιδευτικά ρομπότ βασίζονται στην τεχνητή νοημοσύνη για την επικοινωνία με τους χρήστες. Αντί για προπαρασκευασμένες απαντήσεις, το ρομπότ απαντά με επαρκείς προτάσεις για το θέμα. Επιπλέον, όλες οι λέξεις που εκφωνούνται στο bot και από το bot καταγράφονται για μεταγενέστερη επεξεργασία.

Η εργασία με την επεξεργασία φυσικής γλώσσας και τη μηχανική εκμάθηση δεν είναι εύκολη υπόθεση, ειδικά για αρχάριους. Ευτυχώς, δεν χρειάζεται να κάνετε όλη τη δουλειά αυτές τις μέρες, καθώς υπάρχει μια μεγάλη ποικιλία από εξαιρετικές βιβλιοθήκες (ConvNetJS, nlp_compromise, TextBlob) και υπηρεσίες (wit.ai, api.ai) που μπορούν να σας βοηθήσουν να διδάξετε τα ρομπότ σας δεξιότητες συνομιλίας.

Ξεκινώντας με τα chatbots

Αν καταφέραμε να σας εμπνεύσουμε να δημιουργήσετε το δικό σας chatbot, ακολουθούν μερικές συμβουλές που θα σας βοηθήσουν να ξεκινήσετε. Ανάλογα με το πόση δουλειά θέλετε να κάνετε, μπορείτε να κάνετε τα πάντα από την αρχή ή να χρησιμοποιήσετε διαφορετικά πλαίσια:

  • Το BotKit είναι το πιο δημοφιλές σύνολο εργαλείων για τη δημιουργία bots. Είναι ανοιχτού κώδικα και, επιπλέον, καλά τεκμηριωμένη.
  • Η Claudia είναι ένα πρόγραμμα δημιουργίας chatbot που έχει σχεδιαστεί για να χρησιμοποιείται απευθείας στο AWS Lambda.
  • Το Bottr είναι ένα πολύ απλό πλαίσιο γραμμένο στο Node.js με έτοιμη εφαρμογή για δοκιμή. Αν θέλετε να παίξετε με αυτό για 10 λεπτά, σας το προτείνουμε.

Αφού ολοκληρώσετε το bot σας, μπορείτε να το συνδέσετε σε μια συγκεκριμένη πλατφόρμα. Τα περισσότερα πλαίσια σάς επιτρέπουν να συνδεθείτε σε οποιαδήποτε από τις πλατφόρμες απρόσκοπτα, κάτι που είναι ένα τεράστιο πλεονέκτημα, καθώς διαφορετικές πλατφόρμες έχουν διαφορετικές διαδικασίες εγκατάστασης.

Εάν θέλετε να παραλείψετε ολόκληρη τη διαδικασία ανάπτυξης, μπορείτε να βασιστείτε σε μια σειρά από υπηρεσίες που έχουν κατασκευαστεί ειδικά για την ανάπτυξη chatbot.

Οι ενεργοί χρήστες του Telegram, ειδικά οι κάτοχοι εμπορικών σελίδων, έχουν μια λογική ερώτηση: πώς να φτιάξετε ένα bot για Telegrams; Τι δεξιότητες θα απαιτήσει αυτό;

Λίγα λόγια για τα bots

Τα bots είναι ειδικά ρομπότ προγραμματισμένα να εκτελούν ορισμένες ενέργειες, κυρίως «μηχανικούς» και παρόμοιους χειρισμούς. Για το κοινωνικό δίκτυο Telegram, είναι σημαντικό να προγραμματίσετε ένα bot για: αναζήτηση και φιλτράρισμα συγκεκριμένων δεδομένων, οργάνωση αλληλογραφίας για χρήστες σε οποιουσδήποτε κύκλους, μετάφραση πληροφοριών μεταξύ πολλών γλωσσών, δημιουργία μόνο ενδιαφέρουσες και σχετικές ροές ειδήσεων. Τα bots μπορούν ακόμη και να λειτουργήσουν ως AI σε παιχνίδια. Η λίστα των πιθανών λειτουργιών ρομπότ είναι πολύπλευρη.
Ορισμένοι τύποι bots είναι ικανοί να προσομοιώνουν πραγματική, πραγματική επικοινωνία. Δεν μπορούμε να πούμε ότι τέτοια ρομπότ είναι ιδιαίτερα ευφυή, αλλά οι εξελίξεις πραγματοποιούνται βήμα προς βήμα. Ίσως στο εγγύς μέλλον να είναι αδύνατο να γίνει διάκριση μεταξύ ενός bot και ενός πραγματικού προσώπου.

Δημιουργία bot για το Telegram

Πριν γράψετε ένα bot για το Telegram, είναι σημαντικό να θέσετε ξεκάθαρα έναν στόχο. Το πρώτο στάδιο είναι η κατάρτιση ενός σχεδίου των κύριων εργασιών που αντιμετωπίζει το πρόγραμμα. Ίσως αυτό στέλνει μηνύματα, καθημερινές ενημερώσεις των συναλλαγματικών ισοτιμιών και άλλα. Σε αυτή τη βάση θα συνταχθεί ο κώδικας.



Η σύνταξη ενός ρομπότ δεν απαιτεί πάντα γνώση γλωσσών προγραμματισμού Ιστού, μπορείτε να το κάνετε χωρίς αυτές τις πληροφορίες. Το μόνο μειονέκτημα της δεύτερης επιλογής είναι ότι το πρόγραμμα δεν μπορεί να βελτιστοποιηθεί αποτελεσματικά και μπορεί να εμφανιστούν κάποια εμπλοκή. Για να δημιουργήσετε ένα bot θα χρειαστείτε ένα ρομπότ - @BotFather. Αρχικά, θα χρειαστεί να προσθέσετε το bot στη λίστα επαφών σας και να ξεκινήσετε την εκκίνησή του.

Η σύνταξη ενός bot γίνεται σε στάδια:

  1. Εισάγοντας την εντολή /newbot – τώρα δημιουργείται το δικό σας νέο bot. Το ρομπότ συστήματος, BotFather, θα σας ζητήσει να εισαγάγετε ένα όνομα για το bot, πρέπει να είναι μοναδικό και να τελειώνει με 3 γράμματα - "bot".
  2. Εάν είναι επιθυμητό, ​​προστίθεται ένα avatar για το πρόγραμμα και μια περιγραφή των ενεργειών του ή πληροφορίες σχετικά με τον συγγραφέα.
  3. Σε αυτό το σημείο, ο BotFather προωθεί το προσαρμοσμένο διακριτικό API σας. Θα χρειαστείτε τον κωδικό στο μέλλον, επομένως πρέπει να τον αποθηκεύσετε κάπου για να μην τον χάσετε, γιατί είναι απίθανο να μπορείτε να τον θυμηθείτε.
  4. Τώρα το bot έχει δημιουργηθεί, αλλά η λειτουργικότητά του είναι ίση με 0. Για να διδάξετε το πρόγραμμα τουλάχιστον ορισμένες ενέργειες, είναι καλύτερο να χρησιμοποιήσετε προγραμματισμό, αλλά το Paquebot είναι επίσης κατάλληλο - ένας πόρος για τη δημιουργία ρομπότ σε κοινωνικά δίκτυα.
  5. Στη συνέχεια, πρέπει να προσθέσετε ένα άλλο bot - @Chatfuel και να το ενεργοποιήσετε.
  6. Για να ξεκινήσετε, πρέπει να εισαγάγετε το /addbot και μετά το διάστημα εισαγάγετε το διακριτικό που είχε προηγουμένως αποθηκευτεί προσεκτικά.
  7. Τώρα το bot έχει ήδη αποθηκευτεί στην υπηρεσία και μπορείτε να το χρησιμοποιήσετε απευθείας από εκεί. Η διεπαφή του προγράμματος είναι διαισθητική και οι εντολές ελέγχου απαιτούν ένα αρχικό επίπεδο Αγγλικών για να κατανοήσουν τον σκοπό τους. Υπάρχει ένας τεράστιος αριθμός λειτουργιών, επομένως δεν έχει νόημα να τις αναφέρουμε.
Χρησιμοποιώντας τις υπηρεσίες Paquebot, είναι πλέον δυνατή η διαχείριση όλων των λειτουργιών του δικού σας bot, απλώς εισάγετε βασικές εντολές. Για παράδειγμα, μπορείτε να δώσετε δικαιώματα διαχειριστή στο κανάλι ρομπότ και θα προσθέσει ανεξάρτητα νέα και θα ενημερώσει τη ροή. Επιπλέον, εδώ μπορείτε να διαμορφώσετε τις ενημερώσεις σε παράλληλα κοινωνικά δίκτυα

Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: