简体中文
wechatircd injecte JavaScript ( injector.js
) dans wx.qq.com, qui utilise WebSocket pour communiquer avec un serveur IRC ( wechatircd.py
), permettant ainsi aux clients IRC connectés au serveur d'envoyer et de recevoir des messages de WeChat, de définir des sujets, d'inviter /supprimer des membres, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
Discutez de wechatircd en rejoignant #wechatircd sur freenode ou le groupe d'utilisateurs sur Telegram. Vidéo sur l'utilisation de WeChat dans WeeChat
yaourt -S wechatircd-git
. Il générera une paire clé/certificat CA auto-signée /etc/wechatircd/ca.{cert,key}.pem
et une paire clé/certificat {cert,key}.pem
(voir ci-dessous)./etc/wechatircd/ca.cert.pem
dans le navigateur (voir ci-dessous).systemctl start wechatircd
, qui exécute /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. Vous souhaiterez peut-être personnaliser /etc/systemd/system/wechatircd.service
. wechatircd.py
(le serveur) écoutera sur 127.0.0.1:6667 (IRC) et 127.0.0.1:9000 (HTTPS + WebSocket sur TLS).
Si vous exécutez le serveur sur une autre machine, il est recommandé de configurer IRC sur TLS et un mot de passe de connexion IRC avec quelques options supplémentaires : --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. Comme alternative au mot de passe de connexion IRC, vous pouvez spécifier --sasl-password yourpassword
et vous authentifier auprès de SASL PLAIN. Vous pouvez réutiliser le certificat HTTPS+la clé. Si vous utilisez WeeChat et que vous avez du mal à configurer un certificat valide (gnutls vérifie le nom d'hôte), tapez les lignes suivantes dans WeeChat :
/set irc.server.wechat.ssl on
/set irc.server.wechat.ssl_verify off
/set irc.server.wechat.password yourpassword
pip install -r requirements.txt
openssl req -x509 -newkey rsa:2048 -sha256 -nodes -keyout ca.key.pem -out ca.cert.pem -days 9999 -subj ' /CN=127.0.0.1 '
openssl req -new -newkey rsa:2048 -sha256 -nodes -keyout key.pem -subj ' /CN=127.0.0.1 ' |
openssl x509 -req -out cert.pem -CAkey ca.key.pem -CA ca.cert.pem -set_serial 2 -days 9999 -extfile <(
printf " subjectAltName = IP:127.0.0.1, DNS:localhost " )
ca.cert.pem
dans le navigateur../wechatircd.py --http-cert cert.pem --http-key key.pem
L'adresse IP ou le nom de domaine utilisé pour servir injector.js
et injector.user.js
doit correspondre aux champs subjectAlternativeName
. Chrome a supprimé la prise en charge de la correspondance commonName
dans les certificats depuis la version 58. Voir https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates pour plus de détails.
Chrome/Chrome
chrome://settings/certificates
, importez ca.cert.pem
, cliquez sur l'onglet Authorities
, sélectionnez le certificat 127.0.0.1
, Modifier-> Faire confiance à ce certificat pour identifier les sites Web.127.0.0.1:9000
si vous souhaitez que wechatircd écoute sur une autre adresse.Firefox
Le serveur dessert les connexions injector.js
et WebSocket sur 127.0.0.1:9000 par défaut, qui peuvent être remplacées par --http-listen 0.0.0.0 --http-port 9000
.
Vous pouvez activer HTTPS de deux manières :
--http-cert cert.pem --http-key key.pem
pour que wechatircd serve HTTPS--http-cert --http-key
pour que wechatircd serve HTTP et utilisez Nginx (avec HTTPS activé) comme proxy inverse. Dans ce cas, vous devez transmettre Host:
à wechatircd ( proxy_set_header Host $http_host;
) car cela modifie l'URL WebSocket définie dans injector.js
en fonction de Host:
spécifié par le navigateur. wechatircd.py
injector.run()
Vous rejoindrez automatiquement la chaîne +wechat
et y trouverez votre liste de contacts. Certaines commandes sont disponibles :
help
eval
, eval une expression Python, telle que : eval server.nick2special_user
eval server.name2special_room
status
, afficher les contacts/canauxreload_contact __all__
, recharge toutes les informations de contact en cas d' no such nick/channel
dans privmsgLe serveur ne peut être lié qu'à un seul compte wx.qq.com. Cependant, vous pouvez avoir plusieurs clients IRC connectés au serveur.
#
.&
. Le nom du canal est généré à partir du titre du groupe. SpecialChannel#update
+v
(voix, généralement affiché avec un préfixe +
). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
sera converti en @GroupAlias0 @GroupAlias1 test
, où GroupAlias0
est My Alias in Group
/ Name
dans le profil/ WeChat ID
défini par cet utilisateur. Cela correspond aux On-screen names
dans l'application mobile.@1234 !m multinlinenreply
, qui sera envoyé sous la forme 「Re GroupAlias: text」text
!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
si vous souhaitez raccourcir les URL des médias à quelque chose comme https://127.0.0.1:9000/media/0
!m
, @3
, nick:
peut être organisé dans n'importe quel ordre.
Pour WeeChat, son mécanisme anti-inondation empêchera que deux messages utilisateur soient envoyés au serveur IRC en même temps. Désactivez l’anti-inondation pour activer la détection de pâte.
/set irc.server.wechat.anti_flood_prio_high 0
extension server-time
à partir des versions IRC 3.1, 3.2. wechatircd.py
inclut l'horodatage (obtenu à partir de JavaScript) dans les messages pour indiquer aux clients IRC que le message s'est produit à l'heure indiquée. Voir http://ircv3.net/irc/. Voir http://ircv3.net/software/clients.html pour la prise en charge client d'IRCv3.
Configuration pour WeeChat :
/set irc.server_default.capabilities "account-notify,away-notify,cap-notify,multi-prefix,server-time,znc.in/server-time-iso,znc.in/self-message"
Commandes IRC prises en charge :
/cap
, fonctionnalités prises en charge./dcc send $nick/$channel $filename
, envoie une image ou un fichier.Cette fonctionnalité emprunte la commande /dcc send
qui est bien prise en charge dans les clients IRC. Voir https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
, invite un contact dans le groupe./kick $nick
, supprime un membre du groupe. Vous devez être le chef du groupe pour ce faire. En raison d'un défaut du client Web, il se peut que vous ne receviez pas de notifications concernant les changements de membres./kill $nick [$reason]
, provoque la fermeture de la connexion de ce client/list
, liste les groupes./mode +m
, pas de rejoin dans --join new
mode. /mode -m
pour revenir./motd
, afficher les 5 derniers commits de ce dépôt/names
, met à jour les pseudos dans la chaîne./part [$channel]
, ne reçoit plus de messages du canal. Il emprunte simplement la commande /part
et ne quittera pas le groupe./query $nick
, ouvrez une fenêtre de discussion avec $nick
./squit $any
, déconnectez-vous/summon $nick $message
, ajouter un contact./topic topic
, change le sujet d'un groupe. Comme IRC ne prend pas en charge le changement de nom d'un canal, vous quitterez le canal avec l'ancien nom et rejoindrez un canal avec le nouveau nom./who $channel
, voir la liste des membres.MSGTYPE_TEXT
, SMS ou invitation à un appel vocal/vidéoMSGTYPE_IMG
,image, affichée sous la forme [Image] $url
MSGTYPE_VOICE
,audio, affiché sous la forme [Voice] $url
MSGTYPE_VIDEO
,vidéo, affichée sous la forme [Video] $url
MSGTYPE_MICROVIDEO
,micro vidéo ?,affichée sous la forme [MicroVideo] $url
MSGTYPE_APP
,articles provenant de comptes d'abonnement, Red Packet, URL, ..., affichés sous la forme [App] $title $url
Les emojis QQ sont affichés sous la forme <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
, [Smile]
dans les messages envoyés sera remplacé par une émoticône .
Les émojis sont rendus sous la forme <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
. Chaque emoji sera converti en un seul caractère avant d'être livré au client IRC. Les émojis peuvent se chevaucher car les émulateurs de terminaux peuvent ne pas savoir que les émojis ont une largeur de 2, voir la section Emojis.
--config
, option courte -c
, chemin du fichier de configuration, voir config--http-cert cert.pem
, certificat TLS pour HTTPS/WebSocket. Vous pouvez concaténer certificat + clé, spécifier un seul fichier PEM et omettre --http-key
. Utilisez HTTP si ni --http-cert
ni --http-key
ne sont spécifiés.--http-key key.pem
, clé TLS pour HTTPS/WebSocket--http-listen 127.1 ::1
, change l'adresse d'écoute HTTPS/WebSocket en 127.1
et ::1
, en remplaçant --listen
--http-port 9000
, changez le port d'écoute HTTPS/WebSocket en 9000--http-root .
, le répertoire racine pour servir injector.js
--http-url https://127.0.0.1:9000
, si spécifié, affiche les liens multimédias sous la forme https://127.0.0.1:9000/document/$id ; sinon, https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, ne pas rejoindre automatiquement les chaînes dont les noms (générés à partir du nom du groupe) correspondent partiellement à l'expression régulière &fo[o]
ou &bar
--ignore-display-name 'fo[o]' bar
, option courte -I
, ne rejoint pas automatiquement les chaînes dont le nom de groupe correspond partiellement à l'expression régulière fo[o]
ou bar
--ignore-brand
, ignore les messages des comptes d'abonnement ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, certificat TLS pour IRC sur TLS. Vous pouvez concaténer certificat + clé, spécifier un seul fichier PEM et omettre --irc-key
. Utilisez un IRC simple si ni --irc-cert ni --irc-key ne sont spécifiés.--irc-key key.pem
, clé TLS pour IRC sur TLS.--irc-listen 127.1 ::1
, change l'adresse d'écoute IRC en 127.1
et ::1
, en remplaçant --listen
.--irc-nicks ray ray1
, pseudos révoqués pour les clients. SpecialUser
n’aura pas ces pseudos.--irc-password pass
, définissez le mot de passe de connexion sur pass
.--irc-port 6667
, port d'écoute du serveur IRC.-j
--join auto
, par défaut : rejoignez le canal dès la réception du premier message, pas de reconnexion après avoir émis /part
et reçu des messages plus tard--join all
: rejoindre toutes les chaînes--join manual
: pas de jointure automatique--join new
: comme auto
, mais rejoignez-nous lorsque de nouveaux messages arrivent même après /part
--listen 127.0.0.1
, option courte -l
, changez l'adresse d'écoute IRC/HTTP/WebSocket en 127.0.0.1
.--logger-ignore '&test0' '&test1'
, liste des expressions régulières ignorées, ne pas enregistrer les contacts/groupes dont les noms correspondent partiellement--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, format des noms de fichiers journaux--logger-time-format %H:%M
, format horaire des entrées du journal côté serveur--paste-wait 0.1
, les lignes seront conservées jusqu'à 0,1 seconde avant l'envoi, les lignes dans cet intervalle seront regroupées dans un message multiligne--sasl-password pass
, définissez le mot de passe SASL sur pass
.--special-channel-prefix
, choix : &
, !
, #
, ##
, préfixe de SpecialChannel. Quassel ne semble pas prendre en charge les chaînes avec les préfixes &
, --special-channel-prefix '##'
pour rendre Quassel heureux Voir wechatircd.service pour un modèle de /etc/systemd/system/wechatircd.service
.
injector.js
contactFactory#{addContact,deleteContact}
pour observer les modifications apportées aux contacts.CtrlServer#onmessage
, gérer les commandes (messages texte/fichier, inviter quelqu'un dans le groupe, ...) depuis le serveur.CtrlServer#seenLocalID
, empêche le client de recevoir les messages envoyés par lui-même. wechatircd.py
.
├── Web HTTP(s)/WebSocket server
├── Server IRC server
├── Channel
│ ├── StandardChannel IRC channels
│ ├── StatusChannel `+wechat`
│ └── SpecialChannel WeChat groups
├── (User)
│ ├── Client IRC clients
│ ├── SpecialUser WeChat users
├── (IRCCommands)
│ ├── UnregisteredCommands available commands: CAP NICK PASS USER QUIT
│ ├── RegisteredCommands
Si vous ne pouvez pas tolérer de scanner les codes QR avec votre téléphone tous les jours, consultez 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
UserName
de certains comptes spéciaux n'a pas le préfixe @
: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
. UserName
des comptes standard commence par @
; UserName
des groupes commence par @@
. UserName
sont différents selon les sessions. Uin
ressemble à un identifiant unique, mais la plupart du temps sa valeur est 0. OwnerUin
d'un groupe est l' Uin
des propriétaires, mais la plupart du temps, Uin
est 0.
Mon compte
angular . element ( document . body ) . scope ( ) . account
Liste de tous les contacts
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
Supprimer un membre d'un groupe
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
Envoyer un message au chat en cours
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
Si vous ne pouvez pas tolérer la numérisation quotidienne des codes QR avec votre téléphone, vous pouvez exécuter le navigateur et wechatircd sur un serveur.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
, et effectuez la configuration susmentionnée (certificat pour injector.js
, Tampermonkey, injector.user.js
), puis fermez le navigateur.xorg-server-xvfb
sur Arch Linux)xvfb-run -n 99 chromium --user-data-dir=$HOME/.config/chromium-wechatircd https://wx.qq.com
DISPLAY=:99 import -window root /tmp/a.jpg && $your_image_viewer /tmp/a.jpg
, prenez une capture d'écran et scannez le code QR avec votre application mobile.Vous pouvez interagir avec le navigateur à l'aide de VNC :
x11vnc -localhost -display :99
vncviewer localhost
Une alternative est x2go, voir la section IRC de QQ:wechatircd、webqqircd.
Sur l'application mobile, On-screen Names
des utilisateurs sont résolus dans cet ordre :
Set Remark and Tag
si définisMy Alias in Group
( Group Alias
) si définiName
dans son profilWeChat ID
Les informations de contact sont fournies dans les API batchgetcontact
et webwxsync
. La sérialisation JSON utilise des noms de champs trompeurs.
Ami WeChat dans contactFactory#addContact
:
.Alias
: Name
dans son profil.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
Ami/non-contact WeChat dans .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
dans son profil ou WeChat ID
JSON pour un utilisateur peut être renvoyé à plusieurs reprises et tous ces champs peuvent être vides. Les pseudos des utilisateurs sont générés en recherchant la première valeur non vide de ces champs : .RemarkName
, .NickName
, .DisplayName
. Vous pouvez voir xx now known as yy
dans votre client IRC si un contact de salle partage plusieurs salles avec vous.
Uncaught TypeError: angular.extend is not a function
Vous pouvez voir ces messages dans la console DevTools :
Uncaught TypeError: angular.extend is not a function
at Object.setUserInfo (index_0c7087d.js:4)
at index_0c7087d.js:2
at c (vendor_2de5d3a.js:11)
at vendor_2de5d3a.js:11
at c.$eval (vendor_2de5d3a.js:11)
at c.$digest (vendor_2de5d3a.js:11)
at c.$apply (vendor_2de5d3a.js:11)
at l (vendor_2de5d3a.js:11)
at m (vendor_2de5d3a.js:11)
at XMLHttpRequest.C.onreadystatechange (vendor_2de5d3a.js:11)
Uncaught TypeError: angular.forEach is not a function
injector.js
doit être exécuté après vendor_*.js
et avant index_*.js
. Cependant, TamperMonkey ne peut pas contrôler précisément le temps d'exécution en raison des limitations de Chrome.
La connexion WebSocket à wechatircd.py
doit être fermée dans ce cas, faites savoir aux utilisateurs qu'ils doivent recharger la page Web.
:
) sous WindowsPART (Change name)
JOIN
. Les noms de chaînes sont générés à partir de .NickName
(nom du groupe) et le nom du groupe peut changer. Je ne connais aucun identifiant persistant d'un compte/groupe car UserName
change à chaque nouvelle session.