简体中文
wechatircd menyuntikkan JavaScript ( injector.js
) ke wx.qq.com, yang menggunakan WebSocket untuk berkomunikasi dengan server IRC ( wechatircd.py
), sehingga memungkinkan klien IRC yang terhubung ke server untuk mengirim dan menerima pesan dari WeChat, mengatur topik, mengundang /hapus anggota, ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
Diskusikan wechatircd dengan bergabung #wechatircd di freenode, atau grup pengguna di Telegram. Video tentang penggunaan WeChat di WeeChat
yaourt -S wechatircd-git
. Ini akan menghasilkan pasangan kunci/sertifikat CA yang ditandatangani sendiri /etc/wechatircd/ca.{cert,key}.pem
dan pasangan kunci/sertifikat {cert,key}.pem
(lihat di bawah)./etc/wechatircd/ca.cert.pem
ke browser (lihat di bawah).systemctl start wechatircd
, yang menjalankan /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. Anda mungkin ingin menyesuaikan /etc/systemd/system/wechatircd.service
. wechatircd.py
(server) akan mendengarkan pada 127.0.0.1:6667 (IRC) dan 127.0.0.1:9000 (HTTPS + WebSocket melalui TLS).
Jika Anda menjalankan server di komputer lain, disarankan untuk mengatur IRC melalui TLS dan kata sandi koneksi IRC dengan beberapa opsi lagi: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. Sebagai alternatif kata sandi koneksi IRC, Anda dapat menentukan --sasl-password yourpassword
dan mengautentikasi dengan SASL PLAIN. Anda dapat menggunakan kembali sertifikat+kunci HTTPS. Jika Anda menggunakan WeeChat dan merasa kesulitan untuk menyiapkan sertifikat yang valid (gnutls memeriksa nama host), ketikkan baris berikut di 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
ke browser../wechatircd.py --http-cert cert.pem --http-key key.pem
Alamat IP atau nama domain yang digunakan untuk melayani injector.js
dan injector.user.js
harus cocok dengan kolom subjectAlternativeName
. Chrome telah menghapus dukungan untuk pencocokan commonName
di sertifikat sejak versi 58. Lihat https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates untuk detailnya.
Krom/Kromium
chrome://settings/certificates
,import ca.cert.pem
,klik tab Authorities
, pilih sertifikat 127.0.0.1
, Edit->Percayai sertifikat ini untuk mengidentifikasi situs web.127.0.0.1:9000
jika Anda ingin wechatircd mendengarkan di alamat lain.Firefox
Server melayani koneksi injector.js
dan WebSocket pada 127.0.0.1:9000 secara default, yang dapat diganti dengan --http-listen 0.0.0.0 --http-port 9000
.
Anda dapat mengaktifkan HTTPS dengan dua cara:
--http-cert cert.pem --http-key key.pem
untuk membuat wechatircd melayani HTTPS--http-cert --http-key
untuk membuat wechatircd melayani HTTP, dan gunakan Nginx (dengan HTTPS diaktifkan) sebagai proxy terbalik. Dalam hal ini, Anda harus meneruskan Host:
ke wechatircd ( proxy_set_header Host $http_host;
) karena ini mengubah URL WebSocket yang ditentukan di injector.js
menurut Host:
yang ditentukan oleh browser. wechatircd.py
injector.run()
Anda akan bergabung dengan saluran +wechat
secara otomatis dan menemukan daftar kontak Anda di sana. Beberapa perintah tersedia:
help
eval
, eval ekspresi Python, seperti: eval server.nick2special_user
eval server.name2special_room
status
, tampilkan kontak/saluranreload_contact __all__
, muat ulang semua info kontak jika no such nick/channel
di privmsgServer hanya dapat terikat ke satu akun wx.qq.com, namun Anda mungkin memiliki lebih dari satu klien IRC yang terhubung ke server.
#
.&
. Nama saluran dihasilkan dari judul grup. SpecialChannel#update
+v
(suara, biasanya ditampilkan dengan awalan +
). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
akan dikonversi ke @GroupAlias0 @GroupAlias1 test
, dengan GroupAlias0
adalah My Alias in Group
/ Name
di profil/ WeChat ID
yang ditetapkan oleh pengguna tersebut. Ini sesuai dengan On-screen names
di aplikasi seluler.@1234 !m multinlinenreply
, yang akan dikirim sebagai 「Re GroupAlias: text」text
!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
jika Anda ingin mempersingkat URL media menjadi seperti https://127.0.0.1:9000/media/0
!m
, @3
, nick:
dapat diatur dalam urutan apa pun.
Untuk WeeChat, mekanisme anti-banjirnya akan mencegah dua pesan pengguna dikirim ke server IRC dalam waktu yang bersamaan. Nonaktifkan anti-banjir untuk mengaktifkan deteksi tempel.
/set irc.server.wechat.anti_flood_prio_high 0
ekstensi server-time
dari IRC versi 3.1, 3.2. wechatircd.py
menyertakan stempel waktu (diperoleh dari JavaScript) dalam pesan untuk memberi tahu klien IRC bahwa pesan tersebut terjadi pada waktu tertentu. Lihat http://ircv3.net/irc/. Lihathttp://ircv3.net/software/clients.html untuk dukungan Klien terhadap IRCv3.
Konfigurasi untuk 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"
Perintah IRC yang didukung:
/cap
, kemampuan yang didukung./dcc send $nick/$channel $filename
, kirim gambar atau file。Fitur ini meminjam perintah /dcc send
yang didukung dengan baik di klien IRC. Lihat https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
, undang kontak ke grup./kick $nick
, hapus anggota grup. Anda harus menjadi pemimpin kelompok untuk melakukan ini. Karena cacat pada klien Web, Anda mungkin tidak menerima pemberitahuan tentang perubahan anggota./kill $nick [$reason]
, menyebabkan koneksi klien tersebut ditutup/list
, daftar grup./mode +m
, tidak boleh bergabung kembali dalam --join new
. /mode -m
untuk kembali./motd
, lihat 5 komit terbaru dari repo ini/names
, perbarui nama panggilan di saluran./part [$channel]
, tidak lagi menerima pesan dari saluran. Ia hanya meminjam perintah /part
dan tidak akan keluar dari grup./query $nick
, buka jendela obrolan dengan $nick
./squit $any
, logout/summon $nick $message
,tambahkan kontak./topic topic
, mengubah topik grup. Karena IRC tidak mendukung penggantian nama saluran, Anda akan meninggalkan saluran dengan nama lama dan bergabung dengan saluran dengan nama baru./who $channel
, lihat daftar anggota.MSGTYPE_TEXT
,teks, atau undangan panggilan suara/videoMSGTYPE_IMG
,gambar, ditampilkan sebagai [Image] $url
MSGTYPE_VOICE
,audio, ditampilkan sebagai [Voice] $url
MSGTYPE_VIDEO
,video, ditampilkan sebagai [Video] $url
MSGTYPE_MICROVIDEO
,video mikro?,ditampilkan sebagai [MicroVideo] $url
MSGTYPE_APP
,artikel dari Akun Langganan, Paket Merah, URL, ..., ditampilkan sebagai [App] $title $url
Emoji QQ ditampilkan sebagai <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
, [Smile]
di pesan terkirim akan diganti menjadi emotikon .
Emoji dirender sebagai <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
. Setiap emoji akan dikonversi menjadi satu karakter sebelum dikirimkan ke klien IRC. Emoji mungkin tumpang tindih karena emulator terminal mungkin tidak mengetahui bahwa emoji memiliki lebar 2, lihat 终端模拟器下使用双倍宽度多色Emoji字体.
--config
, opsi singkat -c
, jalur file konfigurasi, lihat config--http-cert cert.pem
, sertifikat TLS untuk HTTPS/WebSocket. Anda dapat menggabungkan sertifikat+kunci, menentukan satu file PEM dan menghilangkan --http-key
. Gunakan HTTP jika --http-cert
atau --http-key
tidak ditentukan.--http-key key.pem
, kunci TLS untuk HTTPS/WebSocket--http-listen 127.1 ::1
, ubah alamat mendengarkan HTTPS/WebSocket menjadi 127.1
dan ::1
, ganti --listen
--http-port 9000
, ubah port mendengarkan HTTPS/WebSocket menjadi 9000--http-root .
, direktori root untuk melayani injector.js
--http-url https://127.0.0.1:9000
, jika ditentukan, tampilkan tautan media sebagai https://127.0.0.1:9000/document/$id ; jika tidak, https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
, jangan otomatis bergabung dengan saluran yang namanya (dihasilkan dari Nama Grup) sebagian cocok dengan regex &fo[o]
atau &bar
--ignore-display-name 'fo[o]' bar
, opsi pendek -I
, jangan otomatis bergabung dengan saluran yang Nama Grupnya sebagian cocok dengan regex fo[o]
atau bar
--ignore-brand
, abaikan pesan dari akun berlangganan ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
, sertifikat TLS untuk IRC melalui TLS. Anda dapat menggabungkan sertifikat+kunci, menentukan satu file PEM dan menghilangkan --irc-key
. Gunakan IRC biasa jika --irc-cert atau --irc-key tidak ditentukan.--irc-key key.pem
, kunci TLS untuk IRC melalui TLS.--irc-listen 127.1 ::1
, ubah alamat mendengarkan IRC menjadi 127.1
dan ::1
, ganti --listen
.--irc-nicks ray ray1
, julukan yang dihormati untuk klien. SpecialUser
tidak akan memiliki nick ini.--irc-password pass
, atur kata sandi koneksi menjadi pass
.--irc-port 6667
, port mendengarkan server IRC.-j
--join auto
, default: bergabung dengan saluran setelah menerima pesan pertama, tidak dapat bergabung kembali setelah mengeluarkan /part
dan menerima pesan nanti--join all
: bergabung dengan semua saluran--join manual
: tidak ada gabung otomatis--join new
: seperti auto
, tetapi bergabung kembali ketika pesan baru tiba meskipun setelah /part
--listen 127.0.0.1
, opsi singkat -l
, ubah alamat mendengarkan IRC/HTTP/WebSocket menjadi 127.0.0.1
.--logger-ignore '&test0' '&test1'
, daftar regex yang diabaikan, jangan mencatat kontak/grup yang namanya cocok sebagian--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
, format nama file log--logger-time-format %H:%M
, format waktu entri log sisi server--paste-wait 0.1
, baris akan ditahan hingga 0.1 detik sebelum dikirim, baris dalam interval ini akan dikemas ke pesan multiline--sasl-password pass
, atur kata sandi SASL menjadi pass
.--special-channel-prefix
, pilihan: &
, !
, #
, ##
, awalan untuk SpecialChannel. Quassel tampaknya tidak mendukung saluran dengan awalan &
, --special-channel-prefix '##'
untuk membuat Quassel senang Lihat wechatircd.service untuk templat /etc/systemd/system/wechatircd.service
.
injector.js
contactFactory#{addContact,deleteContact}
untuk melihat perubahan pada kontak.CtrlServer#onmessage
, menangani perintah (pesan teks/file, mengundang seseorang ke grup, ...) dari server.CtrlServer#seenLocalID
, mencegah klien menerima pesan yang dikirim sendiri. 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
Jika Anda tidak dapat menoleransi pemindaian kode QR dengan ponsel Anda setiap hari, lihat 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
UserName
beberapa akun khusus tidak memiliki awalan @
: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
。Nama UserName
akun standar dimulai dengan @
; UserName
Grup dimulai dengan @@
。 UserName
berbeda antar sesi. Uin
terlihat seperti pengidentifikasi unik, namun seringkali nilainya adalah 0. OwnerUin
grup adalah Uin
pemilik, namun seringkali Uin
adalah 0.
akun saya
angular . element ( document . body ) . scope ( ) . account
Daftar semua kontak
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
Hapus anggota dari grup
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
Kirim pesan ke obrolan saat ini
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
Jika Anda tidak dapat menoleransi pemindaian kode QR dengan ponsel Anda setiap hari, Anda dapat menjalankan browser dan wechatircd di server.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
, dan lakukan konfigurasi yang disebutkan di atas (sertifikat untuk injector.js
, Tampermonkey, injector.user.js
), lalu tutup peramban.xorg-server-xvfb
di 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
, ambil tangkapan layar dan pindai kode QR dengan aplikasi seluler Anda.Anda dapat berinteraksi dengan browser menggunakan VNC:
x11vnc -localhost -display :99
vncviewer localhost
Alternatifnya adalah x2go, lihat 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
Pada aplikasi seluler, On-screen Names
pengguna diselesaikan dalam urutan berikut:
Set Remark and Tag
jika disetelMy Alias in Group
( Group Alias
) jika disetelName
di profilnyaWeChat ID
Informasi kontak diberikan dalam API batchgetcontact
dan webwxsync
. Serialisasi JSON menggunakan nama bidang yang menyesatkan.
Teman WeChat di contactFactory#addContact
:
.Alias
: Name
di profilnya.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
Teman WeChat/non-kontak di .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
di profilnya atau WeChat ID
JSON untuk satu pengguna mungkin dikembalikan berulang kali dan semua bidang ini mungkin kosong. Torehan pengguna dihasilkan dengan mencari nilai pertama yang tidak kosong dari bidang berikut: .RemarkName
, .NickName
, .DisplayName
. Anda mungkin melihat xx now known as yy
di klien IRC Anda jika kontak ruangan berbagi beberapa ruangan dengan Anda.
Uncaught TypeError: angular.extend is not a function
Anda mungkin melihat pesan berikut di konsol 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
harus dijalankan setelah vendor_*.js
dan sebelum index_*.js
. Namun, TamperMonkey tidak dapat mengontrol waktu eksekusi dengan baik karena keterbatasan Chrome.
Koneksi WebSocket ke wechatircd.py
harus ditutup dalam kasus ini, beri tahu pengguna bahwa mereka harus memuat ulang halaman web.
:
) di WindowsPART (Change name)
JOIN
. Nama saluran dihasilkan dari .NickName
(Nama Grup) dan Nama Grup dapat berubah. Saya tidak mengetahui ID tetap akun/grup karena UserName
berubah di setiap sesi baru.