Skip to content

Commit afea63c

Browse files
committed
1.4.4-dev.12: EWS: Aggressively unescape WeChat strings.
1 parent 1cea1f2 commit afea63c

File tree

6 files changed

+67
-36
lines changed

6 files changed

+67
-36
lines changed

README.md

+2-7
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,8 @@ _Codename_ **EH Forwarder Bot** (EFB) is an extensible chat tunnel framework whi
1919
## Media coverage
2020
* [Appinn: Send and Receive messages from WeChat on Telegram](http://www.appinn.com/eh-forwarder-bot/)
2121
_(EH Forwarder Bot – 在 Telegram 收发「微信」消息)_
22-
23-
## Glossary
24-
* **Channel**: A class that communicates with a chat platform, also known as a plugin.
25-
* **EFB**: abbreviation for EH Forwarder Bot, this project.
26-
* **Master channel**: A channel linked to the platform which directly interact with the user.
27-
* **Plugin**: See "channel".
28-
* **Slave channel**: A channel linked to the platform which is controlled by the user through EFB framework.
22+
* [Livc: Telegram — the true definition of IM](https://livc.io/177)
23+
_(Telegram——真正定义即时通讯)_
2924

3025
## Feel like contributing?
3126
Anyone is welcomed to raise an issue or submit a pull request, just remember to read through and understand the [contribution guideline](CONTRIBUTING.md) before you do so.

docs/ETM.md

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ At the beginning, messages from all senders will be sent to the user directly, t
7777
In a nutshell, ETM offers the following commands, you can also send it to BotFather for the command list.
7878

7979
```
80+
help - Show commands list.
8081
link - Link a remote chat to a group.
8182
unlink_all - Unlink all remote chats from a group.
8283
chat - Generate a chat head.

docs/index.md

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ _Codename_ **EH Forwarder Bot** (EFB) is an extensible chat tunnel framework whi
3030
## Media coverage
3131
* [Appinn: Send and Receive messages from WeChat on Telegram](http://www.appinn.com/eh-forwarder-bot/)
3232
_(EH Forwarder Bot – 在 Telegram 收发「微信」消息)_
33+
* [Livc: Telegram — the true definition of IM](https://livc.io/177)
34+
_(Telegram——真正定义即时通讯)_
3335

3436
## Glossary
3537
* **Channel**: A class that communicates with a chat platform, also known as a plugin.

docs/installation.md

+10-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ EFB framework itself does not require any external modules to operate. However,
33

44
To install dependencies for **all** officially maintained channels, you may follow the following instructions, or refer to the respective documentations of each channel.
55

6+
Firstly, clone this project and open it.
7+
8+
```bash
9+
git clone https://github.com/blueset/ehForwarderBot.git
10+
cd ehForwarderBot
11+
```
12+
613
## Storage directory
714

815
In order to process files and media (pictures, voices, videos, etc.), a storage folder is used to temporarily save and process them. Create a `storage` folder, if not existing, and give write and read permission to it.
@@ -30,7 +37,7 @@ For more information regarding installation of Pillow, please visit [Pillow docu
3037
Install [Homebrew](https://brew.sh), then:
3138

3239
```bash
33-
brew install libtiff libjpeg webp little-cms2
40+
brew install libjpeg webp python3
3441
brew install libmagic
3542
brew install ffmpeg --with-opus
3643
```
@@ -39,7 +46,7 @@ brew install ffmpeg --with-opus
3946

4047
```bash
4148
sudo apt-get install python3-dev python3-setuptools
42-
sudo apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev
49+
sudo apt-get install libwebp-dev
4350
sudo apt-get install libmagic-dev ffmpeg
4451
```
4552

@@ -49,7 +56,7 @@ Refer to `requirements.txt`, or [Channels Repository](channels-repository.md) fo
4956

5057
### To install
5158
```bash
52-
pip(3) install -r requirements.txt
59+
pip3 install -r requirements.txt
5360
```
5461

5562
> If you'd like to start to give EFB a try, you can now head to the [Getting started](getting-started.md) page.

main.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
if sys.version_info.major < 3:
1111
raise Exception("Python 3.x is required. Your version is %s." % sys.version)
1212

13-
__version__ = "1.4.4-dev.12"
13+
__version__ = "1.4.4-dev.13"
1414

1515
parser = argparse.ArgumentParser(description="EH Forwarder Bot is an extensible chat tunnel framework which allows "
1616
"users to contact people from other chat platforms, and ultimately "

plugins/eh_wechat_slave.py

+51-25
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ def wrap_func(self, msg, *args, **kwargs):
4141
logger.debug("Group chat")
4242
if me:
4343
msg['ActualUserName'] = msg['ToUserName']
44-
member = {"NickName": self.itchat.loginInfo['User']['NickName'], "DisplayName": "You",
44+
member = {"NickName": self._wechat_html_unescape(self.itchat.loginInfo['User']['NickName']),
45+
"DisplayName": "You",
4546
"Uin": self.itchat.loginInfo['User']['Uin']}
4647
else:
4748
logger.debug("search_user")
@@ -53,16 +54,16 @@ def wrap_func(self, msg, *args, **kwargs):
5354
'name': html.unescape(FromUser['NickName']),
5455
'alias': html.unescape(FromUser['RemarkName'] or FromUser['NickName']),
5556
'uid': self.get_uid(UserName=msg.get('FromUserName', None),
56-
NickName=html.unescape(FromUser.get('NickName', "s")),
57-
alias=html.unescape(FromUser.get('RemarkName', "s")),
57+
NickName=self._wechat_html_unescape(FromUser.get('NickName', "s")),
58+
alias=self._wechat_html_unescape(FromUser.get('RemarkName', "s")),
5859
Uin=FromUser.get('Uin', None))
5960
}
6061
mobj.member = {
61-
'name': html.unescape(member['NickName']),
62-
'alias': html.unescape(member['DisplayName']),
62+
'name': self._wechat_html_unescape(member['NickName']),
63+
'alias': self._wechat_html_unescape(member['DisplayName']),
6364
'uid': self.get_uid(UserName=msg.get('ActualUserName', None),
64-
NickName=html.unescape(member.get('NickName', "")),
65-
alias=html.unescape(member.get('DisplayName', "")),
65+
NickName=self._wechat_html_unescape(member.get('NickName', "")),
66+
alias=self._wechat_html_unescape(member.get('DisplayName', "")),
6667
Uin=member.get('Uin', None))
6768
}
6869
logger.debug("origin: %s\nmember: %s\n", mobj.origin, mobj.member)
@@ -72,16 +73,16 @@ def wrap_func(self, msg, *args, **kwargs):
7273
mobj.text = "You: " + mobj.text
7374
mobj.source = MsgSource.User
7475
mobj.origin = {
75-
'name': html.unescape(FromUser['NickName']),
76-
'alias': html.unescape(FromUser['RemarkName'] or FromUser['NickName']),
76+
'name': self._wechat_html_unescape(FromUser['NickName']),
77+
'alias': self._wechat_html_unescape(FromUser['RemarkName'] or FromUser['NickName']),
7778
'uid': self.get_uid(UserName=msg.get('FromUserName', None),
78-
NickName=html.unescape(FromUser.get('NickName', "")),
79-
alias=html.unescape(FromUser.get('RemarkName', "")),
79+
NickName=self._wechat_html_unescape(FromUser.get('NickName', "")),
80+
alias=self._wechat_html_unescape(FromUser.get('RemarkName', "")),
8081
Uin=FromUser.get('Uin', None))
8182
}
8283
mobj.destination = {
83-
'name': self.itchat.loginInfo['User']['NickName'],
84-
'alias': self.itchat.loginInfo['User']['NickName'],
84+
'name': self._wechat_html_unescape(self.itchat.loginInfo['User']['NickName']),
85+
'alias': self._wechat_html_unescape(self.itchat.loginInfo['User']['NickName']),
8586
'uid': self.get_uid(UserName=msg['ToUserName'])
8687
}
8788
logger.debug("dest: %s", mobj.destination)
@@ -329,34 +330,40 @@ def search_user(self, UserName=None, uid=None, uin=None, name=None, ActualUserNa
329330
"Uin": sys_chat_id}]
330331

331332
for i in self.itchat.get_friends(refresh) + self.itchat.get_mps(refresh):
332-
data = {"nickname": i.get('NickName', None),
333-
"alias": i.get("RemarkName", None),
333+
data = {"nickname": self._wechat_html_unescape(i.get('NickName', None)),
334+
"alias": self._wechat_html_unescape(i.get("RemarkName", None)),
334335
"uin": i.get("Uin", None)}
335336
if self.encode_uid(data) == uid or \
336337
str(i.get('UserName', '')) == UserName or \
337338
str(i.get('AttrStatus', '')) == uid or \
338339
str(i.get('Uin', '')) == uin or \
339340
str(i.get('NickName', '')) == name or \
340341
str(i.get('DisplayName', '')) == name:
342+
i['NickName'] = self._wechat_html_unescape(i.get('NickName', ''))
343+
i['DisplayName'] = self._wechat_html_unescape(i.get('DisplayName', ''))
341344
result.append(i.copy())
342345
for i in self.itchat.get_chatrooms(refresh):
343346
if not i['UserName'].startswith('@@'):
344347
continue
345348
if not i.get('MemberList', ''):
346349
i = self.itchat.update_chatroom(i.get('UserName', ''))
347-
data = {"nickname": i.get('NickName', None),
348-
"alias": i.get("RemarkName", None),
350+
data = {"nickname": self._wechat_html_unescape(i.get('NickName', None)),
351+
"alias": self._wechat_html_unescape(i.get("RemarkName", None)),
349352
"uin": i.get("Uin", None)}
350353
if self.encode_uid(data) == uid or \
351354
str(i.get('Uin', '')) == uin or \
352355
str(i.get('NickName', '')) == name or \
353356
str(i.get('DisplayName', '')) == name or \
354357
str(i.get('UserName', '')) == UserName:
358+
i['NickName'] = self._wechat_html_unescape(i.get('NickName', ''))
359+
i['DisplayName'] = self._wechat_html_unescape(i.get('DisplayName', ''))
355360
result.append(i.copy())
356361
result[-1]['MemberList'] = []
357362
if ActualUserName:
358363
for j in i['MemberList']:
359364
if str(j['UserName']) == ActualUserName:
365+
j['NickName'] = self._wechat_html_unescape(j.get('NickName', ''))
366+
j['DisplayName'] = self._wechat_html_unescape(j.get('DisplayName', ''))
360367
result[-1]['MemberList'].append(j)
361368
if not result and not refresh:
362369
return self.search_user(UserName, uid, uin, name, ActualUserName, refresh=True)
@@ -726,8 +733,8 @@ def get_chat_list(self, param=""):
726733

727734
msg = "List of chats:\n"
728735
for n, i in enumerate(l):
729-
alias = i.get('RemarkName', '') or i.get('DisplayName', '')
730-
name = i.get('NickName', '')
736+
alias = self._wechat_html_unescape(i.get('RemarkName', '') or i.get('DisplayName', ''))
737+
name = self._wechat_html_unescape(i.get('NickName', ''))
731738
x = "%s (%s)" % (alias, name) if alias else name
732739
msg += "\n%s: [%s] %s" % (n, x, i['Type'])
733740

@@ -857,9 +864,11 @@ def get_chats(self, group=True, user=True):
857864
r.append({
858865
'channel_name': self.channel_name,
859866
'channel_id': self.channel_id,
860-
'name': i['NickName'],
861-
'alias': i['RemarkName'] or i['NickName'],
862-
'uid': self.get_uid(UserName=i['UserName'], NickName=i['NickName'], alias=i.get("RemarkName", None),
867+
'name': self._wechat_html_unescape(i['NickName']),
868+
'alias': self._wechat_html_unescape(i['RemarkName'] or i['NickName']),
869+
'uid': self.get_uid(UserName=i['UserName'],
870+
NickName=self._wechat_html_unescape(i['NickName']),
871+
alias=self._wechat_html_unescape(i.get("RemarkName", None)),
863872
Uin=i.get("Uin", None)),
864873
'type': MsgSource.User
865874
})
@@ -871,9 +880,11 @@ def get_chats(self, group=True, user=True):
871880
r.append({
872881
'channel_name': self.channel_name,
873882
'channel_id': self.channel_id,
874-
'name': i['NickName'],
875-
'alias': i['RemarkName'] or i['NickName'] or None,
876-
'uid': self.get_uid(NickName=i['NickName'], alias=i.get("RemarkName", None),
883+
'name': self._wechat_html_unescape(i['NickName']),
884+
'alias': self._wechat_html_unescape(i['RemarkName'] or i['NickName']),
885+
'uid': self.get_uid(UserName=i['UserName'],
886+
NickName=self._wechat_html_unescape(i['NickName']),
887+
alias=self._wechat_html_unescape(i.get("RemarkName", None)),
877888
Uin=i.get("Uin", None)),
878889
'type': MsgSource.Group
879890
})
@@ -968,3 +979,18 @@ def _itchat_send_video(self, *args, **kwargs):
968979
return self.itchat.send_video(*args, **kwargs)
969980
except Exception as e:
970981
raise EFBMessageError(repr(e))
982+
983+
@staticmethod
984+
def _wechat_html_unescape(content):
985+
"""
986+
Unescape a WeChat HTML string.
987+
988+
Args:
989+
content (str): String to be formatted
990+
991+
Returns:
992+
str: Unescaped string.
993+
"""
994+
d = {"Content": content}
995+
itchat.utils.msg_formatter(d, "Content")
996+
return d['Content']

0 commit comments

Comments
 (0)