简体中文
wechatircd fügt JavaScript ( injector.js
) in wx.qq.com ein, das WebSocket verwendet, um mit einem IRC-Server ( wechatircd.py
) zu kommunizieren und es so mit dem Server verbundenen IRC-Clients zu ermöglichen, Nachrichten von WeChat zu senden und zu empfangen, Themen festzulegen und einzuladen /Mitglieder löschen, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
Besprechen Sie wechatircd, indem Sie #wechatircd auf Freenode oder der Benutzergruppe auf Telegram beitreten. Video zur Verwendung von WeChat in WeeChat
yaourt -S wechatircd-git
. Es werden ein selbstsigniertes CA-Schlüssel/Zertifikat-Paar /etc/wechatircd/ca.{cert,key}.pem
und ein Schlüssel/Zertifikat-Paar {cert,key}.pem
generiert (siehe unten)./etc/wechatircd/ca.cert.pem
in den Browser (siehe unten).systemctl start wechatircd
, das /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. Möglicherweise möchten Sie /etc/systemd/system/wechatircd.service
anpassen. wechatircd.py
(der Server) überwacht 127.0.0.1:6667 (IRC) und 127.0.0.1:9000 (HTTPS + WebSocket über TLS).
Wenn Sie den Server auf einem anderen Rechner betreiben, empfiehlt es sich, IRC über TLS und ein IRC-Verbindungspasswort mit einigen weiteren Optionen einzurichten: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. Alternativ zum IRC-Verbindungspasswort können Sie --sasl-password yourpassword
angeben und sich mit SASL PLAIN authentifizieren. Sie können das HTTPS-Zertifikat+Schlüssel wiederverwenden. Wenn Sie WeeChat verwenden und Schwierigkeiten haben, ein gültiges Zertifikat einzurichten (gnutls prüft den Hostnamen), geben Sie die folgenden Zeilen in WeeChat ein:
/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
in den Browser../wechatircd.py --http-cert cert.pem --http-key key.pem
Die IP-Adresse oder der Domänenname, der zur Bereitstellung injector.js
und injector.user.js
verwendet wird, sollte mit den Feldern subjectAlternativeName
übereinstimmen. Chrome hat die Unterstützung für commonName
-Abgleich in Zertifikaten seit Version 58 entfernt. Weitere Informationen finden Sie unter https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates.
Chrom/Chrom
chrome://settings/certificates
, importieren Sie ca.cert.pem
, klicken Sie auf die Registerkarte Authorities
, wählen Sie das Zertifikat 127.0.0.1
aus und klicken Sie auf Bearbeiten->Diesem Zertifikat zur Identifizierung von Websites vertrauen.127.0.0.1:9000
ändern, wenn wechatircd eine andere Adresse abhören soll.Firefox
Der Server stellt injector.js
und WebSocket-Verbindungen standardmäßig auf 127.0.0.1:9000 bereit, was mit --http-listen 0.0.0.0 --http-port 9000
überschrieben werden kann.
Sie können HTTPS auf zwei Arten aktivieren:
--http-cert cert.pem --http-key key.pem
damit wechatircd HTTPS bereitstellt--http-cert --http-key
weg, damit wechatircd HTTP bereitstellt, und verwenden Sie Nginx (mit aktiviertem HTTPS) als Reverse-Proxy. In diesem Fall müssen Sie Host:
an wechatircd ( proxy_set_header Host $http_host;
) übergeben, da dadurch die injector.js
definierte WebSocket-URL entsprechend dem vom Browser angegebenen Host:
geändert wird. wechatircd.py
ausinjector.run()
aus. Sie werden automatisch +wechat
Kanal beitreten und finden dort Ihre Kontaktliste. Einige Befehle sind verfügbar:
help
eval
, eval einen Python-Ausdruck, wie zum Beispiel: eval server.nick2special_user
eval server.name2special_room
status
, Kontakte/Kanäle anzeigenreload_contact __all__
, alle Kontaktinformationen neu laden, falls no such nick/channel
in privmsg vorhanden istDer Server kann nur an ein wx.qq.com-Konto gebunden sein, es können jedoch mehr als ein IRC-Client mit dem Server verbunden sein.
#
beginnen.&
beginnen. Der Kanalname wird aus dem Gruppentitel generiert. SpecialChannel#update
+v
(Sprache, normalerweise mit einem Präfix +
angezeigt). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
wird in @GroupAlias0 @GroupAlias1 test
konvertiert, wobei GroupAlias0
My Alias in Group
/ Name
im Profil/die von diesem Benutzer festgelegte WeChat ID
ist. Es entspricht den On-screen names
in der mobilen Anwendung.@1234 !m multinlinenreply
, die als 「Re GroupAlias: text」text
gesendet wird!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
, wenn Sie Medien-URLs auf etwa https://127.0.0.1:9000/media/0
kürzen möchten !m
, @3
, nick:
kann in beliebiger Reihenfolge angeordnet werden.
Bei WeeChat verhindert der Anti-Flood-Mechanismus, dass zwei Benutzernachrichten gleichzeitig an den IRC-Server gesendet werden. Deaktivieren Sie den Überschwemmungsschutz, um die Pastenerkennung zu aktivieren.
/set irc.server.wechat.anti_flood_prio_high 0
server-time
von IRC Version 3.1, 3.2. wechatircd.py
fügt den Zeitstempel (von JavaScript erhalten) in Nachrichten ein, um IRC-Clients mitzuteilen, dass die Nachricht zum angegebenen Zeitpunkt aufgetreten ist. Siehe http://ircv3.net/irc/. Informationen zur Client-Unterstützung von IRCv3 finden Sie unter http://ircv3.net/software/clients.html.
Konfiguration für 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"
Unterstützte IRC-Befehle:
/cap
, unterstützte Funktionen./dcc send $nick/$channel $filename
, send image or file。Diese Funktion übernimmt den Befehl /dcc send
, der in IRC-Clients gut unterstützt wird. Siehe https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
, lade einen Kontakt zur Gruppe ein./kick $nick
, lösche ein Gruppenmitglied. Dazu müssen Sie der Gruppenleiter sein. Aufgrund des Defekts des Webclients erhalten Sie möglicherweise keine Benachrichtigungen über den Mitgliederwechsel./kill $nick [$reason]
, bewirkt, dass die Verbindung dieses Clients geschlossen wird/list
, Gruppen auflisten./mode +m
, kein erneuter Beitritt im --join new
. /mode -m
zum Zurücksetzen./motd
, die letzten 5 Commits dieses Repos anzeigen/names
, Nicks im Kanal aktualisieren./part [$channel]
, keine Nachrichten mehr vom Kanal empfangen. Es übernimmt lediglich den Befehl /part
und verlässt die Gruppe nicht./query $nick
, öffne ein Chatfenster mit $nick
./squit $any
, abmelden/summon $nick $message
,Kontakt hinzufügen./topic topic
, das Thema einer Gruppe ändern. Da IRC das Umbenennen eines Kanals nicht unterstützt, verlassen Sie den Kanal mit dem alten Namen und treten einem Kanal mit dem neuen Namen bei./who $channel
, siehe Mitgliederliste.MSGTYPE_TEXT
,Text oder Einladung zu einem Sprach-/VideoanrufMSGTYPE_IMG
,Bild, angezeigt als [Image] $url
MSGTYPE_VOICE
,Audio, angezeigt als [Voice] $url
MSGTYPE_VIDEO
,Video, angezeigt als [Video] $url
MSGTYPE_MICROVIDEO
,Mikrovideo?,angezeigt als [MicroVideo] $url
MSGTYPE_APP
,Artikel aus Abonnementkonten, Red Packet, URL, ..., angezeigt als [App] $title $url
QQ-Emojis werden als <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
angezeigt. [Smile]
in gesendeten Nachrichten wird durch ein Emoticon ersetzt .
Emojis werden als <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
gerendert. Jedes Emoji wird in ein einzelnes Zeichen umgewandelt, bevor es an den IRC-Client übermittelt wird. Emojis können sich überlappen, da Terminalemulatoren möglicherweise nicht wissen, dass Emojis die Breite 2 haben.
--config
, kurze Option -c
, Pfad der Konfigurationsdatei, siehe Konfiguration--http-cert cert.pem
, TLS-Zertifikat für HTTPS/WebSocket. Sie können Zertifikat+Schlüssel verketten, eine einzelne PEM-Datei angeben und --http-key
weglassen. Verwenden Sie HTTP, wenn weder --http-cert
noch --http-key
angegeben ist.--http-key key.pem
, TLS-Schlüssel für HTTPS/WebSocket--http-listen 127.1 ::1
, ändern Sie die HTTPS/WebSocket-Listenadresse in 127.1
und ::1
und überschreiben Sie --listen
--http-port 9000
, HTTPS/WebSocket-Listen-Port auf 9000 ändern--http-root .
, das Stammverzeichnis zur Bereitstellung injector.js
--http-url https://127.0.0.1:9000
, falls angegeben, Medienlinks als https://127.0.0.1:9000/document/$id anzeigen; Wenn nicht, https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, Kanäle nicht automatisch beitreten, deren Namen (aus dem Gruppennamen generiert) teilweise mit dem regulären Ausdruck &fo[o]
oder &bar
übereinstimmen--ignore-display-name 'fo[o]' bar
, kurze Option -I
, Kanäle nicht automatisch verbinden, deren Gruppenname teilweise mit dem regulären Ausdruck fo[o]
oder bar
übereinstimmt--ignore-brand
, Nachrichten von Abonnementkonten ignorieren ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, TLS-Zertifikat für IRC über TLS. Sie können Zertifikat+Schlüssel verketten, eine einzelne PEM-Datei angeben und --irc-key
weglassen. Verwenden Sie einfachen IRC, wenn weder --irc-cert noch --irc-key angegeben ist.--irc-key key.pem
, TLS-Schlüssel für IRC über TLS.--irc-listen 127.1 ::1
, IRC-Listenadresse in 127.1
und ::1
ändern und dabei --listen
überschreiben.--irc-nicks ray ray1
, verehrte Spitznamen für Kunden. SpecialUser
wird diese Spitznamen nicht haben.--irc-password pass
, setzt das Verbindungspasswort auf pass
.--irc-port 6667
, IRC-Server-Abhörport.-j
--join auto
, Standard: Treten Sie dem Kanal beim Empfang der ersten Nachricht bei, kein erneuter Beitritt nach der Ausgabe von /part
und dem späteren Empfang von Nachrichten--join all
: allen Kanälen beitreten--join manual
: kein automatischer Beitritt--join new
: wie auto
, aber wieder beitreten, wenn neue Nachrichten eintreffen, auch wenn nach /part
--listen 127.0.0.1
, kurze Option -l
, ändern Sie die IRC/HTTP/WebSocket-Abhöradresse in 127.0.0.1
.--logger-ignore '&test0' '&test1'
, Liste der ignorierten regulären Ausdrücke, keine Kontakte/Gruppen protokollieren, deren Namen teilweise übereinstimmen--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, Format der Protokolldateinamen--logger-time-format %H:%M
, Zeitformat der Einträge des serverseitigen Protokolls--paste-wait 0.1
, Zeilen werden vor dem Senden bis zu 0,1 Sekunden lang gehalten, Zeilen in diesem Intervall werden zu einer mehrzeiligen Nachricht gepackt--sasl-password pass
, setzt das SASL-Passwort auf pass
.--special-channel-prefix
, Auswahlmöglichkeiten: &
, !
, #
, ##
, Präfix für SpecialChannel. Quassel scheint keine Kanäle mit den Präfixen &
, --special-channel-prefix '##'
zu unterstützen, um Quassel glücklich zu machen Eine Vorlage für /etc/systemd/system/wechatircd.service
finden Sie unter wechatircd.service.
injector.js
contactFactory#{addContact,deleteContact}
um Änderungen an den Kontakten zu beobachten.CtrlServer#onmessage
, verarbeitet Befehle (Text-/Dateinachrichten, jemanden zur Gruppe einladen, ...) vom Server.CtrlServer#seenLocalID
, verhindert, dass der Client von ihm selbst gesendete Nachrichten empfängt. 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
Wenn Sie es nicht ertragen, jeden Tag QR-Codes mit Ihrem Telefon zu scannen, schauen Sie sich den Link zum IRC-Konto an. QQ: wechatircd, webqqircd.
Der UserName
einiger Spezialkonten hat kein @
-Präfix: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
。Der UserName
von Standardkonten beginnt mit @
; UserName
der Gruppe beginnt mit @@
. UserName
unterscheidet sich je nach Sitzung. Uin
sieht aus wie ein eindeutiger Bezeichner, aber meistens ist sein Wert 0. OwnerUin
einer Gruppe ist der Uin
des Besitzers, aber meistens ist Uin
0.
Mein Konto
angular . element ( document . body ) . scope ( ) . account
Liste aller Kontakte
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
Ein Mitglied aus einer Gruppe löschen
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
Senden Sie eine Nachricht an den aktuellen Chat
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
Wenn Sie es nicht ertragen, jeden Tag QR-Codes mit Ihrem Telefon zu scannen, können Sie den Browser und Wechatircd auf einem Server ausführen.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
, führen Sie die oben genannte Konfiguration durch (Zertifikat für injector.js
, Tampermonkey, injector.user.js
) und schließen Sie dann Browser.xorg-server-xvfb
unter 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
, machen Sie einen Screenshot und scannen Sie den QR-Code mit Ihrer mobilen Anwendung.Sie können über VNC mit dem Browser interagieren:
x11vnc -localhost -display :99
vncviewer localhost
Eine Alternative ist x2go, siehe 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
In der mobilen Anwendung werden On-screen Names
der Benutzer in dieser Reihenfolge aufgelöst:
Set Remark and Tag
falls festgelegtMy Alias in Group
( Group Alias
), falls festgelegtName
in seinem/ihrem ProfilWeChat ID
Kontaktinformationen werden in den APIs „ batchgetcontact
und webwxsync
bereitgestellt. Die JSON-Serialisierung verwendet irreführende Feldnamen.
WeChat-Freund in contactFactory#addContact
:
.Alias
: Name
in seinem/ihrem Profil.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
WeChat-Freund/Nichtkontakt in .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
in seinem/ihrem Profil oder WeChat ID
JSON für einen Benutzer kann wiederholt zurückgegeben werden und alle diese Felder sind möglicherweise leer. Benutzernamen werden generiert, indem nach dem ersten nicht leeren Wert in diesen Feldern gesucht wird: .RemarkName
, .NickName
, .DisplayName
. Möglicherweise xx now known as yy
wenn ein Raumkontakt mehrere Räume mit Ihnen teilt.
Uncaught TypeError: angular.extend is not a function
Möglicherweise werden diese Meldungen in der DevTools-Konsole angezeigt:
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
sollte nach vendor_*.js
und vor index_*.js
ausgeführt werden. Allerdings kann TamperMonkey aufgrund der Einschränkung von Chrome die Ausführungszeit nicht genau steuern.
In diesem Fall sollte die WebSocket-Verbindung zu wechatircd.py
geschlossen werden. Teilen Sie den Benutzern mit, dass sie die Webseite neu laden sollten.
:
) enthaltenPART (Change name)
JOIN
Nachrichten abgelenkt. Kanalnamen werden aus .NickName
(Gruppenname) generiert und der Gruppenname kann sich ändern. Ich kenne keine dauerhafte ID eines Kontos/einer Gruppe, da sich UserName
in jeder neuen Sitzung ändert.