简体中文
يقوم wechatircd بإدخال JavaScript ( injector.js
) إلى wx.qq.com، والذي يستخدم WebSocket للتواصل مع خادم IRC ( wechatircd.py
)، وبالتالي تمكين عملاء IRC المتصلين بالخادم من إرسال واستقبال الرسائل من WeChat، وتعيين المواضيع، والدعوة. / حذف الأعضاء ...
IRC WebSocket HTTPS
IRC client --- wechatircd.py --------- browser ----- wx.qq.com
injector.user.js
injector.js
ناقش wechatircd من خلال الانضمام إلى #wechatircd على freenode، أو مجموعة المستخدمين على Telegram. فيديو حول استخدام WeChat في WeeChat
yaourt -S wechatircd-git
. سيقوم بإنشاء زوج مفتاح/شهادة CA موقّع ذاتيًا /etc/wechatircd/ca.{cert,key}.pem
وزوج مفتاح/شهادة {cert,key}.pem
(انظر أدناه)./etc/wechatircd/ca.cert.pem
إلى المتصفح (انظر أدناه).systemctl start wechatircd
، الذي يقوم بتشغيل /usr/bin/wechatircd --http-cert /etc/wechatircd/cert.pem --http-key /etc/wechatircd/key.pem --http-root /usr/share/wechatircd
. قد ترغب في تخصيص /etc/systemd/system/wechatircd.service
. سيستمع wechatircd.py
(الخادم) إلى 127.0.0.1:6667 (IRC) و127.0.0.1:9000 (HTTPS + WebSocket عبر TLS).
إذا قمت بتشغيل الخادم على جهاز آخر، فمن المستحسن إعداد IRC عبر TLS وكلمة مرور اتصال IRC مع بعض الخيارات الإضافية: --irc-cert /path/to/irc.key --irc-key /path/to/irc.cert --irc-password yourpassword
. كبديل لكلمة مرور اتصال IRC، يمكنك تحديد --sasl-password yourpassword
والمصادقة باستخدام SASL PLAIN. يمكنك إعادة استخدام شهادة HTTPS+مفتاح. إذا كنت تستخدم WeeChat وتجد صعوبة في إعداد شهادة صالحة (يقوم gnutls بالتحقق من اسم المضيف)، فاكتب الأسطر التالية في 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
إلى المتصفح../wechatircd.py --http-cert cert.pem --http-key key.pem
يجب أن يتطابق عنوان IP أو اسم المجال المستخدم لخدمة injector.js
و injector.user.js
مع حقول subjectAlternativeName
. لقد أزال Chrome دعم مطابقة commonName
في الشهادات منذ الإصدار 58. راجع https://developers.google.com/web/updates/2017/03/chrome-58-deprecations#remove_support_for_commonname_matching_in_certificates لمزيد من التفاصيل.
كروم/كروم
chrome://settings/certificates
، وقم باستيراد ca.cert.pem
، وانقر فوق علامة التبويب Authorities
، وحدد شهادة 127.0.0.1
، ثم تحرير->الوثوق بهذه الشهادة لتحديد مواقع الويب.127.0.0.1:9000
إذا كنت تريد أن يستمع wechatircd إلى عنوان آخر.فايرفوكس
يخدم الخادم اتصالات injector.js
وWebSocket على 127.0.0.1:9000 افتراضيًا، والتي يمكن تجاوزها باستخدام --http-listen 0.0.0.0 --http-port 9000
.
يمكنك تمكين HTTPS بطريقتين:
--http-cert cert.pem --http-key key.pem
لجعل wechatircd يخدم HTTPS--http-cert --http-key
لجعل wechatircd يخدم HTTP، واستخدم Nginx (مع تمكين HTTPS) كوكيل عكسي. في هذه الحالة، تحتاج إلى تمرير Host:
إلى wechatircd ( proxy_set_header Host $http_host;
) لأنه يغير عنوان URL لـ WebSocket المحدد في injector.js
وفقًا Host:
المحدد بواسطة المتصفح. wechatircd.py
injector.run()
ستنضم إلى قناة +wechat
تلقائيًا وستجد قائمة جهات الاتصال الخاصة بك هناك. بعض الأوامر متاحة:
help
eval
، تقييم تعبير بايثون، مثل: eval server.nick2special_user
eval server.name2special_room
status
، إظهار جهات الاتصال/القنواتreload_contact __all__
، أعد تحميل جميع معلومات الاتصال في حالة no such nick/channel
في privmsgيمكن ربط الخادم بحساب wx.qq.com واحد فقط، ومع ذلك، قد يكون لديك أكثر من عميل IRC متصل بالخادم.
#
.&
. يتم إنشاء اسم القناة من عنوان المجموعة. SpecialChannel#update
+v
(الصوت، يُعرض عادةً ببادئة +
). SpecialChannel#update_detail
!m line0nline1
!html line0<br>line1
nick0: nick1: test
إلى @GroupAlias0 @GroupAlias1 test
، حيث GroupAlias0
هو My Alias in Group
/ Name
في الملف الشخصي / WeChat ID
الذي تم تعيينه بواسطة هذا المستخدم. وهو يتوافق مع On-screen names
في تطبيق الهاتف المحمول.@1234 !m multinlinenreply
، والذي سيتم إرساله كـ 「Re GroupAlias: text」text
!m @123456 multinlinenreply
@2 reply
--http-url https://127.0.0.1:9000
إذا كنت تريد تقصير عناوين URL للوسائط إلى شيء مثل https://127.0.0.1:9000/media/0
!m
, @3
, nick:
يمكن ترتيبها بأي ترتيب.
بالنسبة لـ WeeChat، فإن آلية مكافحة الفيضانات الخاصة بها ستمنع إرسال رسالتين للمستخدم إلى خادم IRC في نفس الوقت. قم بتعطيل مقاومة الفيضانات لتمكين اكتشاف اللصق.
/set irc.server.wechat.anti_flood_prio_high 0
تمديد server-time
من IRC الإصدار 3.1، 3.2. يتضمن wechatircd.py
الطابع الزمني (الذي تم الحصول عليه من JavaScript) في الرسائل لإخبار عملاء IRC بأن الرسالة حدثت في الوقت المحدد. انظر http://ircv3.net/irc/. راجع http://ircv3.net/software/clients.html للحصول على دعم عملاء IRCv3.
تكوين 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"
أوامر IRC المدعومة:
/cap
، الإمكانات المدعومة./dcc send $nick/$channel $filename
أو إرسال صورة أو ملف. هذه الميزة تستعير الأمر /dcc send
وهو مدعوم جيدًا في عملاء IRC. راجع https://en.wikipedia.org/wiki/Direct_Client-to-Client#DCC_SEND./invite $nick [$channel]
، قم بدعوة جهة اتصال إلى المجموعة./kick $nick
، حذف عضو في المجموعة. يجب أن تكون قائد المجموعة للقيام بذلك. نظرًا لوجود خلل في عميل الويب، قد لا تتلقى إخطارات حول تغيير الأعضاء./kill $nick [$reason]
، يتسبب في إغلاق الاتصال بهذا العميل/list
، مجموعات القائمة./mode +m
، لا يجوز الانضمام مرة أخرى إلى --join new
. /mode -m
للعودة./motd
، اعرض آخر 5 عمليات تنفيذ لهذا الريبو/names
، قم بتحديث الألقاب في القناة./part [$channel]
، لم يعد يتلقى رسائل من القناة. إنه يستعير فقط الأمر /part
ولن يغادر المجموعة./query $nick
، افتح نافذة الدردشة مع $nick
./squit $any
، قم بتسجيل الخروج/summon $nick $message
، إضافة جهة اتصال./topic topic
، قم بتغيير موضوع المجموعة. نظرًا لأن IRC لا يدعم إعادة تسمية القناة، فسوف تترك القناة بالاسم القديم وتنضم إلى قناة بالاسم الجديد./who $channel
، راجع قائمة الأعضاء.MSGTYPE_TEXT
، رسالة نصية أو دعوة لإجراء مكالمة صوتية/فيديوMSGTYPE_IMG
، الصورة، معروضة كـ [Image] $url
MSGTYPE_VOICE
، صوت، يتم عرضه كـ [Voice] $url
MSGTYPE_VIDEO
، فيديو، يتم عرضه كـ [Video] $url
MSGTYPE_MICROVIDEO
، فيديو صغير؟، يتم عرضه كـ [MicroVideo] $url
MSGTYPE_APP
، مقالات من حسابات الاشتراك، الحزمة الحمراء، عنوان URL، ...، يتم عرضها كـ [App] $title $url
يتم عرض رموز QQ التعبيرية على هيئة <img class="qqemoji qqemoji0" text="[Smile]_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
، وسيتم استبدال [Smile]
في الرسائل المرسلة بالرموز التعبيرية .
يتم عرض الرموز التعبيرية على هيئة <img class="emoji emoji1f604" text="_web" src="/zh_CN/htmledition/v2/images/spacer.gif">
. سيتم تحويل كل رمز تعبيري إلى حرف واحد قبل تسليمه إلى عميل IRC. قد تتداخل الرموز التعبيرية لأن المحاكيات الطرفية قد لا تعرف أن عرض الرموز التعبيرية 2، راجع 终端模拟器下使用双倍宽度多色Emoji字体.
--config
، الخيار القصير -c
، مسار ملف التكوين، راجع config--http-cert cert.pem
، شهادة TLS لـ HTTPS/WebSocket. يمكنك ربط الشهادة+المفتاح وتحديد ملف PEM واحد وحذف --http-key
. استخدم HTTP إذا لم يتم تحديد --http-cert
أو --http-key
.--http-key key.pem
، مفتاح TLS لـ HTTPS/WebSocket--http-listen 127.1 ::1
، غيّر عنوان الاستماع HTTPS/WebSocket إلى 127.1
و ::1
، تجاوز --listen
--http-port 9000
، قم بتغيير منفذ الاستماع HTTPS/WebSocket إلى 9000--http-root .
، الدليل الجذر لخدمة injector.js
--http-url https://127.0.0.1:9000
، إذا تم تحديده، اعرض روابط الوسائط كـ https://127.0.0.1:9000/document/$id ؛ إذا لم يكن الأمر كذلك، https://wx.qq.com/cgi-bin/...
--ignore '&fo[o]' '&bar'
، لا تنضم تلقائيًا إلى القنوات التي تتطابق أسماؤها (التي تم إنشاؤها من اسم المجموعة) جزئيًا مع التعبير العادي &fo[o]
أو &bar
--ignore-display-name 'fo[o]' bar
، الخيار القصير -I
، لا تنضم تلقائيًا إلى القنوات التي يتطابق اسم مجموعتها جزئيًا مع regex fo[o]
أو bar
--ignore-brand
، تجاهل الرسائل من حسابات الاشتراك ( MM_USERATTRVERIFYFALG_BIZ_BRAND
)--irc-cert cert.pem
، شهادة TLS لـ IRC عبر TLS. يمكنك ربط الشهادة+المفتاح وتحديد ملف PEM واحد وحذف --irc-key
. استخدم IRC العادي إذا لم يتم تحديد --irc-cert أو --irc-key.--irc-key key.pem
، مفتاح TLS لـ IRC عبر TLS.--irc-listen 127.1 ::1
، قم بتغيير عنوان استماع IRC إلى 127.1
و ::1
، متجاوزًا --listen
.--irc-nicks ray ray1
، النكات المبجلة للعملاء. لن يكون لدى SpecialUser
هذه الألقاب.--irc-password pass
، قم بتعيين كلمة مرور الاتصال pass
.--irc-port 6667
، منفذ الاستماع لخادم IRC.-j
--join auto
، افتراضي: انضم إلى القناة عند استلام الرسالة الأولى، ولا يجوز إعادة الانضمام بعد إصدار /part
واستلام الرسائل لاحقًا--join all
: الانضمام إلى جميع القنوات--join manual
: لا يوجد انضمام تلقائي--join new
: مثل auto
، ولكن أعد الانضمام عند وصول رسائل جديدة حتى لو بعد /part
--listen 127.0.0.1
، الخيار القصير -l
، قم بتغيير عنوان الاستماع IRC/HTTP/WebSocket إلى 127.0.0.1
.--logger-ignore '&test0' '&test1'
، قائمة regex التي تم تجاهلها، لا تقم بتسجيل جهات الاتصال/المجموعات التي تتطابق أسماؤها جزئيًا--logger-mask '/tmp/wechat/$channel/%Y-%m-%d.log'
، تنسيق أسماء ملفات السجل--logger-time-format %H:%M
، تنسيق الوقت لإدخالات السجل من جانب الخادم--paste-wait 0.1
، سيتم تعليق الأسطر لمدة تصل إلى 0.1 ثانية قبل الإرسال، وسيتم تعبئة الأسطر الموجودة في هذا الفاصل الزمني في رسالة متعددة الأسطر--sasl-password pass
، قم بتعيين كلمة مرور SASL pass
.--special-channel-prefix
، الاختيارات: &
!
, #
, ##
, بادئة لـ SpecialChannel. يبدو أن Quassel لا يدعم القنوات ذات البادئات &
، --special-channel-prefix '##'
لإسعاد Quassel راجع wechatircd.service للحصول على قالب /etc/systemd/system/wechatircd.service
.
injector.js
contactFactory#{addContact,deleteContact}
لمشاهدة التغييرات التي تطرأ على جهات الاتصال.CtrlServer#onmessage
، التعامل مع الأوامر (رسائل نصية/ملفات، دعوة شخص ما إلى المجموعة، ...) من الخادم.CtrlServer#seenLocalID
، يمنع العميل من تلقي الرسائل المرسلة بنفسه. 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
إذا كنت لا تستطيع تحمل مسح رموز QR بهاتفك كل يوم، فراجع 无需每日扫码的IRC版微信和QQ:wechatircd、webqqircd.
لا يحتوي UserName
لبعض الحسابات الخاصة على البادئة @
: newsapp,fmessage,filehelper,weibo,qqmail,fmessage
. يبدأ UserName
للحسابات القياسية بـ @
؛ يبدأ UserName
المجموعات بـ @@
. يختلف UserName
بين الجلسات. يبدو Uin
كمعرف فريد، ولكن في معظم الأحيان تكون قيمته 0. OwnerUin
للمجموعة هو Uin
للمالكين، ولكن في معظم الأحيان يكون Uin
0.
حسابي
angular . element ( document . body ) . scope ( ) . account
قائمة بجميع جهات الاتصال
angular . element ( $ ( '#navContact' ) [ 0 ] ) . scope ( ) . allContacts
حذف عضو من المجموعة
var injector = angular . element ( document ) . injector ( )
# 这里获取了chatroomFactory,还可用于获取其他factory、service、controller等
var chatroomFactory = injector . get ( 'chatroomFactory' )
# 设置其中的`room`与`userToRemove`
chatroomFactory . delMember ( room . UserName , userToRemove . UserName ) `
إرسال رسالة إلى الدردشة الحالية
angular . element ( 'pre:last' ) . scope ( ) . editAreaCtn = "Hello,微信" ;
angular . element ( 'pre:last' ) . scope ( ) . sendTextMessage ( ) ;
إذا كنت لا تستطيع تحمل مسح رموز QR بهاتفك كل يوم، فيمكنك تشغيل المتصفح وwechatircd على الخادم.
chromium --user-data-dir=$HOME/.config/chromium-wechatircd
، وقم بإجراء التكوين المذكور أعلاه (شهادة لـ injector.js
، وTampermonkey، injector.user.js
)، ثم أغلق الملف browser.xorg-server-xvfb
على نظام 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
، التقط لقطة شاشة وامسح رمز QR ضوئيًا باستخدام تطبيق الهاتف المحمول الخاص بك.يمكنك التفاعل مع المتصفح باستخدام VNC:
x11vnc -localhost -display :99
vncviewer localhost
البديل هو x2go، راجع 无需每日扫码的IRC版微信وQQ:wechatircd、webqqircd.
في تطبيق الهاتف المحمول، يتم حل On-screen Names
بهذا الترتيب:
Set Remark and Tag
إذا تم ضبطهاMy Alias in Group
( Group Alias
) إذا تم تعيينهName
في ملفه الشخصيWeChat ID
يتم توفير معلومات الاتصال في واجهات برمجة التطبيقات batchgetcontact
و webwxsync
. يستخدم تسلسل JSON أسماء حقول مضللة.
صديق WeChat في contactFactory#addContact
:
.Alias
: Name
الموجود في ملفه الشخصي.NickName
: WeChat ID
.RemarkName
: Set Remark and Tag
صديق WeChat/عدم الاتصال في .MemberList
:
.DisplayName
: My Alias in Group
.NickName
: Name
الموجود في ملفه الشخصي أو WeChat ID
قد يتم إرجاع JSON لمستخدم واحد بشكل متكرر وقد تكون جميع هذه الحقول فارغة. يتم إنشاء ألقاب المستخدمين من خلال البحث عن القيمة الأولى غير الفارغة من هذه الحقول: .RemarkName
و .NickName
و .DisplayName
. قد ترى xx now known as yy
في عميل IRC الخاص بك إذا كانت جهة اتصال الغرفة تشاركك غرفًا متعددة.
Uncaught TypeError: angular.extend is not a function
قد ترى هذه الرسائل في وحدة تحكم 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
بعد vendor_*.js
وقبل index_*.js
. ومع ذلك، لا يستطيع TamperMonkey التحكم بدقة في وقت التنفيذ بسبب القيود المفروضة على Chrome.
يجب إغلاق اتصال WebSocket بـ wechatircd.py
في هذه الحالة، لإعلام المستخدمين بأنه يجب عليهم إعادة تحميل صفحة الويب.
:
) على نظام التشغيل WindowsPART (Change name)
JOIN
. يتم إنشاء أسماء القنوات من .NickName
(اسم المجموعة) وقد يتغير اسم المجموعة. لا أعرف أي معرف ثابت لحساب/مجموعة لأن UserName
يتغير في كل جلسة جديدة.