Όπως όλοι γνωρίζουμε, η Tencent χρησιμοποίησε το Activex για να εφαρμόσει τη γρήγορη σύνδεση QQ, χρησιμοποιώντας το σε ένα άγνωστο πρόγραμμα περιήγησης και το πρώτο πράγμα που έπρεπε να κάνει ήταν να εγκαταστήσει το στοιχείο ελέγχου QuickLogin.
Ακριβώς όταν δεν ξέρω πότε, η γρήγορη σύνδεση ξαφνικά δεν χρειάζεται τα χειριστήρια.
Εκείνη την εποχή, ήμουν πολύ μπερδεμένος, ποια περίεργη μέθοδο χρησιμοποίησε η Tencent για να αλληλεπιδράσει με τοπικές εφαρμογές;
Χωρίς πρόσθετα, οι ιστοσελίδες δεν θα πρέπει να μπορούν να αλληλεπιδρούν απευθείας με τοπικές εφαρμογές (εκτός εάν έχει οριστεί ένα πρωτόκολλο, αλλά μπορούν να κληθούν μόνο και όχι τα αποτελέσματα που παρέχονται από το πρόγραμμα).
Κατά τύχη (καλά, βαριέμαι να κοιτάζω τον διαχειριστή εργασιών και να ανακαλύπτω το εγγενές httpd και να βρίσκω τον Apache να εκτελείται), ξαφνικά συνειδητοποίησα μια πιθανότητα: εάν το QQ ανοίξει μια τοπική θύρα, δημιουργήσει έναν διακομιστή ιστού, δηλαδή έναν διακομιστή TCP που συμμορφώνεται με το πρωτόκολλο HTTP και, στη συνέχεια, η ιστοσελίδα ajax κάνει ένα αίτημα σε αυτό το QQ (αυτή τη στιγμή ως διακομιστής ιστού), μπορείτε να πάρετε το αποτέλεσμα;
Και αυτό είναι πραγματικά το αποτέλεσμα.
Το Web JS εκκινεί ένα αίτημα GET για να http://localhost.ptlogin2.qq.com (θύρες από 4300-4308, μία προς μία προς επιτυχία).
Ping θα διαπιστώσει ότι είναι 127.0.0.1 και όταν ελέγξετε τη θύρα, είναι πράγματι QQ σε χρήση.
Πρώτο αίτημα: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk από μπισκότα, ό,τι κι αν είναι. Το r είναι ένας τυχαίος αριθμός
Το αποτέλεσμα που επιστρέφεται είναι ένας πίνακας JSON:
var var_sso_uin_list=[{"account":"Συνδεδεμένος σε λογαριασμό QQ","face_index":-1,"gender":0,"nickname":"Το ψευδώνυμό σας QQ","uin":"Ακόμα ο λογαριασμός σας QQ","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB παράγραφος var_sso_uin_list)·
Στη συνέχεια, χρησιμοποιήστε http://ptlogin2.qq.com/getface για να λάβετε avatar QQ, τα οποία δεν θα συζητηθούν εδώ
Με αυτόν τον τρόπο οι πληροφορίες QQ σας μπορούν να εμφανίζονται στην ιστοσελίδα.
Όταν πατάτε το avatar σας (όταν επιλέγετε αυτή τη σύνδεση)
Δημιουργούνται τα ακόλουθα αιτήματα:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Ομοίως, το r είναι ένας τυχαίος αριθμός, pt_local_tk είναι από ένα cookie, local_token
Τι κάνει αυτό το αίτημα;
Λοιπόν, Set-Cookie.
Στη συνέχεια, προχωρήστε με το αίτημα
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
Το μόνο U1 εδώ είναι η διεύθυνση προορισμού
Αυτό το αίτημα θα επιστρέψει όλα τα cookies που χρειάζεστε και είστε συνδεδεμένοι.
Έτσι, μετά την εκμάθηση του πρωτοκόλλου, ανακαλύφθηκε ένα σοβαρό πρόβλημα: τι συμβαίνει εάν ένα (μαυρόκαρδο) πρόγραμμα κάνει αυτά τα πράγματα για λογαριασμό του χρήστη;
Ξεκινήστε τώρα!
Είχα μόνο ένα Mac στο χέρι, οπότε το έγραψα σε Obj-C.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" header:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Σημείωση: Λόγω της προηγούμενης εμπειρίας μου σε bots QQ (με βάση το πρωτόκολλο WebQQ): η κεφαλίδα Referer είναι πολύ σημαντική (πρέπει να είναι όνομα τομέα .qq.com), όταν είναι λάθος, σίγουρα θα αποτύχει. Άρα δεν υπάρχουν κυκλικοί κόμβοι εδώ
Παρεμπιπτόντως, ήμουν νέος στο Obj-C εκείνη την εποχή, και κάποιος από τον κώδικα μπορεί να φαίνεται λίγο ανόητος, συγχωρέστε με.
//cookiedata是个NSDictionary
Με αυτόν τον τρόπο, η σύνδεση ολοκληρώνεται και μπορείτε να βρείτε μια διεπαφή χώρου QQ (δεν δημοσιεύεται εδώ) και η ανάρτηση είναι επιτυχής.
Τι σημαίνει αυτό? Αυτό σημαίνει ότι εφόσον είναι ένα πρόγραμμα που εκτελείται τοπικά, υπάρχει η ευκαιρία να ολοκληρώσετε τη σύνδεση QQ αντί για εσάς και να κάνετε κάποιες ύπουλες λειτουργίες σε πλατφόρμες όπως το QQ space που δεν απαιτούν δευτερεύοντα έλεγχο ταυτότητας
|